独自の CloudFront ディストリビューションで API Gateway を設定する方法を教えてください。

最終更新日: 2020 年 8 月 7 日

Amazon API Gateway でエッジ最適化した API エンドポイントが必要なのですが、Amazon CloudFront ディストリビューションをより詳細に制御する必要があります。独自のディストリビューションを作成して使用できますか?

簡単な説明

API クライアントが地理的に分散している場合は、API Gateway でエッジ最適化された API エンドポイントが必要になる場合があります。このタイプのエンドポイントは、リージョンのエンドポイントのように動作しますが、クライアントの接続時間を短縮するために AWS マネージド型の CloudFront ウェブディストリビューションが前面にあります。

ただし、配信をより詳細に制御しながら、グローバルな CloudFront コンテンツ配信ネットワークの利点を得ることができます。この設定では、リージョン API を使用して、カスタム CloudFront ディストリビューションをその前に手動で割り当てます。

解決方法

API Gateway でリージョン API を作成し、以下の手順に従います。

API の GET メソッドをセットアップする

  1. API Gateway コンソールで、新しいリージョンの API の名前を選択します。
  2. [Resources] ペインで [Actions] を選択し、[Create Method] をクリックします。
  3. / resource ノードの下に表示されるリストから [GET] を選択し、チェックマークアイコンをクリックします。
  4. [/ - GET - Setup] で [Integration type] に対し、[Mock]、[Save] の順にクリックします。モック統合はそれに到達したすべての要求に応答しますが、これは後のテストの際に役立ちます。

API をデプロイし、invoke URL を取得する

  1. API をステージにデプロイします。
  2. [Stage Editor] ペインの上部で、[Invoke URL] をクリップボードにコピーします。URL は次のようになります。
    https://restApiId.execute-api.region.amazonaws.com/stageName.

API をテストする

API Gateway コンソールPostman アプリ、またはコマンドラインインターフェイスの curl を使用して、「200」HTTP ステータスコードの API の呼び出し URL をテストします。curl の詳細については、curl プロジェクトのウェブサイトをご覧ください。

curl を使用して、次のいずれかを実行します。

注: これらのコマンドで、https://restApiId.execute-api.region.amazonaws.com/stageName を API の invoke URL に置き換えます。

Linux では、次のコマンドを実行します。

curl -IX GET https://restApiId.execute-api.region.amazonaws.com/stageName

Windows PowerShell では、次のコマンドを実行します。

curl https://restApiId.execute-api.region.amazonaws.com/stageName

: 「200」以外のステータスコードが表示された場合は、コンソールで API をステージにデプロイしたことを確認してください。また、URL でステージを指定したことも確認します。

CloudFront ウェブディストリビューションを作成する

  1. CloudFront コンソール で、[Create Distribution] を選択します。
  2. [Select a delivery method for your content] のページにある [Web] で、[Get Started] をクリックします。
  3. [Create Distribution] のページの [Origin Domain Name] に、API の invoke URL を貼り付けますが、ステージ名は削除します。例:
    https://1a2bc3d456.execute-api.us-east-1.amazonaws.com
  4. [Origin Path] に、API のステージ名を先頭にスラッシュを付けて (/stageName) 入力します。あるいは、URL を呼び出すときにステージ名を自分で入力する場合は、 [Origin Path] を入力しないでください。
    : [Origin Path] に間違ったステージ名を入力すると、CloudFront ディストリビューションを呼び出したときにエラーが発生することがあります。たとえば、「認証トークンが不足しています」というメッセージを返す承認されていないリクエストエラーや、403 Forbidden レスポンスコードなどです。
  5. [Minimum Origin SSL Protocol] では、[TLSv1.2] のみを選択することをお勧めします。[SSLv3] は選択しないでください。API Gateway はこのプロトコルをサポートしていません。
  6. [Origin Protocol Policy] では、[HTTPS Only] を選択します。
    注: API Gateway は暗号化されていない (HTTP) エンドポイントをサポートしていません。詳細については、Amazon API Gateway のよくある質問をご参照ください。
  7. (オプション) カスタムヘッダーをオリジンに転送するには、[Origin Custom Headers] に 1 つ以上のカスタムヘッダーを入力します。
    注意: CloudFront がオリジンに転送できないカスタムヘッダーがあります。
  8. API で IAM 認証を有効にした場合、または後で有効にする場合は、許可リストに Authorization リクエストヘッダーを追加する必要があります。[Cache Based on Selected Request Headers] (選択したリクエストヘッダーに基づくキャッシュ) では、[Whitelist] (ホワイトリスト) を選択します。Whitelist Headers (ホワイトリストのヘッダー) で、許可されるヘッダーのリストに Authorization を追加します。
    重要: [Cache Based on Selected Request Headers] (選択したリクエストヘッダーに基づくキャッシュ) 設定を [All] (すべて) に変更した場合、または Host ヘッダーを許可した場合、セットアップは機能しません。詳細については、リクエストヘッダーに基づくコンテンツのキャッシュを参照してください。
  9. (オプション) CloudFront が割り当てる代わりに独自のカスタムドメイン名をディストリビューションに使用するには、[Alternate Domain Names (CNAME)] (代替ドメイン名 (CNAME)) に複数のドメイン名を入力してください。詳細については、代替ドメイン名 (CNAME) を追加してカスタム URL を使用するを参照してください。
  10. (オプション) カスタマイズする追加設定を設定します。
  11. [Create Distribution] をクリックします。
  12. ディストリビューションがデプロイされるまで待ちます。これには 15~20 分かかります。コンソールで [Status] (ステータス) が Deployed と表示されると、ディストリビューションは準備完了です。

詳細については、ディストリビューションの作成を参照してください。

CloudFront ウェブディストリビューションをテストする

  1. CloudFront コンソール で、ディストリビューションの Domain Name を書き留めます。カスタムドメイン名を使用しなかった場合、ドメインは a222222bcdefg5.cloudfront.net のようになります。
  2. 前出の Test your API セクションで述べたコマンドのいずれかを使用して、「200」HTTP ステータスコードのドメイン名をテストします。
    : 特定の API リソースのメソッドで IAM 認証を有効にした場合、API を呼び出すときにディストリビューションドメイン名の末尾にリソース名を追加する必要があります。リソース名を含む完全な invoke URL は、ディストリビューションの作成時に [Origin Path] を入力したかどうかに応じて、以下の URL のいずれかになります。https://distributionDomainName/resourceName または https://distributionDomainName/stageName/resourceName。このユースケースのテストの詳細については、「API Gateway API に IAM 認証を有効化するにはどうすればよいですか?」をご参照ください。

:「500」サーバーエラーコードが表示された場合は、ディストリビューションが完全にデプロイされていない可能性があります。応答がない場合、CloudFront DNS レコードがまだ完全に伝達されていない可能性があります。いずれの場合も、ディストリビューションを作成してから 15~20 分経過していることを確認し、手順を再試行します。

これで、作成したディストリビューションを API で使用し、CloudFront URL を使って API の任意のリソースにアクセスできます。