エラー内容
AWS Codebuildを利用してビルドを行ったら以下のエラーになりました。
[Container] 2023/10/19 02:18:10 Waiting for agent ping
[Container] 2023/10/19 02:18:11 Waiting for DOWNLOAD_SOURCE
[Container] 2023/10/19 02:18:12 Phase is DOWNLOAD_SOURCE
[Container] 2023/10/19 02:18:12 CODEBUILD_SRC_DIR=/codebuild/output/src1489528821/src
[Container] 2023/10/19 02:18:12 Phase complete: DOWNLOAD_SOURCE State: FAILED
[Container] 2023/10/19 02:18:12 Phase context status code: YAML_FILE_ERROR Message: YAML file does not exist
原因と解決方法
エラーメッセージは、DOWNLOAD_SOURCE
フェーズでYAML
ファイルが見つからない、と言っています。
ビルドプロジェクトのソースコードをダウンロードする際に、指定されたYAMLファイル
が存在しないためエラーになったのです。
CodeBuildで設定していたYAML
ファイルはデフォルトのままbuildspec.yaml
でした。
buildspec.yamlファイル
とは、CodeBuildでビルドプロジェクトを実行する際に使用されるビルドスクリプトの設定ファイルのこと。
今回は、このファイルが存在しない状態でビルドしていたため、エラーが発生しました。
(作るのを忘れていました...)
設定箇所は、具体的には以下になります。
CodeBuild -> ビルドプロジェクト -> 編集 -> Buildspec
親切に説明も記載されています。
CodeBuild のデフォルトでは、buildspec.yml という名前のファイルがソースコードルートディレクトリで検索されます。buildspec ファイルに別の名前または場所を使用している場合は、ここにソースルートからのパス (buildspec-two.yml や configuration/buildspec.yml など) を入力します。
デフォルトから編集していないので、ソースリポジトリのプロジェクトルート直下にpushしてあげると解決します。
ちなみに、buildspec.yaml
は以下のような形式で作成します。
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws --version
- aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
build:
commands:
- echo Build started on `date`
- echo Logging in to Docker Hub...
- docker --version
- docker login -u $USER_DOCKER -p $DOCKER_KEY
- echo Building the Docker image...
- docker build -t $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$REPOSITORY:latest .
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker images...
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$REPOSITORY:latest
- echo Writing image definitions file...
- printf '{"name:"XXXXX","imageURI":"%s"}' $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$REPOSITORY:latest > imageDetail.json
- cat imageDetail.json
artifacts:
files:
- imageDetail.json
discard-paths: yes
$AWS_DEFAULT_REGION
や$AWS_ACCOUNT_ID
は環境変数で、AWS Codepipelineのビルドステージで設定することができます。ビルドが開始される前にビルド環境に読み込まれるものなので、AWSの各種リソースにアクセスするための認証情報、Dockerレジストリにログインする際に必要な情報などを設定します。buildspec.yaml
に直接書いても良いですが、セキュリティ上の理由から実際の値は書かずに環境変数としてAWS側(他にもSecret ManagerやParameter Store等)で持たせることが多いと思います。