ALB に静的パブリック IP アドレスでアクセスするために Global Accelerator を導入する(CloudFormation)

記事タイトルとURLをコピーする


コーヒーが好きな木谷映見です。

本記事では AWS Global Accelerator の概要と、Global Accelerator を作成する CloudFormation テンプレートを紹介します。

AWS Global Accelerator とは

AWS Global Accelerator はパブリックアプリケーションの可用性、パフォーマンス、およびセキュリティの向上に役立つネットワークサービスです。
アプリケーションへの固定エントリポイントとして 2 つの静的パブリック IP アドレス(固定 IP、エニーキャスト)を発行し、以下のサービスに接続することが可能になります。

  • ALB
  • NLB
  • EC2 インスタンス(Elastic IP)

Global Accelerator は DDoS 保護のために AWS Shield と統合されます。

AWS が管理する AWS グローバルネットワークを利用することで、TCP または UDP を介したアプリケーションのパフォーマンスを向上させます。


Global Accelerator は以下のユースケースで利用できます。

  • ゲーム (UDP)、IoT (MQTT)、Voice over IP などの HTTP 以外のユースケース
  • 静的パブリック IP アドレスが必要なケース
  • マルチリージョンで迅速なフェイルオーバーを必要とするケース

今回の目的

今回は ALB に静的グローバル IP アドレスでアクセスするために Global Accelerator を導入します。

ALB は AWS マネージドサービスであり、DNS 名でアクセスします。
AWS 側で定期的にメンテナンスをする影響で、ALB の DNS 名に紐づくグローバル IP アドレスは変更されることがあります。

プロキシや NW 機器から静的グローバル IP アドレス(固定 IP)でアクセスしたいという要件がある場合に、Global Accelerator を入れた構成が役に立ちます。

検証

今回の構成図は以下です。
証明書や独自ドメインは使わず、シンプルな HTTP アクセスをする構成で検証します。

事前準備

  • VPC 関連リソースの作成
    • ALB を作成するため、AZ をまたがるパブリックサブネットを二つ以上準備
    • EC2 インスタンスに Systems Manager フリートマネージャーで RDP 接続するため、NAT Gateway を構築
  • Web サーバー機能を有効にした EC2 インスタンスを作成
    • 今回は EC2 インスタンスで Windows Server 2022(ami-0ae001189e222cd97)を起動
    • Systems Manager フリートマネージャーで EC2 インスタンスに RDP 接続し、IIS の機能を有効化
  • インターネット向け ALB を作成
    • ALB のリスナープロトコル/ポート:HTTP/80
    • ALB のターゲットグループに EC2 インスタンスを登録し、ALB の DNS 名で IIS のホーム画面にアクセスできることを確認しておく

ALB の DNS 名で IIS のホーム画面にアクセスできることを確認しておく

Global Accelerator の作成で必要になりますので、ALB の ARN をコピーして控えておいてください。

Global Accelerator の作成(CloudFormation)

AWS Global Accelerator resource type reference を見るとそこまで難しくなさそうだったので、CloudFormation で作成してみました。
以下のテンプレートを使用します。

AWSTemplateFormatVersion: "2010-09-09"
Description: Create a Global Accelerator.

Parameters:
  GAName:
    Type: String
    Description: (Required) Enter Global Accelerator Name.
    Default: ga
  EndpointId:
    Type: String
    Description: (Required) Enter Global Accelerator EndpointId (ALB ARN).
    Default: arn:aws:elasticloadbalancing:ap-northeast-1:~~~ # ALB ARN
  EndpointRegion:
    Type: String
    Description: (Required) Enter Region.
    Default: ap-northeast-1

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      -
        Label:
          default: "Configuration"
        Parameters:
          - "GAName"
          - "EndpointId"
          - "EndpointRegion"

Resources:
  GA:
    Type: AWS::GlobalAccelerator::Accelerator
    Properties: 
      Enabled: true
      IpAddressType: "IPV4"
      Name: !Ref GAName
      Tags:
        - Key: "Name"
          Value: !Ref GAName

  GAListener:
    Type: AWS::GlobalAccelerator::Listener
    Properties: 
      AcceleratorArn: !Sub ${GA} # Get the ARN of the accelerator
      ClientAffinity: "NONE"
      PortRanges: 
        - FromPort: 80
          ToPort: 80
      Protocol: "TCP"

  GAEndpoint:
    Type: AWS::GlobalAccelerator::EndpointGroup
    Properties: 
      EndpointConfigurations: 
        - ClientIPPreservationEnabled: true
          EndpointId: !Ref EndpointId
          Weight: 128
      EndpointGroupRegion: !Ref EndpointRegion
      HealthCheckIntervalSeconds: 30
      HealthCheckPath: "/"
      HealthCheckPort: 80
      HealthCheckProtocol: "HTTP"
      ListenerArn: !Ref GAListener
      ThresholdCount: 3
      TrafficDialPercentage: 100.0

