目次
はじめに
こんにちは。クラウド事業部の西川です。
今回は、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を触ったことのない方は、下記の記事のスタック作成の項目を参考に作成してください。
② リソースの作成後、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のご支援をしております。
また、一緒に働いていただける仲間も募集中です! ご興味持っていただけましたらぜひお声がけください。