インフラ

CDKでECSデプロイメントサーキットブレイカーの有効化時のサービス置き換えを回避する

cdk

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

CDKを使ってECSを運用しています。
運用中のECSサービスのデプロイメントサーキットブレイカーを有効化してみました。

しかし、L2 Constructで普通にやるとECSのサービス置き換えが発生してしまいました。(CDK 1.118.0時点)
稼働中のECSサービスが置き換えられてしまうのは、好ましくありません。

Issueが上がっていて、そのうち解消されると思うのですがL1 Constructで回避する方法についてです。

Contents

CDKのL2 ConstructでECSサーキットブレイカーの有効化時サービス置き換えが発生する事象をEscape hatchesで回避する

結論

こんな感じで、「DeploymentCircuitBreaker.Enable」と「DeploymentCircuitBreaker.Rollback」だけをtrueにします。 

const cfnFargate = fargate.node.defaultChild as ecs.CfnService
cfnFargate.addOverride(
"Properties.DeploymentConfiguration.DeploymentCircuitBreaker.Enable",
"true"
)
cfnFargate.addOverride(
"Properties.DeploymentConfiguration.DeploymentCircuitBreaker.Rollback",
"true"
)

L2 Constructを使うとDeploymentControllerが明示的に指定されてしまう

Issueにある通りですが、以下のように作成したECSサービスがあるとします。

new FargateService(this, "Service", {
  cluster: cluster,
  taskDefinition: taskDefinition
})

上記の状態でデプロイしたあとに、circuitBreakerの行を追加します。

new FargateService(this, "Service", {
  cluster: cluster,
  taskDefinition: taskDefinition
  # 以下を追加
  circuitBreaker: { enabled: true, rollback: true }
})

その後、cdk diffを実行すると、「ECS::Service」に「replace」の表示がありサービスの置き換えが発生することがわかります。

Resources
[~] AWS::ECS::Service fargate/Service fargateService750AF719 replace
 ├─ [~] DeploymentConfiguration
 │   └─ [+] Added: .DeploymentCircuitBreaker
 └─ [+] DeploymentController (requires replacement)
     └─ {"Type":"ECS"}

サービスの置き換えが発生する原因は、「DeploymentController」の変更が発生するからです。
(Cfnのドキュメントから上記のプロパティは更新時にリプレースが必要なことがわかります。)

このプロパティは明示的に指定していない状態だと、デフォルト値である「ECS」が設定されます。
そのため、上記の変更でECSが設定されますが、ECSの実際の設定自体は変わりません。

Escape hatchesでサービスの置き換えを回避する

「DeploymentController」を変更せず「DeploymentConfiguration」だけ変更するために、Escape hatchesを使用します。

new FargateService(this, "Service", {
  cluster: cluster,
  taskDefinition: taskDefinition
//  circuitBreaker: { enabled: true, rollback: true }
const cfnFargate = fargate.node.defaultChild as ecs.CfnService
  cfnFargate.addOverride(
   "Properties.DeploymentConfiguration.DeploymentCircuitBreaker.Enable",
    "true"
  )
  cfnFargate.addOverride(
   "Properties.DeploymentConfiguration.DeploymentCircuitBreaker.Rollback",
   "true"
  )
})

変更後、cdk diffを実行するとリプレースが発生しないことがわかります。

Resources
[~] AWS::ECS::Service fargate/Service fargateService750AF719 
 └─ [~] DeploymentConfiguration
     └─ [+] Added: .DeploymentCircuitBreaker

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

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

ECR
CDKで作成したECRをスタック削除時に同時に削除されるようにするこんにちは、ちゃりおです。 デフォルトではCDKでECRを作成して、「cdk destroy」で削除したときにECRのリポジトリが残り...
GithubActionsでECSデプロイ コンテナビルドを並行処理するこんにちは、ちゃりおです。 ECSデプロイにGithubActionsを使用しています。 コンテナビルドに時間がかかるコンテナが複数あ...
cdk
AWS CDKのADVANCED WORKSHOPやってみたこんにちは、ちゃりおです。 CDK Pipelineをざっくり試したいと思っていて、なにかいいチュートリアルないかと探していたら。「A...