概要
AWS CodeBuildを使ってソースコードのビルドをして、ECRにプッシュしようとしたときにハマったのでメモ。
確認ポイント
- ECRへアクセスする権限が付与されているか
- S3へアクセスする権限が付与されているか
- buildspec.ymlのフォーマットは正しいか
ymlファイルのパースに失敗すると、DOWNLOAD_SOURCEフェーズで失敗します。
YAML_FILE_ERROR Message: did not find expected key at line 41
とエラーログが出ていたのでbuildspec.ymlの42行目を見たところインデントのずれがありました。。。
[Container] 2018/03/21 03:41:52 Waiting for agent ping
[Container] 2018/03/21 03:41:52 Waiting for DOWNLOAD_SOURCE
[Container] 2018/03/21 03:42:04 Phase is DOWNLOAD_SOURCE
[Container] 2018/03/21 03:42:05 CODEBUILD_SRC_DIR=/codebuild/output/src586790933/src
[Container] 2018/03/21 03:42:05 YAML location is /codebuild/output/src586790933/src/buildspec.yml
[Container] 2018/03/21 03:42:05 Phase complete: DOWNLOAD_SOURCE Success: false
[Container] 2018/03/21 03:42:05 Phase context status code: YAML_FILE_ERROR Message: did not find expected key at line 41
- 環境変数は正しいか
buildspec.ymlもIAMの設定も完璧なはずなのに、なぜかビルドが失敗する。
しかも、CodebuildのBUILDフェーズのしかもdocker tag
コマンド実行時に失敗するという状況が発生したとき。
環境変数を見直したら解消されました。
[Container] 2018/03/21 04:39:31 Running command echo Tagging the Docker image...
Tagging the Docker image...
[Container] 2018/03/21 04:39:31 Running command docker tag demo:latest $REPOSITORY_URI:latest
"docker tag" requires exactly 2 arguments.
See 'docker tag --help'.
Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
[Container] 2018/03/21 04:39:31 Command did not exit successfully docker tag demo:latest $REPOSITORY_URI:latest exit status 1
[Container] 2018/03/21 04:39:31 Phase complete: BUILD Success: false
[Container] 2018/03/21 04:39:31 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: docker tag demo:latest $REPOSITORY_URI:latest. Reason: exit status 1
原因は、buildspec.ymlで定義していた変数($REPOSITORY_URI)内に半角スペースが紛れ込んでいたことでした。
buildspec.yml
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
- REPOSITORY_URI_SERVER=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_NAME}
(中略)
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker-compose build
- echo Tagging the Docker image...
- docker tag demo:latest $REPOSITORY_URI:latest
しかも、その半角スペースはCodeBuildの環境変数設定時に混入していました。
とほほ。。。