プライベート API の作成 - Amazon API Gateway

プライベート API の作成

プライベート API を作成する前に、まず API Gateway 用の VPC エンドポイントを作成します。次に、プライベート API を作成してリソースポリシーをアタッチします。必要に応じて、VPC エンドポイントをプライベート API に関連付けることで、API の呼び出し方法を簡素化できます。最後に、API をデプロイします。

これを行う方法を、以下の手順で示します。プライベート REST API は、AWS Management Console、AWS CLI、または AWS SDK を使用して作成できます。

前提条件

この手順を実行するには、完全に設定された VPC が必要です。デフォルトの VPC を作成するには、「Amazon VPC ユーザーガイド」の「VPC のみを作成する」を参照してください。VPC の作成時にすべての推奨ステップを実行するには、プライベート DNS を有効にします。これにより、ホストまたは x-apigw-api-id ヘッダーを渡すことなく、VPC 内で API を呼び出すことができます。

プライベート DNS を有効にするには、VPC の enableDnsSupport 属性と enableDnsHostnames 属性を true に設定する必要があります。詳細については、「VPC の DNS サポート」および「VPC の DNS サポートの更新」を参照してください。

ステップ 1: API Gateway 用の VPC エンドポイントを VPC に作成する

次の手順は、API Gateway 用の VPC エンドポイントを作成する方法を示しています。API Gateway 用の VPC エンドポイントを作成するには、プライベート API を作成する先の AWS リージョンで execute-api ドメインを指定します。execute-api ドメインは、API 実行用の API Gateway コンポーネントサービスです。

API Gateway 用の VPC エンドポイントを作成するときは、DNS 設定を指定します。プライベート DNS をオフにすると、パブリック DNS を介してのみ API にアクセスできます。詳細については、「問題: API Gateway VPC エンドポイントからパブリック API に接続できません」を参照してください。

