ECSの環境変数をCDKで変更したいあなたへ!
2024-12-12
azblob://2024/12/13/eyecatch/2024-12-15-cdk-for-ecs-task-definition-000.jpg

はじめに

こちらの記事はFIXER Rookies Advent Calendar 2024 - Adventarの記事になります。

業務でIaCを用いてECSの環境を構築、運用する機会があり、環境変数の変更をCDKで管理する上で注意が必要であった点についてまとめます。

以下のエラーと出会った方におすすめです。

TypeScriptThe following resource(s) failed to update: [ECSService]
Update requires replacement of resource ECSService

前提

本記事は以下の知識をお持ちの方を対象としています。
 
  1. Amazon ECSに関する知識
    • ECSの基本的なアーキテクチャを理解している
    • タスク定義、サービス、クラスターの概念を理解している
    • ECSサービスのデプロイメントプロセスを理解している
  2. AWS CDKに関する知識
    • CDKの基本的な構文を理解している
    • Stackの作成と更新の基本を理解している
    • 「cdk deploy」、「cdk diff」などの基本的なCDKコマンドを理解している

CDKでECS環境変数を管理する上でのポイント

以下に自分なりのポイントをまとめました。

  1. サービスとECSのタスク定義を作成するスタックは分ける
  2. サービスを更新する方法を検討する
  3. 既にECSのスタックをデプロイしているときはタスク定義更新スタックを作成する

各項目の詳細について記載します。

1. ECSサービスとECSのタスク定義を作成するスタックは分ける

サービスには変更不可能な属性が多く、サービスの更新をCDKで行うことは推奨されていません。
そのため、サービスの更新を行うには他の方法で行う必要があります。一方、タスク定義は更新可能であるため、スタックを分けることが好ましいです。

2. ECSサービスを更新する方法を検討する

ポイント1 でも述べましたが、サービスの更新はCDK以外の方法で行う必要があります。

方法については以下から選択できます。

  1. AWS Management Console
  2. AWS CLI
  3. AWS SDK

自分はパイプラインを用いてAWSCLIで更新を行いました。

3. 既にECSのスタックをデプロイしているときはタスク定義更新スタックを作成する

サービスとタスク定義のスタックを分けずにデプロイしてしまって、既に安易に消せない状況の場合はタスク定義の更新だけを行うスタックを作成しましょう。その場合は既存ECSスタックのConstructから、依存情報を取得することで既存タスク定義の削除や意図しない新規タスク定義の作成を防ぐことができます。

TypeScript// 例
const rootConstruct = new Construct(this, 'ECSStack');
...
const TaskDefinition = new ecs.Ec2TaskDefinition(
      rootConstruct,
      ...
);

まとめ

ECSをCDKで管理する上で、サービスとタスク定義はスタックを分けると特に詰まることはないと思います。

最後に

初めて技術系のブログに挑戦しました!

誰かの役に立ってくれることを願っております~