0
0

【AWS】invalid JSON formatエラーの解決方法。imagedefinitions.jsonとimageDetail.jsonの違いとは

Posted at

概要

buildspec.yamlの記述の仕方が問題でAWS CodeDeployにて以下のエラーになりました。

最新のアクション実行メッセージ
The image definition file imagedefinitions.json contains invalid JSON format

image.png

上記エラーを解決できたので紹介します。

BEFORE

buildspec.yaml
## 略
  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

buildspec.yaml
## 略
  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.jsonimageDetail.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.jsonimageDetail.jsonとでは記述の仕方が違う...!

そうなんか...今まで気にしたことがなかった。

imageUriImageURIとか、細かな表記方法も異なるようです)

補足:printfコマンド

printfコマンドは、指定された形式に従って文字列を生成するコマンド。

上記の場合、形式は'[{"name":"%s","imageUri":"%s"}]'となっており、%sは文字列を表すプレースホルダーを意味しています。

そして、形式の中のプレースホルダーを次に指定された引数で置き換えます。この場合、最初の%s$REPOSITORYで、2つ目の%s$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$REPOSITORY:latestで置き換えられる、と言うわけです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0