CloudFormationでALBリスナールールを変更する時にはPriorityに注意

CloudFormationでALBリスナールールの変更をした際に発生したPriority重複エラーをAWSCLIによって既存ルールのPriorityを更新することで解決しました。
2020.05.29

はじめに

CloudFormationでALBリスナールールの変更をした際にハマった現象のメモです。

現象

以下のような状況でCloudFormationテンプレート更新を行おうとしたところ下記のようなエラーが発生しました。

  • CloudFormationで構築したALBの既存のリスナーにルール(priority 2)を追加する
  • リスナーには既に1つルール(priority 1)が設定されている

テンプレートだと以下のような状態です(詳細省略)

ListenerRuleP1:
  Type: AWS::ElasticLoadBalancingV2::ListenerRule
  Properties: # Priority以外は省略
    Priority: 1
## ListenerRuleP2を追加
ListenerRuleP2:
  Type: AWS::ElasticLoadBalancingV2::ListenerRule
  Properties: # Priority以外は省略
    Priority: 2

スタック更新時に以下のエラーが発生しました。新たに作るListenerRuleP2のPriorityが既存ルールと重複しているようです。

Priority '2' is currently in use (Service: AmazonElasticLoadBalancingV2; Status Code: 400; Error Code: PriorityInUse; Request ID: XXXXXXXX)

リファレンス でもPriorityの重複は許されていないことが確認できます。

ルールの優先順位。リスナーは同じ優先度の複数のルールを持つことはできません。優先度を更新してルールの順序を変更しようとした場合、既存のルールでこの優先度がすでに使用されている場合は、新しい優先度を指定しないでください。これにより、エラーが発生する可能性があります。 別のルールで優先度を再利用する必要がある場合は、まず優先度を削除してから、後続の更新でその優先度を指定する必要があります。

何が起きていたのか

実際にリスナールールを確認するとListenerRuleP1のPriorityが変更されていました。実はこの前に手動でルールの変更や追加をした時に既存のルールのPriorityが変更されていました。

aws elbv2 describe-rules --listener-arn arn:aws:elasticloadbalancing:ap-northeast-1:nnnnnnnnn:listener/app/XXXXXXX | jq '.Rules[] | {RuleArn, Priority}'
{
  "RuleArn": "arn:aws:elasticloadbalancing:ap-northeast-1:XXXXXXXXXXX",
  "Priority": "2"
}
{
  "RuleArn": "arn:aws:elasticloadbalancing:ap-northeast-1:YYYYYYYYYYYY",
  "Priority": "default"
}

対策: 既存リスナールールのPriorityを変更する

このままだとテンプレートによるリスナーの追加が行えないばかりかリソースとテンプレートの差異が生じた状態のままとなってしまいます。スタックの更新を完了し穏やかな週末を迎えるために既存リスナールールのPriorityを変更します。

Priorityの変更は以下のようにaws cli で行えます。既存ルールのARNとテンプレートに定義されているPriorityの値を指定します。

aws elbv2 set-rule-priorities --rule-priorities RuleArn=arn:aws:elasticloadbalancing:ap-northeast-1:XXXXXXXXXXX,Priority=1

再度リスナールールを確認した上でスタックを更新するとリスナーが作成できました。

まとめ

AWS CLIの elbv2 set-rule-priorities コマンドでPriorityを変更することでリスナールールのPriority重複エラーを解消することができます。