APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【ハンズオン】ALBパスベースルーティング(CloudFormationで事前準備簡略化)

目次

はじめに

こんにちは。クラウド事業部の西川です。

今回は、ALBパスベースルーティングのハンズオンについてご紹介します。

パスベースルーティングとは、パスの条件を使用してリクエスト内の URL に基づいてリクエストをルーティングする機能のことです。

事前準備を簡略化するためのCloudFormationテンプレートを用意しました。

構成図

上記の構成を作成することが、今回のハンズオンのゴールです。

Blueインスタンスの/blue/にアクセスした場合はBlueテストページ、Greenインスタンスの/green/にアクセスした場合はGreenテストページが表示されます。

テンプレート

AWSTemplateFormatVersion: '2010-09-09'

Parameters:
  PJPrefix:
    Type: String
    Default: ALB-HandsOn
  EC2AMIId:
    Description: AMI ID (Amazon Linux2)
    Type: AWS::SSM::Parameter::Value<String>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
  KeyName:
    Description: The EC2 Key Pair to allow SSH access to the instance
    Type: "AWS::EC2::KeyPair::KeyName"

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Sub "${PJPrefix}-VPC"

  SubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: VPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone:
        Fn::Select:
          - 0
          - Fn::GetAZs: ""

  SubnetG:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: VPC
      CidrBlock: 10.0.2.0/24
      AvailabilityZone:
        Fn::Select:
          - 1
          - Fn::GetAZs: ""

  InternetGateway:
    Type: AWS::EC2::InternetGateway

  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId:
        Ref: VPC
      InternetGatewayId:
        Ref: InternetGateway

  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:
        Ref: VPC

  Route:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId:
        Ref: RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId:
        Ref: InternetGateway

  SubnetRouteTableAssociationA:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: SubnetB
      RouteTableId:
        Ref: RouteTable

  SubnetRouteTableAssociationB:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: SubnetG
      RouteTableId:
        Ref: RouteTable

  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow http to client host
      VpcId:
        Ref: VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: !Sub "${PJPrefix}-Web-SG"

  BlueInstance:
    Type: AWS::EC2::Instance
    Properties:
      KeyName: !Ref KeyName
      ImageId: !Ref EC2AMIId
      InstanceType: t2.micro
      SubnetId:
        Ref: SubnetB
      SecurityGroupIds:
        - Ref: SecurityGroup
      UserData:
        Fn::Base64: |
          #!/bin/bash
          yum update -y
          yum install -y httpd
          systemctl start httpd
          systemctl enable httpd
          mkdir -p /var/www/html/blue
          echo "<html>
                    <head>
                    <title>Blue Test Page</title>
                    <style>
                    h1 {
                        color: blue;
                        font-size: 3em;
                    }
                    </style>
                    </head>
                    <body>
                    <h1>Blue Test Page</h1>
                    <p>If you see this page, the web server is working correctly.</p>
                    </body>
                    </html>" > /var/www/html/blue/index.html
      Tags:
        - Key: Name
          Value: !Sub "${PJPrefix}-BlueEC2Instance"

  BlueInstanceEIP:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc

  BlueInstanceEIPAssociation:
    Type: AWS::EC2::EIPAssociation
    Properties:
      InstanceId: !Ref BlueInstance
      EIP: !Ref BlueInstanceEIP

  GreenInstance:
    Type: AWS::EC2::Instance
    Properties:
      KeyName: !Ref KeyName
      ImageId: !Ref EC2AMIId
      InstanceType: t2.micro
      SubnetId:
        Ref: SubnetG
      SecurityGroupIds:
        - Ref: SecurityGroup
      UserData:
        Fn::Base64: |
          #!/bin/bash
          yum update -y
          yum install -y httpd
          systemctl start httpd
          systemctl enable httpd
          mkdir -p /var/www/html/green
          echo "<html>
                    <head>
                    <title>Green Test Page</title>
                    <style>
                    h1 {
                        color: green;
                        font-size: 3em;
                    }
                    </style>
                    </head>
                    <body>
                    <h1>Green Test Page</h1>
                    <p>If you see this page, the web server is working correctly.</p>
                    </body>
                    </html>" > /var/www/html/green/index.html
      Tags:
        - Key: Name
          Value: !Sub "${PJPrefix}-GreenEC2Instance"

  GreenInstanceEIP:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc

  GreenInstanceEIPAssociation:
    Type: AWS::EC2::EIPAssociation
    Properties:
      InstanceId: !Ref GreenInstance
      EIP: !Ref GreenInstanceEIP

ALBとターゲットグループ作成&ルール設定

① 上記のテンプレートを使用してリソースを作成します。

CloudFormationを触ったことのない方は、下記の記事のスタック作成の項目を参考に作成してください。

techblog.ap-com.co.jp

② リソースの作成後、ALBとALBのターゲットグループをコンソールで作成します。

コンソールのEC2>ロードバランシング>ロードバランサーに移動し、右上の「ロードバランサーの作成」をクリックします。

「ロードバランサータイプの比較と選択」の画面でApplication Load Balancerの「作成」をクリックしてください。

「基本的な設定」の項目のロードバランサー名は適当なものを付けてください。スキームはインターネット向け、IP アドレスタイプはIPv4のままで問題ありません。

