😎

CDK で ECS のタスク定義を作成するときに過去のリビジョンを INACTIVE にしない方法

2024/01/08に公開

背景

CDK でタスク定義を作成すると最新のリビジョンのみ ACTIVE になり、過去のリビジョンがすべて INACTIVE になってしまい、ECS サービスを過去のタスク定義に戻すことができませんでした。

通常、バグが発生しデプロイしたコードをロールバックしたいときは、リバートブランチをデプロイすることでアプリケーションをロールバックすると思います。

しかし、重大なバグが発生し一刻も早くロールバックしたいときはデプロイフローを経ずに ECS サービスのリビジョンを戻すのが最も早いため、念の為過去のリビジョンを INACTIVE にしたくありませんでした。

そこで CDK で ECS のタスク定義を作成するときに過去のリビジョンを INACTIVE にしない方法を調べました。

やり方

タスク定義に RemovalPolicy.RETAIN を設定すれば過去のリビジョンは INACTIVE になりません。
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.RemovalPolicy.html

import { RemovalPolicy } from 'aws-cdk-lib';
import * as ecs from 'aws-cdk-lib/aws-ecs';

const taskDefinition = new ecs.Ec2TaskDefinition(this, 'TaskDef');

taskDefinition.addContainer('DefaultContainer', {
  image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample"),
  memoryLimitMiB: 512,
});

// こちら
taskDefinition.applyRemovalPolicy(RemovalPolicy.RETAIN)

タスク定義のデフォルトの RemovalPolicy は DESTROY のため、それを RETAIN に変更するコードとなります。

ただ RemovalPolicy.RETAIN を設定するとスタックを削除したり、スタックからタスク定義のリソースを削除しても、タスク定義は削除されず残ってしまいます。

削除されず残ったものと同じファミリー名でタスク定義を作成してもエラーにならず、そのタスク定義がスタックで使われるため、大きな問題は出ないと思いますが、不要なタスク定義が残ってしまうのは気になりますね。

Discussion