![[小ネタ] ALB の高度なリクエストルーティングを CloudFormation で設定する](https://devio2023-media.developers.io/wp-content/uploads/2019/05/elastic-load-balancing.png)
[小ネタ] ALB の高度なリクエストルーティングを CloudFormation で設定する
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、菊池です。
ちょうど一ヶ月ほど前、以下の記事を書きました。
この時は、高度なリクエストルーティングがCloudFormationに対応していなかったため、再現性のある構築手順のためにAWS CLIを用いました。ひと月たって、気づけばすでにCloudFromationに対応していたので、テンプレートを作成して構築してみました。
やってみた
今回構築したルールは前回とほぼ同じで以下の通りです。
- HTTPヘッダに特定の文字列があればターゲットにルーティング
- それ以外は403を応答(デフォルトアクション)
設定方法は公式ドキュメントを参照します。現時点で、日本語版には未反映でしたので、英語表示で確認しましょう。
- AWS::ElasticLoadBalancingV2::ListenerRule RuleCondition
- AWS::ElasticLoadBalancingV2::ListenerRule HttpHeaderConfig
ListenerRuleのRuleConditionに、対応している条件が増えています。
テンプレート
テンプレートは以下の通りです。メインはリスナーとリスナールールですが、同時に必要になるSecurityGroup、TargetGroup、ALBも合わせて作成しています。TLSの証明書のみパラメータで指定が必要です。
AWSTemplateFormatVersion: '2010-09-09'
Description: public security group and alb
Parameters:
  certificate:
    Type: String
Resources:
  albSecuritygroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: alb-sg
      GroupDescription: alb-sg
      Tags:
        - Key: Name
          Value: alb-sg
      VpcId: vpc-xxxxxxxxxxxxxxxx
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: '443'
        ToPort: '443'
        CidrIp: 0.0.0.0/0
  albTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 30
      HealthCheckPath: /healthcheck
      HealthCheckPort: 80
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 6
      HealthyThresholdCount: 3
      Name: alb-tg
      Port: 80
      Protocol: HTTP
      UnhealthyThresholdCount: 3
      TargetType: ip
      VpcId: vpc-xxxxxxxxxxxxxxxx
  alb:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: alb
      Scheme: internet-facing
      SecurityGroups:
        - !Ref albSecuritygroup
      Subnets:
        - subnet-xxxxxxxxxxxxxxxx
        - subnet-xxxxxxxxxxxxxxxx
      Tags:
        - Key: Name
          Value: alb
      Type: application
  alblistnener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: fixed-response
          FixedResponseConfig:
            StatusCode: 403
            MessageBody: Not authorized Access.
            ContentType: text/plain
      Certificates:
        - CertificateArn: !Ref certificate
      LoadBalancerArn: !Ref alb
      Port: 443
      Protocol: HTTPS
  lisnerRule:
    Type: AWS::ElasticLoadBalancingV2::ListenerRule
    Properties:
      Actions:
      - Type: forward
        TargetGroupArn:
          !Ref albTargetGroup
      Conditions:
      - Field: http-header
        HttpHeaderConfig:
          HttpHeaderName: x-pre-shared-key
          Values:
            - PRESHAREDKEY
      ListenerArn: !Ref alblistnener
      Priority: 10
上記テンプレートを実行すると、狙った通りにリスナールールが設定されました。
さいごに
今回は以上です。
求める機能がある時には対応していなくても、翌月には(あるいは翌日には)対応されるっといったことがAWSではよくあります。どれも手段にすぎませんので、最初に決めた方法に固執せず、柔軟に受け入れてよりよい実装に向けていくことが重要ですね。