ネットワークマッピングの項目のVPCでは作成したリソースのVPCを選択し、マッピングは2つのAZにチェックを入れてください。

続いてセキュリティグループではdefaultのSGを削除し、もう一つのSGを選択してください。

その次の「リスナーとルーティング」の項目にある「ターゲットグループの作成」をクリックするとターゲットグループの作成画面に遷移します。

「基本的な設定」の「ターゲットタイプの選択」は「IPアドレス」を選択し、ターゲットグループ名には分かりやすいようにBlueが付く名前を付けてください。

そして、ヘルスチェックの項目のヘルスチェックパスでは/blue/index.htmlと入力してください。

その他の項目はデフォルトのままで問題ありません。

「次へ」を押すとターゲットを登録する画面が表示されます。

別ウィンドウでコンソールを開き、EC2>インスタンスでBlueEC2InstanceのプライベートIPアドレスを確認します。

このIPアドレスを先ほどのターゲットを登録する画面で入力します。

IPアドレスの入力後、「保留中として以下を含める」をクリックし、「ターゲットグループの作成」を押してください。

ターゲットグループが作成できたら先ほどのALBの作成画面に戻ります。

「リスナーとルーティング」の「ターゲットグループの選択」の右にあるリロードボタンを押すと、先ほど作成したターゲットグループが表示されるのでこれを選択します

設定に誤りがなければ「ロードバランサーの作成」をクリックしてください。

ALBがアクティブになるまで少し待ちます。

③ 続いて、BlueEC2Instance用のルールを設定します。

作成したALBの下記画面の赤丸で囲った場所「リスナーとルール」の「1のルール」をクリックします。

移動先のページの、「リスナールール」の右側の「ルールを追加する」をクリックします。

最初の名前とタグは何も記入しなくても次に進めます。

ステップ2「ルール条件の定義」で「条件の追加」をクリックします。

「条件の選択」で「パス」を選び、パスに/blue/*と入力し、確認、次へを押します。

「アクションのルーティング」は「ターゲットグループへ転送」のままで、「ターゲットグループの選択」ではBlueターゲットグループを選択し、次へを押します。

「ルールの優先度」に1と入力、次へを押し、作成ボタンをクリックします。

これでBlueEC2Instance用のルール設定は完了しました。

④ 次は、GreenEC2Instance用のターゲットグループの作成とルールの設定をします。

基本的な流れは③と同じで、途中でターゲットグループの作成をします。

先ほどのALBの画面に戻り、「リスナーとルール」の「2のルール」をクリックします。

再度、「ルールの追加」を選択します。

ステップ2「ルール条件の定義」で「条件の追加」をクリックします。

「条件の選択」で「パス」を選び、パスに/green/*と入力し、確認、次へを押します。

「アクションのルーティング」は「ターゲットグループへ転送」のままで、「ターゲットグループを作成」をクリックすると、再びターゲットグループの作成画面に遷移します。

「基本的な設定」の「ターゲットタイプの選択」は「IPアドレス」を選択し、ターゲットグループ名には分かりやすいように今度はGreenが付く名前を付けてください。

そして、ヘルスチェックの項目のヘルスチェックパスでは/green/index.htmlと入力してください。

その他の項目はデフォルトで問題ありません。

「次へ」を押すとターゲットを登録する画面が表示されます。

別ウィンドウでコンソールを開き、EC2>インスタンスでGreenEC2InstanceのプライベートIPアドレスを確認し、このIPアドレスを先ほどの画面で入力します。

IPアドレスの入力後、「保留中として以下を含める」をクリックし、「ターゲットグループの作成」を押してください。

ターゲットグループが作成できたら先ほどのルールを追加する画面に戻ってください。

「ターゲットグループの選択」の右にあるリロードボタンを押すと、先ほど作成したgreenのターゲットグループが表示されるのでこれを選択し、次へをクリックします

ルールの優先度に2を入力後、次へを押し、作成ボタンをクリックします。

これでGreenEC2Instance用の設定は完了しました。

⑤ 最後にデフォルトアクションを編集します。

ALBの画面に戻り、「リスナーとルール」の「3のルール」をクリックします。

次の画面で、デフォルトの左にあるチェックボックスにチェックを入れ、アクション>ルールの編集をクリックします。(下記画面参考)

そして「アクションのルーティング」で「固定レスポンスを返す」を選択、「レスポンスコード」の欄に403を入力し、変更内容の保存をクリックします。

動作確認

では動作確認をします。

ALBの画面でDNS名をコピーします。

コピーしたDNS名でブラウザからアクセスすると下記の画面が表示されると思います。

続いて、「<コピーしたDNS名>/blue/」でブラウザからアクセスし、下記の画面が表示されることを確認します。

最後に、「<コピーしたDNS名>/green/」でブラウザからアクセスし、下記の画面が表示されることを確認します。

以上で動作確認は終了です。

リソース削除

ハンズオンが完了しましたら、リソースを削除しましょう。

まずはALBを削除し、その後にCloudFormationのスタックとターゲットグループを削除してください。

お疲れ様でした。

まとめ

ALBパスベースルーティングのハンズオンについてご紹介しました。

この記事がご参考になれば幸いです。

おわりに

私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です! ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp