Amazon API Gateway
開発者ガイド

Amazon API Gateway でプライベート API を作成する

Amazon API Gateway を使用すると、インターフェイス VPC エンドポイントを使用する Amazon Virtual Private Cloud(VPC) からしかアクセスできないプライベート REST API を作成できます。インターフェイス VPC エンドポイントは、VPC 内に作成するエンドポイントネットワークインターフェイス (ENI) です。リソースポリシーを使用して、選択した VPC および VPC エンドポイント (複数の AWS アカウント含む) から API へのアクセスを許可または拒否できます。各エンドポイントを使用して複数のプライベート API にアクセスできます。AWS Direct Connect を使用して、オンプレミスネットワークから Amazon VPC に接続を確立し、その接続経由でプライベート API にアクセスすることもできます。いずれの場合も、プライベート API へのトラフィックは安全な接続を使用し、Amazon のネットワークの外には出ません。パブリックインターネットからは隔離されています。

プライベート API へのアクセスには、次の図に示すように、API Gateway 用のインターフェイス VPC エンドポイントを経由します。プライベート DNS が有効になっている場合は、プライベートまたはパブリック DNS 名を使用して API にアクセスできます。プライベート DNS が無効になっている場合は、パブリック DNS 名のみを使用できます。

 プライベート DNS を有効にしたプライベート API へのアクセス

概要レベルでは、プライベート API を作成する手順は次のとおりです。

  1. まず、API 実行用に API Gateway コンポーネントサービスのインターフェイス VPC エンドポイント (execute-api といいます) を VPC 内に作成します。

  2. プライベート API を作成してテストします。

    1. 次のいずれかの手順に従って API を作成します。

    2. VPC エンドポイントにアクセス権限を付与するには、リソースポリシーを作成して API にアタッチします

    3. API をテストします

注記

次の手順では、完全に設定された VPC が既にあることを前提としています。VPC の詳細を確認したり、作成を開始したりするには、『Amazon VPC ユーザーガイド』の「Amazon VPC の開始方法」を参照してください。

API Gateway のインターフェイス VPC エンドポイント execute-api の作成

API 実行の API Gateway コンポーネントサービスは execute-api と呼ばれます。プライベート API がデプロイされた後、それにアクセスするには、VPC でインターフェイス VPC エンドポイントを作成する必要があります。

VPC エンドポイントを作成すると、複数のプライベート API へのアクセスに使用することができます。

