概要
buildspec.yaml
の記述の仕方が問題でAWS CodeDeployにて以下のエラーになりました。
最新のアクション実行メッセージ
The image definition file imagedefinitions.json contains invalid JSON format
上記エラーを解決できたので紹介します。
BEFORE
## 略
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker image...
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$REPOSITORY:latest
- echo Writing image definitions file...
- cd ../
- printf "{\"name\":\"%s\",\"imageUri\":\"%s\"}" $REPOSITORY $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$REPOSITORY:latest > imagedefinitions.json
- ls -al
- cat imagedefinitions.json
artifacts:
files:
- 'imagedefinitions.json'
discard-paths: yes
AFTER
## 略
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker image...
- docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$REPOSITORY:latest
- echo Writing image definitions file...
- cd ../
- printf '[{"name":"%s","imageUri":"%s"}]' $REPOSITORY $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$REPOSITORY:latest > imagedefinitions.json
- ls -al
- cat imagedefinitions.json
artifacts:
files:
- 'imagedefinitions.json'
discard-paths: yes
変更点は、以下です。
- printf '[{"name":"%s","imageUri":"%s"}]' $REPOSITORY $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$REPOSITORY:latest > imagedefinitions.json
imagedefinitions.json
を配列形式にしたらエラーが解消されました。
元のコードではただの単一のオブジェクトであり、配列ではなかったため、エラーになっていたのです。
imagedefinitions.json
とimageDetail.json
の違いとは?
そもそもなぜ自分がJSON形式のオブジェクトで書いていたかというと、ECS Blue/Green デプロイアクション用の imageDetail.json
ファイルでは、[]
で囲ってあげていた記憶がなかったからです。
BG用の場合は、配列の中に入れてあげなくても正常にDodedeployが走ります。
と言うことで、公式ドキュメントを見てみます。
Amazon ECS 標準デプロイでは、デプロイアクションへの入力で imagedefinitions.json ファイルが必要です。
Amazon ECS Blue/Green デプロイでは、デプロイアクションへの入力で imageDetail.json ファイルが必要です。
// imagedefinitions.json
[
{
"name": "sample-app",
"imageUri": "11111EXAMPLE.dkr.ecr.us-west-2.amazonaws.com/ecs-repo:latest"
}
]
// imageDetail.json
{
"ImageURI": "ACCOUNTID.dkr.ecr.us-west-2.amazonaws.com/dk-image-repo@sha256:example3"
}
なぬ!
imagedefinitions.json
とimageDetail.json
とでは記述の仕方が違う...!
そうなんか...今まで気にしたことがなかった。
(imageUri
とImageURI
とか、細かな表記方法も異なるようです)
補足:printf
コマンド
printf
コマンドは、指定された形式に従って文字列を生成するコマンド。
上記の場合、形式は'[{"name":"%s","imageUri":"%s"}]'
となっており、%s
は文字列を表すプレースホルダーを意味しています。
そして、形式の中のプレースホルダーを次に指定された引数で置き換えます。この場合、最初の%s
は$REPOSITORY
で、2つ目の%s
は$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$REPOSITORY:latest
で置き換えられる、と言うわけです。