この記事について
CodePipelineにてECSのCI/CDパイプラインを実装しています。
ある時、パイプラインの実行が失敗しました。
エラー内容をみると「Action configuration is missing ‘Image3ContainerName’ configuration.」と表示されていました。
このエラーについての説明と原因、また解決方法についてこの記事にまとめます。
パイプラインの構成
CodePipelineの構成について簡単に記載します。
- パイプラインの対象
- ECS (Fargate)
- タスク内で稼働するコンテナはNGINXコンテナとPHP-FPM(Laravel)コンテナ
- パイプラインの構成
- Sourceステージ : CodeCommit
- Buildステージ : CodeBuild (コンテナイメージのビルドとECRへのPUSHを実行)
- Deployステージ : CodeDeploy (デプロイ方式はBlue/Greenデプロイメント)
エラーについて
パイプラインの初期構築を行なってから、1ヶ月ほど運用している中であるエラーが発生してパイプラインの実行が失敗しました。
そのエラーとは
Action configuration is missing ‘Image3ContainerName’ configuration.
と言う内容でした。
Image3ContainerNameと表示されていますが、ECSタスク内のコンテナは2つしかありません。そのためImage3Containerというものは存在しません。
この存在しないコンテナの設定がないというエラー内容です。
改めてCodePipelineの中のでデプロイ設定をみると、Image3ContainerNameなどありません。
(client-webがNGINXコンテナで、client-appがPHP-FPMコンテナです)
では、なぜ今まで成功していたパイプラインが失敗し、存在しないはずのコンテナが失敗理由となったのでしょうか?
エラーの原因と解決方法
結論から言うとパイプラインのDeployステージの入力アーティファクトに誤りがあった
ことが原因です。
公式ドキュメントを見ると、
The task definition file is a required artifact for the CodePipeline deploy action to Amazon ECS through CodeDeploy (the CodeDeployToECS action). The maximum artifact ZIP size in the CodeDeployToECS deploy action is 3 MB. The following error message is returned when the file is not found or the artifact size exceeds 3 MB:
Exception while trying to read the task definition artifact file from:
Possible fixes: Make sure the task definition file is included as an artifact. If the file already exists, makes sure the compressed size is less than 3 MB.
Blue/Greenデプロイメント(CodeDeployToECSはBlue/Greenデプロイメントを指します)を利用する場合、デプロイステージの各入力アーティファクトのサイズはZIP圧縮された後、3MB以下になっていなくてはならない
と記載されています。
パイプライン失敗時に入力アーティファクトとして利用されたZIPファイルと確認すると、SourceArtifactというアーティファクトが3MB以上になっていました。
このSourceArtifactはSourceステージの出力アーティファクトです。つまりSourceArtifactはCodeCommitレポジトリの内容がまるまるコピーされたアーティファクトです。
そもそもこのSourceArtifactはDeployステージに不要です。不要にも関わらず、Deployステージの入力アーティファクトとして指定され続けていました。
それでもSourceArtifactがZIP圧縮されて3MB以下である時はエラーは発生しませんでした。しかし開発によりレポジトリの容量が増え続ける中で、とうとうこのSourceArtifactが3MBを超過しました。
それにより今回のエラーが発生したというわけです。
Deployステージの入力アーティファクトからSourceArtifactを削除したところ、問題なくパイプラインが実行されるようになりました。
最後に
結果としてパイプラインの設定に誤りがあったことで生じたエラーでした。
原因は「制限容量以上のアーティファクトがある」なのに、エラー内容が
Action configuration is missing ‘Image3ContainerName’ configuration.
となっていたのは、少し混乱してしまいました。
この記事がどなたかの参考になれば幸いです。
では。