API Gateway のインターフェイス VPC エンドポイント execute-api を作成するには

  1. Amazon VPC コンソール (https://console.aws.amazon.com/vpc/) にログインします。

  2. ナビゲーションペインで、[Endpoints]、[Create Endpoint] の順に選択します。

  3. [Service category] で、[AWS services] が選択されていることを確認します。

  4. [サービス名] で、接続するリージョンを含む API Gateway サービスエンドポイントを選択します。これは com.amazonaws.region.execute-api という形式になります。たとえば、com.amazonaws.us-east-1.execute-api です。

    [Type] で、タイプが [Interface] になっていることを確認します。

  5. 以下の情報を入力します。

    • [VPC] で、エンドポイントを作成する VPC を選択します。

    • [サブネット] で、エンドポイントネットワークインターフェイスを作成する先のサブネット (アベイラビリティーゾーン) を選択します。

      注記

      AWS の一部のサービスは、一部のアベイラビリティーゾーンでサポートされていない場合があります。

    • [プライベート DNS 名を有効にする] で、オプションとしてインターフェイスエンドポイントのプライベート DNS を有効にするチェックボックスを選択できます。

      プライベート DNS を有効にすることを選択した場合、API にプライベートまたはパブリック DNS を経由してアクセスできます。これが推奨される選択です。

      プライベート DNS を有効にしないことを選択した場合、API にはパブリック DNS を経由でのみアクセスできます。

      この設定は、API にアクセスできるユーザーには影響を与えません。DNS アドレスの使用方法にのみ関係します。

      注記

      オプションとしてプライベート DNS を使用するには、VPC の enableDnsSupport および enableDnsHostnames 属性を true に設定する必要があります。詳細については、Amazon VPC ユーザーガイドの「VPC の DNS サポート」および「VPC の DNS サポートを更新する」を参照してください。

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

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

  6. [Create endpoint] を選択します。

API Gateway コンソールを使用してプライベート API を作成する

API Gateway コンソールを使用してプライベート API を作成するには

  1. API Gateway コンソールにログインし、[+ Create API] を選択します。

  2. [Create new API] で、[New API] オプションを選択します。

  3. [API name] に名前 (Simple PetStore (Console, Private) など) を入力します。

  4. [Endpoint Type (エンドポイントタイプ)] で、Private を選択します。

  5. [Create API] を選択します。

ここから、「HTTP カスタム統合で API を作成する」のステップ 1 ~ 6 で説明されているように、API のメソッドとその関連する統合をセットアップできます。

注記

API に VPC または VPC エンドポイントに対するアクセス権限を付与するリソースポリシーがない場合、すべての API コールは失敗します。API をテストしてデプロイする 前に、リソースポリシーを作成して API にアタッチする必要があります (「プライベート API のリソースポリシーをセットアップする」を参照)。

AWS CLI を使用してプライベート API を作成する

AWS CLI を使用してプライベート API を作成するには、create-rest-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 CLI コマンドを使用してエッジ最適化された API をセットアップする」で説明している同様の手順に従って、この API のメソッドと統合を設定できます。

API をテストする際は、「プライベート API のリソースポリシーをセットアップする」で説明されているように、リソースポリシーが作成され API にアタッチされていることを確認してください。

AWS SDK for JavaScript を使用してプライベート API を作成する

AWS SDK for JavaScript を使用してプライベート API を作成するには:

apig.createRestApi({ name: "Simple PetStore (node.js SDK, private)", endpointConfiguration: { types: ['PRIVATE'] }, description: "Demo private API created using the AWS SDK for node.js", version: "0.00.001" }, function(err, data){ if (!err) { console.log('Create API succeeded:\n', data); restApiId = data.id; } else { console.log('Create API failed:\n', err); } });

成功のレスポンスには、以下のような出力が含まれます。

{ "createdDate": "2017-10-13T18:41:39Z", "description": "Demo private API created using the AWS SDK for node.js", "endpointConfiguration": { "types": "PRIVATE" }, "id": "0qzs2sy7bh", "name": "Simple PetStore (node.js SDK, private)" }

ここまでの手順を完了したら、「 Node.js の AWS SDK を使用してエッジ最適化された API をセットアップする 」の手順に従って、この API のメソッドと統合を設定できます。

API をテストする際は、「プライベート API のリソースポリシーをセットアップする」で説明されているように、リソースポリシーが作成され API にアタッチされていることを確認してください。

API Gateway REST API を使用してプライベート API を作成する

API Gateway REST API を使用してプライベート API を作成するには、以下のように POST リクエストを送信します。

POST /restapis HTTP/1.1 Host: apigateway.us-west-2.amazonaws.com Content-Type: application/x-amz-json-1.0 X-Amz-Date: 20170511T214723Z Authorization: AWS4-HMAC-SHA256 Credential={ACCESS-KEY-ID}/20170511/us-west-2/apigateway/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date, Signature=d0abd98a2a06199531c2916b162ede9f63a247032cdc8e4d077216446d13103c { "name": "Simple PetStore (REST API, Private)", "description": "A sample API Gateway API created using the REST API.", "endpointConfiguration" : { "types" : ["PRIVATE"] } }

成功のレスポンスには、201 Created ステータスコードと以下のような本文が含まれます。

{ "createdDate": "2017-10-13T18:41:39Z", "description": "A sample API Gateway API created using the REST API.", "endpointConfiguration": { "types": "PRIVATE" }, "id": "0qzs2sy7bh", "name": "Simple PetStore (REST API, Private)" }

ここまでの手順を完了したら、「API Gateway REST API を使用してエッジ最適化 API をセットアップする」の手順に従って、この API のメソッドと統合を設定できます。

API をテストする際は、「プライベート API のリソースポリシーをセットアップする」で説明されているように、リソースポリシーが作成され API にアタッチされていることを確認してください。

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

プライベート API にアクセスするには、リソースポリシーを作成して API にアタッチする必要があります。これにより、VPC および VPC エンドポイント、または明示的にアクセス権限を付与された別の AWS アカウントの VPC および VPC エンドポイントから API へのアクセス権限が付与されます。

これを行うには、「API Gateway リソースポリシーを作成して API にアタッチする」の手順に従います。ステップ 4 では、[Source VPC Whitelist (ソース VPC ホワイトリスト)] の例を選択します。{{vpceID}} (中括弧を含む) を使用する VPC エンドポイント ID に置き換え、[Save (保存)] を選択してリソースポリシーを保存します。

API Gateway コンソールを使用してプライベート API をデプロイする

プライベート API をデプロイするには、API Gateway コンソールで以下を実行します。

  1. 左ナビゲーションペインで API を選択し、[Actions (アクション)] ドロップダウンメニューから [Deploy API (API のデプロイ)] を選択します。

  2. [Deploy API] ダイアログで、ステージ (または、API の最初のデプロイの場合は [[New Stage]]) を選択し、名前 (例: "test"、"prod"、"dev" など) を [Stage name] 入力フィールドに入力します。オプションで、[Stage description] または [Deployment description] (またはその両方) に説明を入力し、[Deploy] を選択します。

プライベート API を呼び出す方法

プライベート API のデプロイが完了したら、プライベート DNS 経由 (プライベート DNS を有効にしている場合) およびパブリック DNS 経由でアクセスできます。

プライベート API の DNS 名を取得するには、以下を実行します。

  1. Amazon VPC コンソール (https://console.aws.amazon.com/vpc/) にログインします。

  2. 左側のナビゲーションペインで、[エンドポイント] を選択し、API Gateway 用のインターフェイス VPC エンドポイントを選択します。

  3. [詳細] ペインで、[DNS 名] フィールドに 4 つの値が表示されます。最初の 2 つは API 用のプライベート DNS 名です。残りの 2 つはパブリック DNS 名です。

プライベート DNS 名を使用してプライベート API を呼び出す

プライベート DNS を有効にしている場合は、次のようにプライベート DNS 名を使用してプライベート API にアクセスできます。

{restapi-id}.execute-api.{region}.amazonaws.com

API を呼び出すためのベース URL は次の形式です。

https://{restapi-id}.execute-api.{region}.amazonaws.com/{stage}

たとえば、この例で GET /pets および GET /pets/{petId} メソッドをセットアップし、REST API ID が 0qzs2sy7bh、リージョンが us-west-2 であるとすると、ブラウザに次の URL を入力して API をテストできます。

https://0qzs2sy7bh.execute-api.us-west-2.amazonaws.com/test/pets

および

https://0qzs2sy7bh.execute-api.us-west-2.amazonaws.com/test/pets/1

または、以下の cURL コマンドを使用できます。

curl -X GET https://0qzs2sy7bh.execute-api.us-west-2.amazonaws.com/test/pets

および

curl -X GET https://0qzs2sy7bh.execute-api.us-west-2.amazonaws.com/test/pets/2

パブリック DNS 名を使用して API を呼び出す

パブリック DNS 名を使用してプライベート API にアクセスできます。

ベース URL の形式は以下のとおりです。

https://{restapi-id}.execute-api.{region}.amazonaws.com/{stage}

たとえば、この例で GET /pets および GET /pets/{petId} メソッドをセットアップし、API の API ID が 0qzs2sy7bh、パブリック DNS 名が vpce-0c1308d7312217cd7-01234567.execute-api.us-west-1.vpce.amazonaws.com、リージョンが us-west-2 であるとすると、次の cURL コマンドを使用して API をテストできます。

curl -v https://vpce-0c1308d7312217cd7-01234567.execute-api.us-east-1.vpce.amazonaws.com/test/get -H'Host:0qzs2sy7bh.execute-api.us-west-2.amazonaws.com'

AWS Direct Connect を使用して API にアクセスする

AWS Direct Connect を使用して、オンプレミスネットワークから Amazon VPC に専用のプライベート接続を確立し、パブリック DNS 名を使用してその接続経由でプライベート API エンドポイントにアクセスすることもできます。

オンプレミスネットワークからプライベート DNS 名を使用してプライベート API にアクセスすることはできません。

プライベート API 開発に関する考慮事項

  • 既存のパブリック API (リージョンまたはエッジ最適化) をプライベート API に変換できます。また、プライベート API をリージョン API に変換できます。プライベート API をエッジ最適化 API に変換することはできません。詳細については、「API Gateway で API エンドポイントタイプを変更する (パブリックまたはプライベート)」を参照してください。

  • プライベート API へのアクセス権限を VPC および VPC エンドポイントに付与するには、リソースポリシーを作成して、新しく作成された (または変換された) API にアタッチする必要があります。これを行わないと、API へのすべての呼び出しは失敗します。詳細については、「プライベート API のリソースポリシーをセットアップする」を参照してください。

  • カスタムドメイン名はプライベート API ではサポートされていません。

  • 単一の VPC エンドポイントを使用して複数のプライベート API にアクセスできます。

  • プライベート API の VPC エンドポイントには、他のインターフェイス VPC エンドポイントと同じ制限が適用されます。詳細については、Amazon VPC ユーザーガイドの「インターフェイスエンドポイントのプロパティと制限」を参照してください。