この記事について
ECS Fargate上でLaravelのアプリケーションを実行しています。CI/CDとしてCodePipeline/CodeDeploy/CodeBuild/CodeCommitを利用してパイプラインを実装しています。
実際にパイプラインが実行されたところ、CodeDeployによるDeployステージにて以下エラーが発生してパイプラインが失敗しました。
The deployment failed because the AppSpec file that specifies the deployment configuration is missing or has an invalid configuration. Could not parse or validate one of the resources in the app-spec.
このエラーを解決した際の記録をこのメモに残します。
構成
今回エラーが起きた際の簡単な構成を以下に記載します。
- ECS Fargate
- 稼働するコンテナ
- Laravelコンテナ
- NGINXコンテナ
- 稼働するコンテナ
- パイプライン
- Sourceステージ
- CodeCommit
- 該当ブランチへのPUSHによりパイプラインを発火
- Buildステージ
- CodeBuild
- コンテナイメージのビルドとECRへのPUSHを実施
- Deployステージ
- CodeDeploy
- Blue/GreenデプロイメントによりECSタスクを更新
- Sourceステージ
- IaC
- 上記一連のリソースはTerraformを構成管理
エラーについて
パイプライン内のDeployステージが失敗しているので、詳細を確認したところ、以下エラーが表示されていました。
The deployment failed because the AppSpec file that specifies the deployment configuration is missing or has an invalid configuration. Could not parse or validate one of the resources in the app-spec.
appspecファイルが見つからない、もしくは設定に誤りがあるという旨のエラーです。
リビジョンを確認したところ、CodeCommitのレポジトリ内に配置したappspec.ymlファイルは正しく読み込まれており、シンタックスに誤りはなさそうでした。
流石にこのエラー文言のみでは、デバッグや調査がキツイので、他になにか情報が出力されていないかを確認しました。しかし、結局有益な出力はありませんでした。
掴みどころがない状況で、泥臭くECSとCI/CDパイプラインの設定を一つ一つ見直していきました。
原因
ECSのデプロイタイプの誤りが原因でした。
これがローリングアップデート(デプロイメントコントローラー : ECS)になっていました。
これをBlue/Green(デプロイメントコントローラ : CodeDeploy)に修正したところ、エラーが解消されてパイプラインが正常に実行されました。
最後に
この一件で、CodeDeployにはログ機能などが具備されておらず、エラーした際のデバッグが難しいということがよくわかりました。
そして、今回のエラー内容から直接的に原因を特定するのは無理だと思います。
もし、同じ事象を踏んでしまった方はぜひ参考にしていただけると幸いです。