Direct Connect 接続を介してプライベート API ゲートウェイに接続するにはどうすればよいですか?
最終更新日: 2022 年 1 月 21 日
AWS Direct Connect 接続を介してプライベート Amazon API Gateway に接続するにはどうすればよいですか?
解決方法
Amazon API Gateway サービス用の Amazon 仮想プライベートクラウド (Amazon VPC) エンドポイントを作成する
Amazon VPC エンドポイントを使用すると、VPC 内のプライベートリソースが API Gateway サービスと安全に通信できるようになります。API Gateway の Amazon VPC エンドポイントを作成するには:
- Amazon VPC コンソールを開きます。
- ナビゲーションペインの [Virtual Private Cloud] で、 [Endpoints] (エンドポイント) を選択します。
- [Service category] (サービスカテゴリー) で [AWS services] (AWS のサービス) を選択します。
- [Service Name] (サービス名) では、「execute-api」をキーワード検索します。これは、「com.amazonaws.REGION.execute-api」という単一の結果を返します。
- 「com.amazonaws.REGION.execute-api」を選択します。
- [VPC] で、Direct Connect 接続が設定されている Amazon VPC を選択します。
- [Subnets] (サブネット) で、API にアクセスできるようにするサブネットを選択します。
- [Enable DNS name] (DNS 名を有効にする) で、[Enable for this endpoint] (このエンドポイントで有効にする) ボックスをオフにします。この設定を無効にするには、Amazon VPC で [DNS hostnames] (DNS ホスト名) が有効になっている必要があります。これはオプション機能です。この設定を有効にしておくと、VPC が Amazon が提供する DNS を使用している場合、デプロイされた Amazon VPC 内のパブリック API Gateway API へのすべてのアクセスが中断されます。
- [Security group] (セキュリティグループ) で、Amazon VPC エンドポイントのセキュリティグループを選択します。セキュリティグループは、Amazon VPC からの TCP/443 インバウンドでのアクセスを許可する必要があります。
- [ポリシー] で、[フルアクセス] を選択します。このオプションは、AWS IAM 許可を使用して Amazon VPC から VPC エンドポイントへのすべての接続を許可します。
- [エンドポイントを作成] を選択します。
- Amazon VPC エンドポイント ID (例: 「vpce-01234567890abcdef」) を書き留めます。この ID は、API のリソースポリシーを編集するために後で必要になります。
プライベート REST API を作成する (まだ持っていない場合)
- API Gateway コンソールにログインします。
- Direct Connect 接続のリージョンを選択します。
- [Create API] を選択します。
- [API type] (API タイプ) については、[REST API Private] を選択します。
- API プロトコルについては、[REST] を選択します。
- [Create a New API] (新規 API の作成) で、[Example API] (API の例) を選択します。
- [Settings] (設定) で、[Endpoint Type] (エンドポイントの種類) が [Private] (プライベート) に設定されていることを確認します。
- [Import] (インポート) を選択します。
プライベート REST API にアクセスするための許可を Amazon VPC エンドポイントに付与する
- [API Management] (API の管理) のページで、[Resource Policy] (リソースポリシー) を選択します。
- 以下のポリシーを [Resource Policy] (リソースポリシー) にコピーします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "execute-api:/*/*/*",
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": "{{vpceID}}"
}
}
},
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "execute-api:/*/*/*"
}
]
}
{{vpceID}} の文字列を、VPC エンドポイントの作成後に書き留めた Amazon VPC エンドポイント ID に置き換えます。または、Amazon VPC コンソールの [Endpoints] (エンドポイント) で ID を見つけます。
注意: このポリシー例では、Amazon VPC から API 上のすべてのリソースへのアクセスを許可します。アクセスをさらに制限するには、Resource キーを変更します。
3. [保存] を選択します。
API をデプロイ して変更を適用する
API を作成してリソースポリシーを追加したので、API をステージにデプロイして変更を実装する必要があります。API をステージにデプロイするには、以下の手順に従います。
- API Gateway コンソールで、ナビゲーションペインから [Resources] (リソース) を選択します。
- [アクション] を選択します。
- [API Actions] (API アクション) で、[Deploy API] (API のデプロイ) を選択します。
- [Deployment stage] (デプロイされるステージ) で、[New Stage] (新規ステージ) を選択します。
- ステージの名前を入力します。
- [Deploy] (デプロイ) を選択します。変更が API にデプロイされます。このプロセスは、伝達に数分かかることがあります。
Direct Connect 接続から API へのアクセスをテストする
- Amazon VPC コンソールで [Endpoints] (エンドポイント) を選択し、作成した VPC エンドポイントを選択します。
- [Details] (詳細) で、VPC エンドポイントの DNS 名をコピーします。例:
「vpce-0123456789abcdef-b238e1kf.execute-api.REGION.vpce.amazonaws.com」 - Direct Connect を使用して Amazon VPC に接続しているコンピュータから、次のコマンドのいずれかを実行して、VPC エンドポイントの DNS ホスト名解決をテストします。
Windows PowerShell の場合:
nslookup <YOUR_VPCE_HOSTNAME>
- または -
macOS/Unix:
nslookup <YOUR_VPCE_HOSTNAME>
応答は、Amazon VPC エンドポイントに対応するプライベート IP アドレスを返す必要があります。応答でプライベート IP アドレスを受け取らない場合は、Amazon VPC コンソールの [Endpoints] (エンドポイント) で Amazon VPC エンドポイントのホスト名を確認します。
4. DNS が機能している場合は、テストの HTTP 要求を行います。これを行うには、API Gateway コンソールから API ID が必要です。リストから API ID をコピーします。API ID は「chw1a2q2xk」などの文字列です。
5. Direct Connect 接続に接続されたオンプレミスのコンピュータから、次のコマンドを実行します。
Windows PowerShell の場合:
curl -H @{'x-apigw-api-id' = '<YOUR_API_ID>'} https://<YOUR_VPCE_HOSTNAME>/<STAGE>
- または -
macOS/Unix:
curl -IX GET -H 'x-apigw-api-id:<YOUR_API_ID>' https://<YOUR_VPCE_HOSTNAME>/<STAGE>
応答の最初の行には「HTTP/1.1 200 OK」が含まれている必要があります。
応答を受信しない場合は、Amazon VPC エンドポイントに関連付けられたセキュリティグループが、送信元 IP アドレスからの TCP/443 でのインバウンド接続を許可していることを確認します。また、接続が Direct Connect 接続を適切に使用しているかどうかも確認してください。
「403 Forbidden」の応答を受け取った場合は、<YOUR_API_ID> ヘッダーが設定されていることを確認します。GET リクエストを送信していることを確認します。また、<STAGE> が正しく追加されていることを確認します。