buildspec ファイルで複数ソース（アーティファクト）を扱う方法

## 背景・ユースケース
- CodePipeline で 2 つ以上のリポジトリやアーティファクト（例: SourceA, SourceB など）を取得し、それらをまとめてビルドしたい
- CloudFormation で CodePipeline + CodeBuild を定義する場合、「セカンダリソースをどう扱うか」「buildspec でどのようにパスを指定するか」が分かりにくい
- 本記事では、“CodePipeline の複数アーティファクト” を CodeBuild に渡して  
**$CODEBUILD_SRC_DIR_< artifactName >**  で参照する一連の手順を整理します

## 1.CloudFormation で CodePipeline に複数アーティファクトを設定

1. Pipeline の例
```
Resources:
  MyCodePipeline:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      ArtifactStore:
        Location: !Ref ArtifactStoreS3
        Type: S3
      Name: !Ref PipelineName
      RoleArn: !Ref PipelineServiceRole
      Stages:
        - Name: Source
          Actions:
            - Name: SourceA
              ActionTypeId:
                Category: Source
                Owner: AWS
                Provider: CodeCommit
                Version: 1
              OutputArtifacts:
                - Name: SourceArtifactA
              Configuration:
                RepositoryName: my-repo-a
                BranchName: main
              RunOrder: 1

            - Name: SourceB
              ActionTypeId:
                Category: Source
                Owner: AWS
                Provider: CodeCommit
                Version: 1
              OutputArtifacts:
                - Name: SourceArtifactB
              Configuration:
                RepositoryName: my-repo-b
                BranchName: dev
              RunOrder: 1

        - Name: Build
          Actions:
            - Name: BuildAction
              ActionTypeId:
                Category: Build
                Owner: AWS
                Provider: CodeBuild
                Version: 1
              Configuration:
                ProjectName: !Ref MyCodeBuildProject
                # PrimarySource は1つめのアーティファクトに紐づく(例: SourceArtifactA)
                PrimarySource: SourceArtifactA
              InputArtifacts:
                - Name: SourceArtifactA
                - Name: SourceArtifactB
              OutputArtifacts:
                - Name: BuildOutput
              RunOrder: 1

```

1. Sourceステージで 2 つの CodeCommit リポジトリ (my-repo-a, my-repo-b) を取得し、それぞれ SourceArtifactA, SourceArtifactB という名前で出力
2. Buildステージ では、InputArtifacts に SourceArtifactA と SourceArtifactB を指定し、CodeBuild に同時に渡す
3. PrimarySourceとしてSourceArtifactAを割り当てているので、CodeBuild側ではプライマリソースが＄CODEBUILD_SRC_DIRに展開され、セカンダリソース（SourceArtifactB）は＄CODEBUILD_SRC_DIR_SourceArtifactBに解凍される

## 2.CloudFormation で CodeBuild を設定
```
Resources:
  MyCodeBuildProject:
    Type: AWS::CodeBuild::Project
    Properties:
      Name: !Ref CodeBuildProjectName
      ServiceRole: !Ref CodeBuildServiceRole
      Artifacts:
        Type: CODEPIPELINE
      Environment:
        ComputeType: BUILD_GENERAL1_SMALL
        Image: aws/codebuild/standard:5.0
        Type: LINUX_CONTAINER
      Source:
        Type: CODEPIPELINE
        BuildSpec: buildspec.yml
```
- Type: CODEPIPELINE により、パイプラインが渡すアーティファクトをビルドに利用
- セカンダリソースをここでは定義せずとも、CodePipeline の Buildステージで InputArtifacts を複数指定すれば、CodeBuild の実行環境には複数アーティファクトが展開される

## 3. buildspec.yml で $CODEBUILD_SRC_DIR_<artifactName> を使う
```
version: 0.2

phases:
  build:
    commands:
      - echo "Primary Source is at: $CODEBUILD_SRC_DIR"
      - echo "Additional Source is at: $CODEBUILD_SRC_DIR_SourceArtifactB"
      - ls -R $CODEBUILD_SRC_DIR_SourceArtifactB
      # 例: Bアーティファクト内のソースをzip
      - cd $CODEBUILD_SRC_DIR_SourceArtifactB/some-subdir
      - zip -r ../../build-output.zip .
      - echo "Build or packaging steps completed"

artifacts:
  files:
    - "build-output.zip"
```
- ポイント
1. プライマリソース(例: SourceArtifactA) → $CODEBUILD_SRC_DIR
1. セカンダリソース(例: SourceArtifactB) → $CODEBUILD_SRC_DIR_SourceArtifactB
1. コマンド内で cd $CODEBUILD_SRC_DIR_SourceArtifactB とすれば、ソースBの中身を自由に操作できる
1. artifacts: セクションで build-output.zip などを指定すれば、CodeBuild は最終的に成果物をS3にアップロードし、後続ステージに受け渡せる

## 4. まとめ
- CloudFormation の CodePipeline 設定で 複数アーティファクト (InputArtifacts) を指定し、CodeBuild に同時に送る
- buildspec.yml では CODEBUILD_SRC_DIR_<artifactName> (例: $CODEBUILD_SRC_DIR_SourceArtifactB) を使えば、どこに解凍されたかを意識せずに参照できる
- プライマリソースは CODEBUILD_SRC_DIR、追加のソースは $CODEBUILD_SRC_DIR_<artifactName> の規則で展開される
- これにより、複数リポジトリをまとめてビルド・パッケージングするフローをシンプルに実装可能

この仕組みを使えば、1つの CodeBuild プロジェクトで複数ソースを組み合わせたビルドやデプロイ前準備がスムーズに行えます。