CODE DEPLOY で appspec をうまく書けずに試行錯誤していた。
設定
CodePiplineのDeployステージのアクション設定でプロバイダを AWS ECS(ブルー/グリーン)にしている前提
デプロイ実行時のエラー
CodeBuildの「デプロイID」のページに表示されたエラー。こんなやつ。
appspecファイルが見つからない
An AppSpec file is required, but could not be found in the revision
レポジトリのトップに appspec.yml を置いてあるのにないと言われる
解決
buildspec.yml の artifacts に appspecファイルを指定すると解決した
artifacts:
files:
- appspec.yml
「Deploy ステージの 入力アーティファクトを Build にしている場合は
Deployステージで 利用するファイルを artifacts で指定しておかなければいけない」と理解した (たぶん)
設定値のエラー? (ではなかった)
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.
最小限の項目を指定しているはずがエラーが発生した。
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: <TASK_DEFINITION>
LoadBalancerInfo:
ContainerName: "container-name"
ContainerPort: 8080
TASK_DEFINITION のプレースホルダの問題ではなさそう。
エラーで終了したデプロイIDのページで
リビジョンの詳細 > アプリの仕様 を見ると <TASK_DEFINITION>
が新しいタスク定義のARNに展開されているのが分かった。
後述するがYAMLの構文エラーや必須項目不足でもなさそう。
(その場合はそれぞれ別エラーが発生するので)
解決
ECS側のデプロイモードをCODE BUILD経由 ではなく ECSへの直接デプロイ(ローリングアップデート)にしてしまっていた。
作業途中で状態を切り替えていたまま忘れていたようだ。
ここでかなりハマったがようやくblue/greenデプロイが起動するようになった。
YAML構文のエラー
The deployment failed because the AppSpec file that specifies the deployment configuration is missing or has an invalid configuration.
Failed to parse your appspec file. Please validate your appspec format and try again later.
YAML構文エラーのファイルを利用したところこのエラーが生じた
XXX: YYY:
テンプレートがパースできない
The deployment failed because the AppSpec file that specifies the deployment configuration is missing or has an invalid configuration.
The input AppSpec file is a not well-formed yaml. The template cannot be parsed.
項目の足りないYAMLを試してみたところこのエラーが生じた。
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
デプロイ実行前のエラー
CodePipelineのDeployステージに表示されるエラー
そもそもデプロイが実行されないパターン
taskdef.json / appspec.yaml の記述に誤りがある場合などにエラーが発生していたようだ
こんなやつ
例1
Exception while trying to read the AppSec artifact file from: Build.
存在しないファイルを appspec として指定した時にこのエラーが発生した
例
Tags can not be empty.
taskdef.json のタグ指定を空で書いていたら
"tags": []
例
試しに taskdef.json を変えてみると
"tags": ["XXX"]
Expected null
何…?
そもそもtagsのプロパティを消してしまうことで対応した
例
taskdef.json のプレースホルダを解釈してくれない
Container.image contains invalid characters.
"containerDefinitions": [
{
"image": "<IMAGE1_NAME>",
いったんプレースホルダをやめてECRイメージを直接指定することで対応した
"containerDefinitions": [
{
"image": "**********.dkr.ecr.***********.amazonaws.com/**********:***",
だがこれも上に書いたのと同じでECSのデプロイモードを間違えていたせいだったかもしれない
(デプロイモード変更後はエラーが起こらなくなった)
例
以前に terraform apply で ECSサービスに紐づくタスク定義を更新しようとした時にこのエラーが起きたが CodeDeploy での実行時にも同じエラーが起きた。
Unable to update task definition on services with a CODE_DEPLOY deployment controller. Use AWS CodeDeploy to trigger a new deployment.
NOTE
- Codepipeline のトライ&エラーは1回あたり普通で10分とかかかる。途中から build ステージでは軽量な docker イメージをビルドするように差し替えて試した。 ( てきとうに alpine で )
後から気づいたがCodePipelineを通さずにCodeBuild単体でデプロイを実行できるモードもあるようなのでこれを活用にしても良いかも知れない。 appspec も直接エディタでコード内容を指定できるみたいだ。
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。