コーヒーが好きな木谷映見です。
本記事では 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 のホーム画面にアクセスできることを確認しておく
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 から構築する手順も試してみようと思います。
参考
- AWS Summit Online 2020 - Amazon CloudFront と AWS Global Acceleratorを使った AWS global network の活⽤
- AWS Global Accelerator(アプリケーションの可用性とパフォーマンスを向上)| AWS
- AWS Global Accelerator - AWS Global Accelerator
- ヘルスチェックオプション - AWS Global Accelerator
- AWS Global Accelerator resource type reference - AWS CloudFormation
- よくある質問 - AWS Global Accelerator | AWS
emi kitani(執筆記事の一覧)
AS部LX課。2022/2入社、コーヒーとサウナが好きです。執筆活動に興味があります。AWS認定12冠。