こんにちは、ちゃりおです。
CDKを使ってECSを運用しています。
運用中のECSサービスのデプロイメントサーキットブレイカーを有効化してみました。
しかし、L2 Constructで普通にやるとECSのサービス置き換えが発生してしまいました。(CDK 1.118.0時点)
稼働中のECSサービスが置き換えられてしまうのは、好ましくありません。
Issueが上がっていて、そのうち解消されると思うのですがL1 Constructで回避する方法についてです。
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


