Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
独自の CloudFront ディストリビューションで API ゲートウェイを設定する方法を教えてください。
Amazon API ゲートウェイにエッジ最適化された API エンドポイントが必要ですが、そのために独自の Amazon CloudFront ディストリビューションを作成したいと考えています。
簡単な説明
API クライアントが地理的に分散している場合は、API Gateway のエッジ最適化された API エンドポイントを使用します。このタイプのエンドポイントは、AWS マネージド CloudFront ウェブディストリビューションのリージョナルエンドポイントとして機能することで、クライアントの接続時間を短縮します。
グローバルな CloudFront コンテンツ配信ネットワークを使用し、ディストリビューションをより細かく制御するには、カスタム CloudFront ウェブディストリビューションで Regional API を使用します。
解決策
前提条件 API Gateway REST API と統合する AWS Lambda 関数を作成し、API Gateway で Regional API を作成します。
AWS Certificate Manager (ACM) で、us-east-1 リージョンおよび、お使いの API Gateway REST API と同じ AWS リージョンに SSL/TLS 証明書を作成します。ACM によって発行された、または ACM にインポートされたドメイン名用の証明書を取得するには、次の手順を実行します。
- インターネットドメインを登録します。Amazon Route 53 またはサードパーティの認定ドメインレジストラを使用できます。
- ACM でドメイン名の SSL/TLS 証明書を作成するか、ACM にインポートします。
API 用の GET メソッドを設定する
次の手順を実行します。
- API Gateway コンソールを開きます。
- 新しい Regional API の名前を選択します。
- [リソースを作成] を選択します。
- [リソース名] に greetings と入力します。
- [メソッドを作成] を選択します。
- [メソッドタイプ] に [GET] を選択し、[統合タイプ] に [Lambda 関数] を選択します。次に、[Lambda プロキシ統合] ボタンを切り替えて Lambda 関数を選択します。
API をデプロイし、API コール URL を特定する
次の手順を実行します。
- API をステージにデプロイします。
- ステージエディタペインの先頭で、greetings リソースの GET HTTP メソッド用の Invoke URL をクリップボードにコピーします。
API Gateway API 呼び出し URL の例:
https://restApiId.execute-api.region.amazonaws.com/stageName/greetings
API で 200 OK の応答が返されるかどうかをテストする
API が 200 OK 応答を返すことを確認するには、API Gateway コンソール、Postman アプリ、curl のいずれかを使用して API 呼び出し URL をテストします。Postman と curl の詳細については、Postman のウェブサイトと curl のウェブサイトを参照してください。
curl を使用して、API が 200 OK の応答を返すかどうかをテストする
使用するオペレーティングシステムに応じて、次のコマンドのいずれかを実行します。
注: https://restApiId.execute-api.region.amazonaws.com/stageNamee/greetings をお使いの API コール URL に置き換えます。
Linux では、次のコマンドを実行します。
curl -IX GET https://restApiId.execute-api.region.amazonaws.com/stageName/greetings
Windows PowerShell では、次のコマンドを実行します。
curl https://restApiId.execute-api.region.amazonaws.com/stageName/greetings
注: 200 OK 以外のステータスコードが表示された場合は、コンソールをチェックして API がステージにデプロイされていることを確認します。さらに、呼び出し URL がステージを正しく指定していることも確認します。
CloudFront ウェブディストリビューションを作成する
次の手順を実行します。
-
CloudFront コンソールを開きます。
-
[ディストリビューションの作成] を選択します。
-
[オリジンドメイン名] に、API 呼び出し URL を入力します。次に、ステージとリソース名を削除します。
オリジンドメイン名の例:https://restApiId.execute-api.region.amazonaws.com -
[プロトコル] で [HTTPS のみ] を選択します。
注: API Gateway は暗号化されていない (HTTP) エンドポイントをサポートしていません。詳細については、「Amazon API ゲートウェイに関するよくある質問」を参照してください。 -
最小オリジンSSLプロトコルには、TLSv1.2 を選択するのがベストプラクティスです。SSLv3 を選択しないようにしてください。API Gateway は SSLv3 プロトコルをサポートしていません。
-
[オリジンパス] では、API ステージ名の前にスラッシュを付けて入力します (/StageName)。または、URL を呼び出すときに自分でステージ名を入力する場合は、[オリジンパス] には入力しないでください。
注: [オリジンパス] に誤ったステージ名を入力した後に CloudFront ディストリビューションを呼び出すと、エラーが発生する場合があります。たとえば、「認証トークンが見つかりません」というメッセージと 403 Forbidden 応答コードを返すリクエスト不許可エラーが発生することがあります。 -
(オプション) カスタムヘッダーをオリジンに転送するには、[オリジンのカスタムヘッダー] に 1 つ以上のカスタムヘッダーを入力します。
-
該当する場合は、「API または CloudFront ウェブディストリビューションのカスタムドメイン名に IAM 認証を使用している場合」セクションの指示に従ってください。
-
(オプション) [ディストリビューション設定] で、カスタマイズする追加設定を構成します。
-
[ディストリビューションの作成] を選択します。
-
ディストリビューションがデプロイされるまで 15 ~ 20 分待ちます。コンソールでディストリビューションの [ステータス] が Deployed と表示されたら、ディストリビューションの準備ができています。
詳細については、「ディストリビューションを作成する」を参照してください。
CloudFront ウェブディストリビューションをテストする
次の手順を実行します。
-
CloudFront コンソールを開きます。
-
お使いのディストリビューションの [ディストリビューションのドメイン名] をクリップボードにコピーします。
非カスタムドメイン名の例:a222222bcdefg5.cloudfront.net -
ドメイン名で 200 OK 応答をテストします。500 server error コードが表示される場合は、ディストリビューションがデプロイされていない可能性があります。応答がない場合、CloudFront DNS レコードはまだ伝達されていません。いずれの場合も、ディストリビューションの作成後 15 ~ 20 分待ってから、手順を再試行してください。
重要: 上記のステップは、どのリソースメソッドでも AWS Identity and Access Management (IAM) 認証が有効になっていない API リソースを対象としています。IAM 認証を使用するメソッドがある場合は、API を呼び出すときに、ディストリビューションドメイン名の末尾にリソース名を追加します。呼び出し URL 全体 (リソース名を含む) は、次の例のいずれかのような形式をとります。
オリジンパスがある API Gateway API 起動 URL 例:
https://distributionDomainName/stageName/resourceName
オリジンパスがない API Gateway API 起動 URL 例:
https://distributionDomainName/resourceName
ディストリビューションをテストする方法の詳細については、「API Gateway API の IAM 認証を有効にする方法を教えてください」を参照してください。
API に IAM 認証を使用しているか、CloudFront ウェブディストリビューションのカスタムドメイン名を使用している場合
デフォルトでは、CloudFront は受信した認証ヘッダーをオリジン (このユースケースでは API Gateway) に転送しません。API に IAM 認証を使用しているか、ディストリビューションにカスタムドメイン名を使用している場合は、次のいずれかの操作を行います。
(IAM 認証用) 認証ヘッダーを CloudFront の許可リストに追加する
次の手順を実行します。
- CloudFront ディストリビューションを作成します。
- [ディストリビューションの作成] ページの [デフォルトのキャッシュ動作およびキャッシュキーとオリジンリクエスト] で、[レガシーキャッシュ] 設定を選択します。
- [ヘッダー ドロップダウンリストで [次のヘッダーを含める を選択します。次に、表示されたヘッダーのリストから [認証] を選択します。API に転送するヘッダーを設定します。
または、
[キャッシュキューとオリジンリクエスト] の [キャッシュポリシー] で、既存のキャッシュポリシーを選択するか、新しいキャッシュポリシーを作成します。ポリシーでは、CloudFront 許可リストに Authorization ヘッダーを追加する必要があります。 - (オプション) 設定をテストするために、次の操作を行います。
プログラムにより、API Gateway エンドポイントに必要な Signature Version 4 署名を作成します。host 値に、API Gateway の呼び出し URL を入力します。endpoint 値に、CloudFront ウェブディストリビューションの URL を入力します。
API Gateway 呼び出し URL の例:
CloudFront ウェブディストリビューション URL の例:example_api_id.execute.example_region.amazon.comd######.cloudfront.net
注: Postman アプリを使用している場合は、[認証] タブの [タイプ] で [AWS 署名] を選択します。次に、[アクセスキー] と [シークレットキー] を入力します。Postman は、入力した認証情報を使用して必要なヘッダーを生成します。次に、Signature Version 4 プロセスから生成された Authorization ヘッダー (およびすべての SignedHeaders) を使用して、API リクエストを CloudFront ディストリビューションに送信します。
(カスタムドメイン名または IAM 認証用) API にアクセスするために、API Gateway でリージョンのカスタムドメイン名を設定する
次の手順を実行します。
-
API Gateway で新しいリージョン API を作成するか、エッジ最適化された API Gateway API を Regional API に変更します。
-
API のリージョナルカスタムドメイン名を設定し、API の API マッピングを作成します。
注: CloudFront 経由で API にアクセスするときに、このカスタムドメイン名を使用します。 -
CloudFront ウェブディストリビューションを作成します。ただし、[オリジンドメイン名] には、API 呼び出し URL ではなく、API Gateway ターゲットのドメイン名を入力します。
注: カスタムドメイン詳細の [エンドポイント****設定] セクションで API Gateway ターゲットのドメイン名を特定します。
API Gateway のターゲットドメイン名の例:d-######.execute-api.example-region.amazonaws.com -
[ディストリビューションの作成] ページの [デフォルトのキャッシュ動作およびキャッシュキーとオリジンリクエスト] で [レガシーキャッシュ] 設定を選択します。
-
[ヘッダー ドロップダウンリストで [次のヘッダーを含める を選択します。次に、表示されたヘッダーのリストから Host と Authorization を選択します。API に転送するヘッダーを設定します。
または、
[キャッシュキューとオリジンリクエスト] の [キャッシュポリシー] で、既存のキャッシュポリシーを選択するか、新しいキャッシュポリシーを作成します。ポリシーでは、CloudFront 許可リストに Authorization ヘッダーを追加する必要があります。 -
[ディストリビューション設定] の [代替ドメイン名] に、作成したカスタムドメイン名を入力します。
-
[SSL 証明書] で [カスタム SSL 証明書] を選択します。次に、そのドメイン用の AWS Certificate Manager (ACM) 証明書を追加します。
-
CloudFront ウェブディストリビューションをデプロイしたら、カスタムドメインを CloudFront ウェブディストリビューションにマップするように DNS レコードを設定します。これを行うために、エイリアスまたは CNAME レコードを作成します。詳細については、「代替ドメイン名 (CNAME) を追加してカスタム URL を使用する」を参照してください。
-
(オプション) セットアップをテストするために、プログラムによりカスタムドメイン用の Signature Version 4 署名付きリクエストを作成します。
注: Postman アプリを使用してセットアップをテストすることもできます。

