今回は Application Load Balancer(以降、ALB )の設定時につまづいたことおよびそれをきっかけに制限緩和専用のコンソールを知りましたのでそのログをメモがてら記します。

経緯

CloudFormation で

ある ALB に「複数のIPアドレスからのアクセスを任意のターゲットグループに転送する」というリスナールールを設置したく以下のように CloudFormation のテンプレートを記述しました。

LoadBalancerListenerRule:
  Type: AWS::ElasticLoadBalancingV2::ListenerRule
  Properties:
    Actions:
      -
        Type: forward
        TargetGroupArn: !Ref TargetGroup
    Conditions:
      -
        Field: source-ip
        SourceIpConfig:
          Values:
            - "nn0.mm0.xx0.yy0/32"
            - "nn1.mm1.xx1.yy1/32"
            - "nn2.mm2.xx2.yy2/32"
            - "nn3.mm3.xx3.yy3/32"
            - "nn4.mm4.xx4.yy4/32"
            - "nn5.mm5.xx5.yy5/32"
    ListenerArn: !Ref LoadBalancerListener
    Priority: 1

テンプレートのバリデーションチェックも通り、当該スタックの変更セットも無事作成されたので、そのまま変更セットを適用しようとしたところ、以下のようなエラー・メッセージが。

A rule can only have ‘5’ condition values (Service: AmazonElasticLoadBalancingV2;…

そんな仕様あったのでしょうか?ドキュメントを読んでみますがそれらしい表現はありません。

Conditions The conditions.

The rule can optionally include up to one of each of the following conditions: http-request-method, host-header, path-pattern, and source-ip. A rule can also optionally include one or more of each of the following conditions: http-header and query-string.

Required: Yes

Type: List of RuleCondition

Update requires: No interruption

AWS::ElasticLoadBalancingV2::ListenerRule - AWS CloudFormation

とりあえず今回はエラー・メッセージに従って対応することとしますが、これ以降の開発においても「エラー・メッセージが出てきて初めて仕様を知った」では手間がかかります。どこかに仕様はまとまっていないでしょうか。

Webコンソールではどうだったか?

実は CloudFormation でテンプレートを記述する前段としてWebコンソールからのルール設定を試していました。しかし、このときはIPアドレスを5つ登録していたわけではありませんでした。
そこで再度ルール設定にIPアドレスを5つ足す試みをWebコンソールからやってみることにします。
そうしたところ以下のような表示となりました。

web-console

条件値制限(5/ルール)に一致しています。

と記述してあります。たしかに5つまでしか設定できないようですね。そして 制限 としてなにやらリンクが貼られています。

Quotas for Your Application Load Balancers - Elastic Load Balancing

ありました!
どうやら ALB の制限値がまとまって記載されているようです。CloudFormation のドキュメントだけを見ていてもわからないことがありますね。また、これによると制限値がリージョンごとに設定されているようです。この立て付けだと CloudFormation のテンプレートのバリデーションチェックではあぶり出すのが難しいかもしれません。
AWS CLI で現在のアカウントに設定されている ALB に関する制限値の一覧を見ることもできるようです。

$ aws elbv2 describe-account-limits
{
    "Limits": [
        {
            "Max": "3000",
            "Name": "target-groups"
        },
        {
            "Max": "1000",
            "Name": "targets-per-application-load-balancer"
        },
        {
            "Max": "50",
            "Name": "listeners-per-application-load-balancer"
        },
        {
            "Max": "100",
            "Name": "rules-per-application-load-balancer"
        },
        {
            "Max": "50",
            "Name": "network-load-balancers"
        },
        {
            "Max": "3000",
            "Name": "targets-per-network-load-balancer"
        },
        {
            "Max": "500",
            "Name": "targets-per-availability-zone-per-network-load-balancer"
        },
        {
            "Max": "50",
            "Name": "listeners-per-network-load-balancer"
        },
        {
            "Max": "5",
            "Name": "condition-values-per-alb-rule"
        },
        {
            "Max": "5",
            "Name": "condition-wildcards-per-alb-rule"
        },
        {
            "Max": "100",
            "Name": "target-groups-per-application-load-balancer"
        },
        {
            "Max": "5",
            "Name": "target-groups-per-action-on-application-load-balancer"
        },
        {
            "Max": "1",
            "Name": "target-groups-per-action-on-network-load-balancer"
        },
        {
            "Max": "50",
            "Name": "application-load-balancers"
        }
    ]
}

おそらく今回引っかかった制限は condition-values-per-alb-rule と思われます。
なお、このうちいくつかの値についてはこれらを緩和申請もできるとのこと。
AWS Service Quotas という AWS の各種サービスの制限値を包括的に管理することができるコンソールが用意されているとのことで、そちらに所望の値があればここから緩和申請が可能のようです。去年の7月にリリースされていた ようです。知りませんでした!これは便利そうですね!

なお現時点では condition-values-per-alb-rule については AWS Service Quotas からも、サポートセンター からも緩和申請は不可能のようでした。

まとめ

CloudFormation におけるテンプレートのバリデーションチェック時および変更セット作成時には制限値を超えた場合に検出するのは不可能のようです。よって変更セットの適用時に数値に絡むエラーになった場合は制限値であることを疑ってみて、そして可能だったら制限緩和を申請するということは選択肢として頭に入れておくと良さそうですね。

余談

LoadBalancerListenerRule:
  Type: AWS::ElasticLoadBalancingV2::ListenerRule
  Properties:
    Actions:
      -
        TargetGroupArn: !Ref TargetGroup
        Type: forward
    Conditions:
      -
        Field: source-ip
        SourceIpConfig:
          Values:
            - "nn0.mm0.xx0.yy0/32"
            - "nn1.mm1.xx1.yy1/32"
            - "nn2.mm2.xx2.yy2/32"
            - "nn3.mm3.xx3.yy3/32"
            - "nn4.mm4.xx4.yy4/32"
-           - "nn5.mm5.xx5.yy5/32"
+     -
+       Field: source-ip
+       SourceIpConfig:
+         Values:
+           - "nn5.mm5.xx5.yy5/32"
    ListenerArn: !Ref LoadBalancerListener
    Priority: 1

余談ですが、先述のエラーを受けて上記のように修正したのですがこれもまた下記のようなメッセージとともにエラーになりました。

A rule can only have one ‘source-ip’ condition (Service: AmazonElasticLoadBalancingV2…

上記のドキュメントも読んでみたのですがこれについての記述は見つけられませんでした。
とりあえず試してみたところ以下の記述で無事に所望のリソースが作成できました。

LoadBalancerListenerRule1:
  Type: AWS::ElasticLoadBalancingV2::ListenerRule
  Properties:
    Actions:
      -
        TargetGroupArn: !Ref TargetGroup
        Type: forward
    Conditions:
      -
        Field: source-ip
        SourceIpConfig:
          Values:
            - "nn0.mm0.xx0.yy0/32"
            - "nn1.mm1.xx1.yy1/32"
            - "nn2.mm2.xx2.yy2/32"
            - "nn3.mm3.xx3.yy3/32"
            - "nn4.mm4.xx4.yy4/32"
-           - "nn5.mm5.xx5.yy5/32"
    ListenerArn: !Ref LoadBalancerListener
    Priority: 1
+LoadBalancerListenerRule2:
+  Type: AWS::ElasticLoadBalancingV2::ListenerRule
+  Properties:
+    Actions:
+      -
+        TargetGroupArn: !Ref TargetGroup
+        Type: forward
+    Conditions:
+      -
+        Field: source-ip
+        SourceIpConfig:
+          Values:
+            - "nn5.mm5.xx5.yy5/32"
+    ListenerArn: !Ref LoadBalancerListener
+    Priority: 2

ドキュメントをつぶさに見ることはもちろん大切ですが試行錯誤も欠かせませんね。