AWS Management Console
API Gateway 用のインターフェイス VPC エンドポイントを作成するには
  1. AWS Management Console にサインインして、Amazon VPC コンソール (https://console.aws.amazon.com/vpc/) を開きます。

  2. ナビゲーションペインの [仮想プライベートクラウド] で、[VPC] を選択します。

  3. [エンドポイントの作成] を選択します。

  4. (オプション) [名前タグ] に、VPC エンドポイントを識別するのに役立つ名前を入力します。

  5. [Service category] (サービスカテゴリ) で、[AWS services] (のサービス) を選択します。

  6. [サービス] で、検索バーに「execute-api」と入力します。次に、API を作成する先の AWS リージョンで API Gateway サービスエンドポイントを選択します。サービス名は com.amazonaws.us-east-1.execute-api のようになり、[タイプ][インターフェイス] になります。

  7. [VPC] の場合は、エンドポイントを作成する VPC を選択します。

  8. (オプション) [プライベート DNS 名を有効化] をオフにするには、[その他の設定] を選択し、[プライベート DNS 名を有効化] をオフにします。

  9. [サブネット] で、エンドポイントネットワークインターフェイスを作成したアベイラビリティーゾーンを選択します。API の可用性を高めるには、複数のサブネットを選択します。

  10. [セキュリティグループ] で、VPC エンドポイントネットワークインターフェイスに関連付けるセキュリティグループを選択します。

    選択したセキュリティグループでは、VPC の IP 範囲または VPC 内の別のセキュリティグループのいずれかからの TCP ポート 443 インバウンド HTTPS トラフィックを許可するように設定する必要があります。

  11. [ポリシー] で、以下のいずれかを実行します。

    • プライベート API を作成していないか、カスタム VPC エンドポイントポリシーを設定しない場合は、[フルアクセス] を選択します。

    • プライベート API を既に作成していて、カスタム VPC エンドポイントポリシーを設定する場合は、カスタム VPC エンドポイントポリシーを入力できます。詳細については、「API Gateway でプライベート API 用の VPC エンドポイントポリシーを使用する」を参照してください。

    VPC エンドポイントポリシーは、VPC エンドポイントの作成後に更新できます。詳細については、「VPC エンドポイントポリシーを更新する」を参照してください。

  12. [エンドポイントの作成] を選択します。

  13. 結果の VPC エンドポイント ID をコピーしておきます。これは、以降のステップで使用する場合があります。

AWS CLI

次の create-vpc-endpoint コマンドを使用して VPC エンドポイントを作成できます。

aws ec2 create-vpc-endpoint \ --vpc-id vpc-1a2b3c4d \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.us-east-1.execute-api \ --subnet-ids subnet-7b16de0c \ --security-group-id sg-1a2b3c4d

結果の VPC エンドポイント ID をコピーしておきます。これは、以降のステップで使用する場合があります。

ステップ 2: プライベート API を作成する

VPC エンドポイントを作成したら、プライベート REST API を作成します。次の手順で、プライベート API を作成する方法を示します。

AWS Management Console
プライベート API を作成するには
  1. https://console.aws.amazon.com/apigateway で API Gateway コンソールにサインインします。

  2. [API の作成] を選択します。

  3. [REST API] で、[構築] を選択します。

  4. [ロール名] に名前を入力します。

  5. (オプション) [説明] に説明を入力します。

  6. [API エンドポイントタイプ] で、[プライベート] を選択します。

  7. (オプション) [VPC エンドポイント ID] に、VPC エンドポイント ID を入力します。

    VPC エンドポイント ID をプライベート API に関連付ける場合は、Host ヘッダーを上書きしたり、x-apigw-api-id header を渡したりすることなく、VPC 内から API を呼び出すことができます。詳細については、「(オプション) VPC エンドポイントとプライベート API の関連付けまたは関連付けの解除」を参照してください。

  8. API の作成 を選択します。

ここまでの手順を完了したら、「REST API コンソールの使用を開始する」の手順に従って、この API のメソッドと統合を設定できます。ただし、API をデプロイすることはできません。API をデプロイするには、ステップ 3 に従い、リソースポリシーを API にアタッチします。

AWS CLI

次の create-rest-api コマンドは、プライベート API を作成する方法を示しています。

aws apigateway create-rest-api \ --name 'Simple PetStore (AWS CLI, Private)' \ --description 'Simple private PetStore API' \ --region us-west-2 \ --endpoint-configuration '{ "types": ["PRIVATE"] }'

呼び出しに成功すると、次のような出力が返されます。

{ "createdDate": "2017-10-13T18:41:39Z", "description": "Simple private PetStore API", "endpointConfiguration": { "types": "PRIVATE" }, "id": "0qzs2sy7bh", "name": "Simple PetStore (AWS CLI, Private)" }

ここまでの手順を完了したら、「チュートリアル: AWS SDK または AWS CLI を使用して REST API を作成する」の手順に従って、この API のメソッドと統合を設定できます。ただし、API をデプロイすることはできません。API をデプロイするには、ステップ 3 に従い、リソースポリシーを API にアタッチします。

SDK JavaScript v3

次の例は、AWS SDK for JavaScript v3 を使用してプライベート API を作成する方法を示しています。

import {APIGatewayClient, CreateRestApiCommand} from "@aws-sdk/client-api-gateway"; const apig = new APIGatewayClient({region:"us-east-1"}); const input = { // CreateRestApiRequest name: "Simple PetStore (JavaScript v3 SDK, private)", // required description: "Demo private API created using the AWS SDK for JavaScript v3", version: "0.00.001", endpointConfiguration: { // EndpointConfiguration types: [ "PRIVATE"], }, }; export const handler = async (event) => { const command = new CreateRestApiCommand(input); try { const result = await apig.send(command); console.log(result); } catch (err){ console.error(err) } };

呼び出しに成功すると、次のような出力が返されます。

{ apiKeySource: 'HEADER', createdDate: 2024-04-03T17:56:36.000Z, description: 'Demo private API created using the AWS SDK for JavaScript v3', disableExecuteApiEndpoint: false, endpointConfiguration: { types: [ 'PRIVATE' ] }, id: 'abcd1234', name: 'Simple PetStore (JavaScript v3 SDK, private)', rootResourceId: 'efg567', version: '0.00.001' }

ここまでの手順を完了したら、「チュートリアル: AWS SDK または AWS CLI を使用して REST API を作成する」の手順に従って、この API のメソッドと統合を設定できます。ただし、API をデプロイすることはできません。API をデプロイするには、ステップ 3 に従い、リソースポリシーを API にアタッチします。

Python SDK

次の例は、 AWS SDK for Python を使用してプライベート API を作成する方法を示しています。

import json import boto3 import logging logger = logging.getLogger() apig = boto3.client('apigateway') def lambda_handler(event, context): try: result = apig.create_rest_api( name='Simple PetStore (Python SDK, private)', description='Demo private API created using the AWS SDK for Python', version='0.00.001', endpointConfiguration={ 'types': [ 'PRIVATE', ], }, ) except botocore.exceptions.ClientError as error: logger.exception("Couldn't create private API %s.", error) raise attribute=["id", "name", "description", "createdDate", "version", "apiKeySource", "endpointConfiguration"] filtered_data ={key:result[key] for key in attribute} result = json.dumps(filtered_data, default=str, sort_keys='true') return result

呼び出しに成功すると、次のような出力が返されます。

"{\"apiKeySource\": \"HEADER\", \"createdDate\": \"2024-04-03 17:27:05+00:00\", \"description\": \"Demo private API created using the AWS SDK for \", \"endpointConfiguration\": {\"types\": [\"PRIVATE\"]}, \"id\": \"abcd1234\", \"name\": \"Simple PetStore (Python SDK, private)\", \"version\": \"0.00.001\"}"

ここまでの手順を完了したら、「チュートリアル: AWS SDK または AWS CLI を使用して REST API を作成する」の手順に従って、この API のメソッドと統合を設定できます。ただし、API をデプロイすることはできません。API をデプロイするには、ステップ 3 に従い、リソースポリシーを API にアタッチします。

ステップ 3: プライベート API のリソースポリシーをセットアップする

現在のプライベート API は、すべての VPC からアクセスできるわけではありません。リソースポリシーを使用して、VPC と VPC エンドポイントにプライベート API へのアクセスを許可します。任意の AWS アカウントで VPC エンドポイントへのアクセスを許可できます。

リソースポリシーには、アクセスを制限するための aws:SourceVpc 条件や aws:SourceVpce 条件を含める必要があります。特定の VPC と VPC エンドポイントに限定することにして、すべての VPC や VPC エンドポイントにアクセスを許可するリソースポリシーは作成しないようお勧めします。

次の手順は、リソースポリシーを API にアタッチする方法を示しています。

AWS Management Console
  1. https://console.aws.amazon.com/apigateway で API Gateway コンソールにサインインします。

  2. REST API を選択します。

  3. 左のナビゲーションペインで、[リソースポリシー] を選択します。

  4. [Create policy] を選択します。

  5. [テンプレートを選択] を選択し、[ソース VPC] を選択します。

  6. {{vpceID}} (中括弧を含む) を VPC エンドポイント ID に置き換えます。

  7. [Save changes] (変更の保存) をクリックします。

AWS CLI

次の update-rest-api コマンドは、リソースポリシーを既存の API にアタッチする方法を示しています。

aws apigateway update-rest-api \ --rest-api-id a1b2c3 \ --patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"'

また、VPC エンドポイントにアクセスできるリソースを制御することもできます。VPC エンドポイントにアクセスできるリソースを制御するには、エンドポイントポリシーを VPC エンドポイントにアタッチします。詳細については、「API Gateway でプライベート API 用の VPC エンドポイントポリシーを使用する」を参照してください。

(オプション) VPC エンドポイントとプライベート API の関連付けまたは関連付けの解除

VPC エンドポイントをプライベート API に関連付けると、API Gateway は新しい Route 53 エイリアス DNS レコードを生成します。このレコードを使用して、Host ヘッダーを上書きしたり、x-apigw-api-id ヘッダーを渡したりすることなく、パブリック API を呼び出す場合と同じように、プライベート API を呼び出すことができます。

生成されたベース URL は次の形式になります。

https://{rest-api-id}-{vpce-id}.execute-api.{region}.amazonaws.com/{stage}
Associate a VPC endpoint (AWS Management Console)

VPC エンドポイントは、作成時または作成後にプライベート API に関連付けることができます。次の手順は、VPC エンドポイントを以前に作成した API に関連付ける方法を示しています。

VPC エンドポイントをプライベート API に関連付けるには
  1. https://console.aws.amazon.com/apigateway で API Gateway コンソールにサインインします。

  2. プライベート API を選択します。

  3. 左のナビゲーションペインで、[リソースポリシー] を選択します。

  4. 追加の VPC エンドポイントからの呼び出しを許可するようにリソースポリシーを編集します。

  5. メインナビゲーションペインで、[API キー] を選択します。

  6. [API の詳細] セクションで [編集] を選択します。

  7. [VPC エンドポイント ID] で、追加の VPC エンドポイント ID を選択します。

  8. [Save] を選択します。

  9. 変更を有効にするには、API を再デプロイします。

Dissociate a VPC endpoint (AWS Management Console)
プライベート REST API から VPC エンドポイントの関連付けを解除するには
  1. https://console.aws.amazon.com/apigateway で API Gateway コンソールにサインインします。

  2. プライベート API を選択します。

  3. 左のナビゲーションペインで、[リソースポリシー] を選択します。

  4. リソースポリシーを編集して、プライベート API との関連付けを解除する VPC エンドポイントへの言及を削除します。

  5. メインナビゲーションペインで、[API キー] を選択します。

  6. [API の詳細] セクションで [編集] を選択します。

  7. [VPC エンドポイント ID] で、[X] を選択して VPC エンドポイントの関連付けを解除します。

  8. [Save] を選択します。

  9. 変更を有効にするには、API を再デプロイします。

Associate a VPC endpoint (AWS CLI)

次の create-rest-api コマンドは、API の作成時に VPC エンドポイントを関連付ける方法を示しています。

aws apigateway create-rest-api \ --name Petstore \ --endpoint-configuration '{ "types": ["PRIVATE"], "vpcEndpointIds" : ["vpce-0212a4ababd5b8c3e", "vpce-0393a628149c867ee"] }' \ --region us-west-2

出力は次のようになります。

{ "apiKeySource": "HEADER", "endpointConfiguration": { "types": [ "PRIVATE" ], "vpcEndpointIds": [ "vpce-0212a4ababd5b8c3e", "vpce-0393a628149c867ee" ] }, "id": "u67n3ov968", "createdDate": 1565718256, "name": "Petstore" }

次の update-rest-api コマンドは、VPC エンドポイントを作成済みの API に関連付ける方法を示しています。

aws apigateway update-rest-api \ --rest-api-id u67n3ov968 \ --patch-operations "op='add',path='/endpointConfiguration/vpcEndpointIds',value='vpce-01d622316a7df47f9'" \ --region us-west-2

出力は次のようになります。

{ "name": "Petstore", "apiKeySource": "1565718256", "tags": {}, "createdDate": 1565718256, "endpointConfiguration": { "vpcEndpointIds": [ "vpce-0212a4ababd5b8c3e", "vpce-0393a628149c867ee", "vpce-01d622316a7df47f9" ], "types": [ "PRIVATE" ] }, "id": "u67n3ov968" }

変更を有効にするには、API を再デプロイします。

Disassociate a VPC endpoint (AWS CLI)

次の update-rest-api コマンドは、プライベート API から VPC エンドポイントの関連付けを解除する方法を示しています。

aws apigateway update-rest-api \ --rest-api-id u67n3ov968 \ --patch-operations "op='remove',path='/endpointConfiguration/vpcEndpointIds',value='vpce-0393a628149c867ee'" \ --region us-west-2

出力は次のようになります。

{ "name": "Petstore", "apiKeySource": "1565718256", "tags": {}, "createdDate": 1565718256, "endpointConfiguration": { "vpcEndpointIds": [ "vpce-0212a4ababd5b8c3e", "vpce-01d622316a7df47f9" ], "types": [ "PRIVATE" ] }, "id": "u67n3ov968" }

変更を有効にするには、API を再デプロイします。

ステップ 4: プライベート API をデプロイする

API をデプロイするには、API デプロイを作成してステージに関連付けます。次の手順は、プライベート API をデプロイする方法を示しています。

AWS Management Console
プライベート API をデプロイするには
  1. API を選択します。

  2. [API のデプロイ] を選択します。

  3. [ステージ][新規ステージ] を選択します。

  4. [ステージ名] に、ステージ名を入力します。

  5. (オプション) [説明] に説明を入力します。

  6. [デプロイ] を選択します。

AWS CLI

次の create-deployment コマンドは、プライベート API をデプロイする方法を示しています。

aws apigateway create-deployment --rest-api-id a1b2c3 \ --stage-name test \ --stage-description 'Private API test stage' \ --description 'First deployment'

プライベート API のトラブルシューティング

次に、プライベート API の作成時に発生する可能性があるエラーや問題に関するトラブルシューティングのアドバイスを示します。

問題: API Gateway VPC エンドポイントからパブリック API に接続できません

VPC を作成するときに、DNS 設定を構成できます。VPC のプライベート DNS をオンにすることをお勧めします。プライベート DNS をオフにすることを選択した場合、API にはパブリック DNS 経由でのみアクセスできます。

プライベート DNS を有効にすると、VPC エンドポイントからパブリック API Gateway API のデフォルトエンドポイントにアクセスできなくなります。カスタムドメイン名を使用して API にアクセスできます。

リージョンのカスタムドメイン名を作成する場合は、A タイプのエイリアスレコードを使用します。エッジ最適化カスタムドメイン名を作成する場合は、レコードタイプに制限はありません。これらのパブリック API には、プライベート DNS を有効にしてアクセスできます。詳細については、「問題: API Gateway VPC エンドポイントからパブリック API に接続できません」を参照してください。

問題: API が {"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:********/****/****/"} を返します

リソースポリシーで、プリンシパルを次のように AWS プリンシパルに設定する場合:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", ""Principal": { "AWS": [ "arn:aws:iam::account-id:role/developer", "arn:aws:iam::account-id:role/Admin" ] }, "Action": "execute-api:Invoke", "Resource": [ "execute-api:/*" ] }, ... }

API のすべてのメソッドに AWS_IAM 認可を使用する必要があります。使用しない場合、API は前のエラーメッセージを返します。メソッドの AWS_IAM 認可を有効にする方法の詳細については、「API Gateway の REST API のメソッド」を参照してください。

問題: VPC エンドポイントが API に関連付けられているかどうかわかりません

VPC エンドポイントをプライベート API に関連付けるか、関連付けを解除する場合は、API を再デプロイする必要があります。DNS 伝播のため、更新オペレーションが完了するまでに数分かかることがあります。この間、API は使用できますが、新しく生成された DNS URL の DNS 伝達がまだ進行中である可能性があります。数分経っても新しい URL が DNS に解決されない場合は、API を再デプロイすることをお勧めします。