インフラ

リポジトリにタスク定義ファイルを含めずにGitHub ActionsでECSにデプロイ方法

こんにちは、ちゃりおです。

CDKでECS関連のリソースを作って、Github Actionsでデプロイしていました。
Github Actionsでデプロイするために、リポジトリにタスク定義をファイル保存していました。
そのため、タスク定義がファイルとCDKで2重管理する状態になっていました。

2重管理の問題点と、対策について書きます。

結論から書くと、READMEにある「Download task definition」を追加するだけです。

- name: Download task definition
  run: |
       aws ecs describe-task-definition --task-definition my-task-definition-family --query taskDefinition > task-definition.json

タスク定義の2重管理を解消する

構築・デプロイはこんな感じでやっていました。

  • 初期構築: CDKでECS関連リソースを作成(タスク定義、サービス)
  • デプロイ: Github Actionsを使用してECSにデプロイ(この際のタスク定義はgithub上にあるものを使用する)
    • Workflowファイルの内容は、公式とほぼ同様

2重管理の問題点

以下のような問題が発生していました。

  • CDKでタスク定義を修正すると、ファイルにあるタスク定義関係なくAWS上で新しいリビジョンが作られてデプロイされる
    • タスク定義の修正はCDK、ファイルどちらも修正する必要がある
  • 環境ごとにタスク定義ファイルを作成してリポジトリに含める必要がある(本番、STGなど)
  • ECSを再作成した際にリポジトリ上のタスク定義を手動で修正する必要がある(CDKの作り方にもよるが)

特に怖いのが1つ目です。
CDKの修正で意図しない状態のタスク定義がデプロイされる可能性があります。

対策

「amazon-ecs-deploy-task-definition」のREADMEに手順ありました。
「Download task definition」を追加するだけです。

- name: Download task definition
  run: |
       aws ecs describe-task-definition --task-definition my-task-definition-family --query taskDefinition > task-definition.json

これで実行時にタスク定義をダウンロードするので、他のアクションでダウンロードしたタスク定義を指定すればいいだけです。

コマンドで取得したタスク定義で、awscliから「register-task-definition」をしようとするとrevisionやstatus、registeredAtなど不要なフィールドがあってエラーになりますが
上記のアクションではWarningはでますが、問題なく実行することができます。
よしなにやってくれているみたいですね。

まとめ

2重管理問題悩んでいましたが、README読んだら書いてました。
タスク定義もIaCで管理することで、事故を防げたらいいなと思います。

Amzonで「AWS」の本を見てみる

楽天で「AWS」の本をみてみる!!

cdk
CDK ecs-service-extensionsを使用してお手軽にAppMeshを有効化したECSサービスを作成するこんにちは、ちゃりおです。 最近AWS CDKのAmazon ECS拡張機能(ecs-service-extensions)を使ってみ...
ECS
AWS CDKでECS Fargateに必要なVPCエンドポイントを作成するこんにちは、ちゃりおです。 ECSのデプロイ時のPullはNATGWを通すと通信量が高額になることがあると思います。 VPCエンドポイ...
CDK Codepipline
CDK + CodepipelineでEC2へのシンプルなデプロイフローを作るこんにちは、ちゃりおです。 最近、CDKでEC2にデプロイするCodepipeline作りました。 初めてCDKでCodeシリーズを...