概要
- AWSでCodeDeployを走らせたら以下のエラーになりました。
- 本記事では以下のエラー対応について記載します。
Invalid action configuration: Exception while trying to read the task definition artifact file
原因の追求
- AWSの公式ドキュメントでは以下の通り
The maximum artifact ZIP size in the CodeDeployToECS deploy action is 3 MB.
- 上記ドキュメントには「CodeDeployToECSのデプロイアクションでの最大アーティファクトZIPサイズは3MB」とあり、圧縮ファイルが3MB未満ではない場合は上述のエラーメッセージが表示されるらしいです。
- あれ、そんな重いファイルあったかな...と思いソースを確認してみる。すると先日自動テスト用に40MBのSQLファイルを追加していたことを思い出す。お、こやつが原因か?
- ビルド・デプロイを設定しているCodePipelineを確認しておく。ビルド・デプロイはGithubウェブフックによってGitリポジトリから該当ブランチにマージがあったら自動で走るようにしてあります。ただし、パイプラインの中で、Codebuildによって入力アーティファクトにSourceArtifactを選択しており、これはCloudFormationによってS3にZip形式で保存されるようにしてあります。
- SourceArtifactの保存先はどこで確認できるのか...というのは以下の記事に整理したのでご参考ください
- 【AWS】アーティファクトストアはどこで確認・変更するのか(CodeBuildプロジェクトがCodePipelineと統合されている場合)
- デプロイ方法としては、ブルーグリーンデプロイメントのフローを採用しています。SourceArtifactをCodeBuildでビルドしてS3に保存し、CodeDeployがそのS3のSourceArtifactを使用してデプロイを実行するという手法です。CodeDeployはSourceArtifactをS3から取得し、デプロイメントグループに指定されたリソース(EC2インスタンス、Amazon ECSタスクなど)にデプロイします。
解決手順
- ということで、今回引っかかった「最大アーティファクトZIPサイズは3MB」は、上記手順の
CodeDeployがそのS3のSourceArtifactを使用してデプロイを実行
- で該当してしまったと考えられます。SourceArtifactは、S3に保存されているので、確認してみると、3.9MBになっていました。ちなみに今までのS3オブジェクトに保存されているSourceArtifactのZIPはどれも160KBとかで軽いものだったのに対し、今回だけ3MBを超えていることがわかりました。
- 該当ファイルを削除してpushし直すと、無事にデプロイまで成功しました。
- エラーメッセージをあらためて確認すると「CodeDeployToECSのデプロイアクション」「SourceArtifact」とあるので、間違いなさそうですね。このアクションで指定されているアーティファクトのZIPファイルが、3MBを超えていたため、上述のエラーで失敗してしまったのでしょう。
3MB以上を出力したい場合...
- 今回は削除という手法で解決しましたが、3MBを超えるソースコードをデプロイしたい場合は、以下の記事が参考になりそうです。BuildArtifactで
appspec.yml
とtaskdef.json
を出力するようにして、デプロイ時にこのBuildArtifactを指定してあげる、という方法です。