Amazon Web Services ブログ
AWS Global Accelerator によって提供される静的 IP アドレスを介した AWS API Gateway へのアクセス
はじめに
この記事では、Amazon API Gateway を AWS Global Accelerator と組み合わせて設定し、静的 IP アドレスを使用してインターネット経由で API をエンドユーザーに提供する手順について説明します。この設計は、静的 IP のセーフリスト化のニーズを解決するだけでなく、ユーザーのトラフィックを Amazon Web Services のグローバルネットワークインフラストラクチャを介して送信することで、エンドユーザーに対するパフォーマンスを向上させます。
多くの AWS のお客様は、バックエンドアプリケーションのデプロイを簡素化するために Amazon API Gateway に頼っています。Amazon API Gateway は、アプリケーションがバックエンドサービスのデータ、ビジネスロジック、機能にアクセスするためのエントリーポイントとなり、AWS Lambda、HTTP プロキシ統合など、さまざまな統合オプションを提供しています。パブリックな API Gateway は URL を使用して呼び出すことができ、パブリック静的 IP アドレスを予約しません。これは、医療や金融サービスなどの厳格に規制された業界での Amazon API Gateway におけるデプロイメントの課題となる場合があります。たとえば、パブリックの医療ネットワークがセキュリティポリシーで明示的に許可されていない限り、パブリックインターネット上の IP 宛先との通信が許可されないといった要件があります。このような環境では、セキュリティ管理者は、ネットワークからのインターネット向け通信が必要な場合には、周辺のファイアウォールで個々の IP アドレスまたは IP アドレス範囲をセーフリスト化し、その他のトラフィックをすべて拒否します。
ソリューションの概要
このソリューションでは、Amazon API Gateway への到達性をカスタムドメイン(例:https://api.example.com)を介して提供します。カスタムドメイン名の DNS レコードは、Amazon Route 53 サービスによってホストされます。デプロイに必要な公開 SSL 証明書を作成するために、AWS Certificate Manager を使用します。
このソリューションを使用すると、カスタムドメインは AWS Global Accelerator が提供する2つのパブリックな静的 IP アドレスに解決されます。これらの静的 IP アドレスは変更されず、ファイアウォールでセーフリスト化することができます。以下に示すように、Application Load Balancer は、AWS Global Accelerator から API Gateway にリクエストを転送するために使用されます。

図 1: ソリューションのハイレベルアーキテクチャ図
このデモでは、ソリューションを us-west-2 リージョンにデプロイしますが、好きなリージョンを選択することもできます。デプロイする前に、必要なサービスが選択したリージョンでサポートされていることを確認してください。
https://thinkwithwp.com/jp/about-aws/global-infrastructure/regional-product-services/
構成のチュートリアル
1. パブリック SSL 証明書の作成
API エンドポイントを公開するために使用するドメインに対してまずパブリック SSL 証明書を作成します。AWS Certificate Manager (ACM) に移動してください: https://us-west-2.console.thinkwithwp.com/acm
パブリック証明書をリクエストするには、「証明書をリクエスト」を選択します。
次に所有するドメイン名を追加し、証明書の検証手順を進めます。検証が成功し証明書のステータスが「発行済み」になることを確認してください。
SSL 証明書のリクエスト手順について、詳しくは AWS Certificate Manager のドキュメントを参照してください: https://docs.thinkwithwp.com/acm/latest/userguide/gs-acm-request-public.html
2. API Gateway のための VPC エンドポイントの作成
AWS コンソールで、Amazon Virtual Private Cloud (VPC) サービスに移動してください: https://us-west-2.console.thinkwithwp.com/vpc
ナビゲーションバーで「エンドポイント」を選択します。以下に示すように「エンドポイントの作成」を選択し、AWS サービスの検索で「execute-api」サービスを選択します。

図 2: API ゲートウェイ エンドポイントの作成
対象の VPC を選択し、エンドポイントをデプロイする希望のアベイラビリティゾーンを特定してください。冗長性のためには、少なくとも2つのアベイラビリティーゾーンを活用することが推奨されます。構築している API Gateway は直接インターネットからアクセスできないようにするため、プライベートサブネットを使用することが推奨されます。
このエンドポイントの DNS 名前解決を有効にし、セキュリティグループと適切なアクセスポリシーを選択してください。しばらくすると、VPC エンドポイントのステータスが「保留中」から「利用可能」に変わります。
作成した VPC エンドポイントを選択し、「詳細」に移動してください。以下に示す用に、DNS 名前の下に、このエンドポイントに関連付けられたホスト名が表示されます。

図 3: API Gateway VPC エンドポイントに関連付けられた DNS 名の特定
この時点で、リストされている DNS 名前に対してドメインの検索を実行し、このエンドポイントをデプロイしたアベイラビリティゾーンのプライベート IP アドレスのリストを取得する必要があります。
これらの IP アドレスをメモしておいてください。ALB の設定に必要となります。
3. API Gateway の作成
API Gateway コンソールに移動してください: https://us-west-2.console.thinkwithwp.com/apigateway
「REST API Private」オプションを探し、「ビルド」を選択します。[新しい API の作成]で、「新しい API」オプションを選択します。
ドロップダウンメニューで、「Private」の Endpoint Type を選択します。以下に示す用に、VPC Endpoint IDs セクションに、前の手順で作成した VPC の ID を入力します。

図 4: プライベートエンドポイントを使用した REST API ゲートウェイの作成
ソリューションをテストするために、以下に示すように、「GET」メソッドに関連付けられた モック統合ポイントを作成してください。

図 5: モック API ゲートウェイ統合の作成
この API Gateway をデプロイする前に、このプライベート API へのアクセスを制御するためのリソースポリシーを作成する必要があります。
デモの目的で、以下に示すような制限のないポリシーを作成することができます。本番環境でデプロイする場合は、Amazon API Gateway のセキュリティベストプラクティスをカバーしたドキュメントを参照してください。

図 6: API ゲートウェイのリソースポリシーの作成
これで、以下に示すように新しいステージを作成することで、API をデプロイする準備が整いました。

図 7: API Gateway デプロイメント用の新しいステージを作成する
4. API ゲートウェイのためのカスタムドメイン名を定義する
API Gateway コンソールで、カスタムドメイン名に移動します。デプロイメント用にカスタムドメイン名を作成します。ドメイン名は、以前に作成した公開証明書に含まれている必要があります。
以下に示すように、リージョナルエンドポイントタイプを指定します。以前に作成した ACM 証明書を使用してください。

図 8: API ゲートウェイのドメイン名の作成
定義したカスタムドメイン名を選択してください。そして、「API マッピング」タブに移動します。「API マッピングの設定」を選択し、「新しいマッピングを追加」します。以下に示すように、適切なステージで定義した API を選択します。

図 9: カスタムドメイン名で API ゲートウェイからステージへのマッピングを作成する
この時点でカスタムドメインを使用して API を完全に定義し終わり、VPC エンドポイントを介してこの API を公開したことなります。
5. アプリケーションロードバランサー(ALB)のデプロイ
Elastic Compute Cloud (EC2) コンソールに移動してください: https://us-west-2.console.thinkwithwp.com/ec2
「ロードバランサー」を選択します。「ロードバランサーの作成」に移動し、「アプリケーションロードバランサー」オプションを選択します。そして、「作成」を選択します。HTTPS リスナーを持つ「internet-facing」のロードバランサーを作成します。
VPC エンドポイントの作成に使用した VPC と可用性ゾーンを選択してください。以下に示すように、アドオンサービスで AWS Global Accelerator の作成オプションを選択します。Elastic Load Balancing (ELB) と Global Accelerator は内部的に連携して、アクセラレータをアカウント内に設定し、ロードバランサーの前面に配置します。

図 10: ALB のアドオン サービスとして有効化された AWS Global Accelerator
次のステップでは、以前に作成した ACM 証明書を選択してください。提案されたセキュリティポリシーを変更しないでください。
既存のセキュリティグループを活用するか、新しいセキュリティグループを作成してください。HTTPS(TCP ポート 443)のトラフィックが許可されていることを確認してください。ソース範囲として 0.0.0.0/0 を指定してください。
以下に示すように、トラフィックをルーティングするための新しいターゲットグループを作成してください。ターゲットタイプでは「IP」を選択します。ヘルスチェックには HTTPS を使用し、プロトコルバージョンとして HTTP1 を指定します。

図 11: 新しい IP ベースのターゲット グループの作成
「詳細なヘルスチェック設定」を開いてください。以下に示すように、「成功コード」の値を403に変更してください。
注: ALB は、VPC エンドポイントの IP アドレスに対して HTTPS リクエストを送信して API Gateway のヘルスを検証します。API Gateway は、ヘルスチェックのプローブ中に正しいドメイン名とステージの URL を提供しないため、403コード(アクセス禁止)で応答します。

図 12: ヘルスチェックパラメータの成功コードを変更する
以下に示すように、VPC の構成手順でキャプチャした VPC エンドポイントの IP アドレスを、「ターゲットの登録」のステップで IP ターゲットとして追加してください。

図 13: VPC エンドポイント IP アドレスの指定
「確認」を選択し、構成を確認して「作成」を実行します。
ロード バランサーがプロビジョニングされるまで待ちます。
6. AWS Global Accelerator を指すドメイン名のエイリアスレコードを作成する
AWS Route53 のコンソールに移動し、以下に示すように、AWS Global Accelerator を指すドメイン名のエイリアスレコードを作成してください。

図 14: Route53 でグローバル アクセラレータを指す新しいエイリアス レコードを作成する
7. エンドツーエンドのサービス検証
好きなウェブブラウザを開きます。作成したホスト名に移動し、HTTPS プロトコルを使用することを忘れないでください。Mock API レスポンダは空白のページを返します。次に、接続がセキュアであり、SSL 証明書のエラーが発生していないことを検証します。Amazon API Gateway は、AWS Global Accelerator によって提供される静的 IP アドレスを介してアクセスできるようになりました。
まとめると、VPC エンドポイントのネットワークインターフェースを介して到達可能な Amazon API Gateway を構成しました。また、AWS Global Accelerator を統合したアプリケーションロードバランサーを構成し、そのロードバランサーの VPC エンドポイントに向けています。これで、デモ目的で使用されていたモック統合を、デプロイに必要なバックエンド統合で置き換えることができます。利用可能なオプションについては、以下のドキュメントを確認してください: https://docs.thinkwithwp.com/apigateway/latest/developerguide/api-gateway-api-integration-types.html
リソースをクリーンアップする
テスト目的で環境をセットアップした場合は、テストの終了時に次の手順を実行してリソースを削除できます。
- Amazon Route53 コンソールで、グローバルアクセラレータを指す DNS レコードを削除する
- AWS Global Accelerator コンソールで、まずアクセラレータを無効化し、その後削除する
- EC2コンソールで、「Load Balancers」に移動し、作成したロードバランサーを削除する
- API Gateway コンソールに移動し、作成したカスタムドメイン名と API Gateway を削除します。
- Amazon VPC サービスコンソールで、「Endpoints」に移動し、作成したエンドポイントを削除する
- ACM コンソールで、デモに使用した証明書を削除する
まとめ
このブログ記事では、AWS Global Accelerator、Application Load Balancer、Amazon API Gateway を併用することで、Amazon API Gateway の背後にあるバックエンドシステムに到達するために静的IPアドレスを使用するセキュリティニーズを満たす方法をレビューしました。セキュリティ態勢を改善することに加えて、アプリケーションは AWS Global Accelerator のトラフィックアクセラレーション機能の恩恵を受けることになります。他のユースケースに対応するために AWS Global Accelerator をどのように導入できるかを知りたい場合は、以下のリンクを参照してください。
https://thinkwithwp.com/jp/global-accelerator/
この記事は 「Accessing an AWS API Gateway via static IP addresses provided by AWS Global Accelerator」の日本語訳です。
プロフェッショナルサービス本部 インフラストラクチャアーキテクトの大谷 真広、大木 和田留が翻訳しました。