この記事について

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.

https://docs.aws.amazon.com/codepipeline/latest/userguide/troubleshooting.html#troubleshooting-ecstocodedeploy-size

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.

となっていたのは、少し混乱してしまいました。

この記事がどなたかの参考になれば幸いです。
では。