🐊

[CDK] ALB のリスナールール更新時に発生したエラー

2025/02/01に公開

発生したエラー

ALB のリスナールールを CDK(CloudFormation) で更新しようとしたところ、以下のエラーが発生しました👀

Resource of type 'AWS::ElasticLoadBalancingV2::ListenerRule' with identifier 'Priority '2' is currently in use

やりたかったこと

既存のリスナールールが3つある状態で、以下の変更を加えました。

  1. 既存のリスナールールは priority [1, 2, 3] の3つ
  2. 新たに priority 2 にルールを追加
  3. 既存のルールの 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