このエントリーをはてなブックマークに追加

今回は 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

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


このエントリーをはてなブックマークに追加

4/4(土)、Symfony Meetup Kansaiの第三回に参加しました。今回は新型コロナウィルス対策としてオンラインで開催されました。
セッション枠で、最近カルテット開発部PHPチームで取り組んでいることについて発表してきました。

発表と言ってもオンライン開催なので自宅からzoomでスライドを画面共有して、話したいことを話すだけです。
基本的には、遠くまで出かけなくていいし、家族からもぎ取る自由時間も短くて済んでオンライン勉強会最高!と思うのですが、発表者としては普段のオフラインの勉強会と違って困った点もありました。

発表者ノートが利用できない

zoom画面共有で発表する以上、発表者ノートが参照できませんでした。
やり方を工夫すればもしかしたらできるのかもしれませんが、いかんせん自宅のマシン環境が非力なMacBookAir1台のみ(追加ディスプレイはなし)ということもあり、スライドの公開用画面を文字多めにして読み上げる形を取ることでなんとか発表を成立させました。

聴衆の反応がわからない(わかりにくい)

オフラインの勉強会だと見える皆さんの反応が感じにくいです。
普段、顔の表情や首を傾げる仕草などで「伝わってないなー」と思ったらアドリブで説明を追加するとか、ウンウン頷いている人が多ければ冗長な説明を飛ばして次に行ったりするんですが、そういう調整は無理でした。ギャグがすべったかウケたかもわかりにくく、笑いを取りたい私としてはつらく感じました…。


とはいえ、最後まで話し終わったあとで色々質問もいただき、興味を持ってもらえたようで嬉しかったです。
今回特に主張したかったのは、技術的に新しい言語や新しいパラダイムや新しいフレームワークにこだわらなくても、まだまだPHPにもSymfonyにも未知の領域・未踏の領域があって、「新しいこと」はできるということです。
「新しいから」「流行ってるから」という理由で、作りたいものに対して最適でない技術を選択してしまう例をときどき聞きます。
私は作りたいものがWebアプリケーションであればPHPはちゃんと現実的でときには最適な選択肢だと思っていますし、PHPやSymfonyを使いながらでも技術的な挑戦はできると考えています。


このエントリーをはてなブックマークに追加

新型コロナウィルスが猛威を振るってる今日このごろ、皆様いかがお過ごしですか?
リモートワーク体制が敷かれたり、PHPカンファレンス福岡・関西が中止になってしまうなどPHPerにも影響がじわじわ来ています。

そんな中、主にヨーロッパ方面で開催されているSymfonyのカンファレンス、SymfonyLiveも直近の開催予定(複数)が中止になってしまいました。
中止になったSymfonyLiveの代替として、金曜の深夜(日本時間では日付はもう土曜になっていましたが)にSymfonyLiveOnlineという初の試みが行われたので、 眠い目をこすって参加してみた感想を書いておきたいと思います。

申し込み

今回のSymfonyLive Onlineは無料でしたが、参加には事前登録が必要でした。 https://live.symfony.com/online/

参加登録をするためには、Symfony開発者のための公式SNS SymfonyConnect のアカウント(無料)が必要です。
このアカウントは開発者としてのプロフィール公開機能のほか、Symfonyの資格試験を受験するときにも使われます。(ちなみに私は2014年に受験して 見事に落ちました…
Symfonyユーザーでまだアカウントの無い方はこの機会にアカウントを作っておくといいと思います!

形式

限定公開のYouTubeのライブ配信を利用して行われました。
放送された画面を見ていた限りだと、操作画面の共有やFabienの顔の撮影は zoom を使っていたようです。

YouTubeライブ配信のコメント欄は開放されており、世界中から "Hello from XXX"(XXXに様々な地名・国名) という挨拶が書き込まれていました。
私も Hello from Japan しました :grin:

内容

  • Symfony 5.0.6のリリースの様子
  • symfony/symfony のプルリクエストのいくつかをレビューしてマージする様子

どちらもFabienが「フッフフーン」と鼻歌を歌いながらターミナルに打ち込んでいく様子が見ていて楽しかったです。
Symfonyのマイナーバージョンリリース、Symfonyのプルリクエストのマージにまつわる多くの作業がスクリプトで自動化されていることも知りました。
私自身も日常の様々なルーティンワークの自動化をもっと頑張ろうと励みになりました。

感想

最も印象的だったのは終盤に伝えられた「Symfonyの開発をサポートしてほしい」というお願いでした。
具体的には、

  • 最近発売された Symfony5 Bookを買ってほしい
  • SymfonyLive, SymfonyCon等のオフィシャルイベントのチケットを買ってほしい、スポンサーになってほしい

常々日本のカンファレンスに比べて海外のカンファレンスは総じてチケットが高いなーと思っていたのですが、高いのにはわけがあったのですね。
残念ながら私は当面、労働力を提供する(コードのパッチを送る)方向の貢献しかできなそうですが…。

なお、4月に再度オンラインでSymfonyLiveを予定しているという告知もありました。
コメントの Hello from ... でアジア勢が意外と多かったためか、次回はもう少しアジア勢にやさしい時間帯(起きて話を聞けそうな時間帯)に開催してくれるそうです。
楽しみに待ちましょう。

また、今回はお試しということもあってか、FabienとNicolasのお二人だけが発表者でしたが、いずれ世界中からオンライン登壇ができるようになったら素敵だなと思いました。