🐊
[CDK] ALB のリスナールール更新時に発生したエラー
発生したエラー
ALB のリスナールールを CDK(CloudFormation) で更新しようとしたところ、以下のエラーが発生しました👀
Resource of type 'AWS::ElasticLoadBalancingV2::ListenerRule' with identifier 'Priority '2' is currently in use
やりたかったこと
既存のリスナールールが3つある状態で、以下の変更を加えました。
- 既存のリスナールールは priority [1, 2, 3] の3つ
- 新たに priority 2 にルールを追加
- 既存のルールの priority を [2 → 3]、[3 → 4] へ変更
対応方法
調べたところ、以下の3つの方法が考えられました。
1️⃣ AWS CLIで競合するPriorityのルールを削除してデプロイし直す
エラーの原因は priority の重複なので、一度対象のリスナールールを削除してから再デプロイする方法です。
aws elbv2 delete-rule --rule-arn <rule-arn>
2️⃣ CDKで RemovalPolicy.DESTROY
を適用する
CloudFormationが古いリソースを削除してから新しいリソースを作成するようにすることで、priority の重複を回避できるというものです。
// 実装イメージ
const rule = new elbv2.ApplicationListenerRule(this, 'AlbRule', {
listener: listener,
priority: 2,
conditions: [
elbv2.ListenerCondition.hostHeaders(['dev.azunyan.com']),
],
action: elbv2.ListenerAction.forward([/* ターゲットグループ */]),
});
// RemovalPolicyの適用
rule.applyRemovalPolicy(RemovalPolicy.DESTROY);
3️⃣ 一時的にPriorityを変更してからデプロイする
力技ですが、priority の競合を避けるために、一度異なる値を設定してデプロイし、その後理想の値に戻す方法です。今回の場合は、既存の3つの priority の間に1つリスナールールを入れ込んだので以下のイメージになります。
1. priority [2,3,4] を [5,6,7] に変更してデプロイ(2,3,4を一旦削除)
2. priority [5,6,7] を [2,3,4] に戻してデプロイ(5,6,7は削除)
結果
3️⃣の力技で無事解決しました🙈🔥
エラーの原因は priority の競合でしたが、対策として CLIでの削除、RemovalPolicy適用、一時変更 など複数の方法があるので、状況に応じて選ぶのが良さそうです。
以上、どなたかの参考になれば幸いです。
えみり〜でした|ωΦ)ฅ
Discussion