スタック作成

スタック作成時はパラメータで以下の値を入力してください。

パラメータ 入力値 備考
GAName 例)ga-http アクセラレータの名前
EndpoitId 例)arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/xxx/c35da5cfd0a220fb ALB の ARN
EndpointRegion 例)ap-northeast-1 Web サーバーのエンドポイント(ALB)が存在するリージョン

約 8 分ほどでデプロイが完了しました。
Global Accelerator のコンソールを見てみると、静的パブリック IP アドレスが二つ発行されているのが分かります。

設定値について簡単に補足します。

リスナー設定 AWS::GlobalAccelerator::Listener

項目 設定値 説明
ClientAffinity:
クライアントアフィニティ
NONE 特定のクライアントを同じエンドポイントに送信する設定。デフォルトは無効
PortRanges:
ポート
80 Global Acceleratorが受け付けるポート。ALB のリスナー設定に準拠
Protocol:
プロトコル
TCP Global Acceleratorが受け付けるプロトコル。ALB のリスナー設定に準拠

エンドポイントグループ AWS::GlobalAccelerator::EndpointGroup

項目 設定値 説明
ClientIPPreservationEnabled
クライアントIPアドレスの保持
true デフォルトで有効。
参考:クライアントの IP アドレス保持の利点
EndpointId:
エンドポイント
例)arn:aws:elasticloadbalancing:~~~ ALB の ARN を指定
Weight:
重みづけ
128 0-255までの重みづけ。
今回単独エンドポイントのため、デフォルトの128を設定
EndpointGroupRegion:
リージョン
ap-northeast-1 ALBのある東京リージョンを選択
TrafficDialPercentage:
トラフィックダイヤル
100.0 エンドポイントグループに送信されるトラフィックの割合。デフォルトでアクセラレータ内のすべてのリージョンエンドポイントグループに対し 100%
参考:トラフィックダイヤルによるトラフィックフローの調整
ヘルスチェック

今回のテンプレートではデフォルト設定のままになっています。
理由は、今回のようなロードバランサーエンドポイントの場合、Global Accelerator は常に ELB コンソールで構成したヘルスチェック設定を使用するため、
ここでの設定は実際には反映されません。

項目 設定値
HealthCheckIntervalSeconds:
ヘルスチェック間隔
30秒
HealthCheckPort:
ヘルスチェック用ポート
80
HealthCheckProtocol:
ヘルスチェック用プロトコル
TCP
ThresholdCount:
しきい値
3回

参考:ヘルスチェックオプション - AWS Global Accelerator

アプリケーションロードバランサーまたはNetwork Load Balancer のエンドポイントの場合、Elastic Load Balancing 設定オプションを使用して、リソースのヘルスチェックを設定します。詳細については、「」を参照してください。ターゲットグループのヘルスチェック。グローバルアクセラレータで選択したHealth チェックオプションは、エンドポイントとして追加したアプリケーションロードバランサーまたはネットワークロードバランサーには影響しません。

接続確認

Global Accelerator で発行された二つの静的パブリック IP アドレス宛に、ブラウザからアクセスしてみます。

今回発行された静的パブリック IP アドレスは以下二つでしたが、共に IIS のホーム画面に到達できました。

  • 52.223.34.164
  • 35.71.174.20

ちなみに、Global Accelerator の DNS 名でもアクセスできます。

ALB の DNS 名を指定すれば Global Accelerator を経由せずにアクセスすることもできます。

終わりに

Global Accelerator はグローバルなアプリケーションの可用性・パフォーマンスを向上させる面もありますが、静的パブリック IP アドレスで通信できるという点でも需要がありそうです。

2022 年 8 月に AWS ソリューションアーキテクトアソシ資料試験が新バージョン(SAA-C03)に更新され、私は受験したのですが、CloudFront 以上に Global Accelerator の選択肢が多かったように思います。

個人的な体感ですが、CloudFront の情報に比べ Global Accelerator の情報は少ないような気がしており、ややハードルが高く感じていました。
実際に調査・構築してみるとそこまで操作の難易度が高いわけでもないと感じましたので、他にも設定値を変えてみたり、GUI から構築する手順も試してみようと思います。

参考

emi kitani(執筆記事の一覧)

AS部LX課。2022/2入社、コーヒーとサウナが好きです。執筆活動に興味があります。AWS認定12冠。