

# プライベート API の作成
<a name="apigateway-private-api-create"></a>

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

これを行う方法を、以下の手順で示します。プライベート REST API は、AWS マネジメントコンソール、AWS CLI、または AWS SDK を使用して作成できます。

## 前提条件
<a name="apigateway-private-api-create-interface-vpc-prerequisites"></a>

この手順を実行するには、完全に設定された VPC が必要です。デフォルトの VPC を作成するには、「Amazon VPC ユーザーガイド」の「[VPC のみを作成する](https://docs.aws.amazon.com/vpc/latest/userguide/create-vpc.html#create-vpc-only)」を参照してください。**VPC の作成時にすべての推奨ステップを実行するには、プライベート DNS を有効にします。これにより、ホストまたは `x-apigw-api-id` ヘッダーを渡すことなく、VPC 内で API を呼び出すことができます。

プライベート DNS を有効にするには、VPC の `enableDnsSupport` 属性と `enableDnsHostnames` 属性を `true` に設定する必要があります。詳細については、「[VPC の DNS サポート](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-support)」および「[VPC の DNS サポートの更新](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-updating)」を参照してください。

## ステップ 1: API Gateway 用の VPC エンドポイントを VPC に作成する
<a name="apigateway-private-api-create-interface-vpc-endpoint"></a>

次の手順は、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 に接続できません](#apigateway-private-api-troubleshooting-public-access)」を参照してください。

------
#### [ AWS マネジメントコンソール ]

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

1. AWS マネジメントコンソール にサインインして、Amazon VPC コンソール ([https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)) を開きます。

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

1. **エンドポイントの作成** を選択します。

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

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

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

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

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

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

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

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

1. **[ポリシー]** で、以下のいずれかを実行します。
   + プライベート API を作成していないか、カスタム VPC エンドポイントポリシーを設定しない場合は、**[フルアクセス]** を選択します。
   + プライベート API を既に作成していて、カスタム VPC エンドポイントポリシーを設定する場合は、カスタム VPC エンドポイントポリシーを入力できます。詳細については、「[API Gateway でプライベート API 用の VPC エンドポイントポリシーを使用する](apigateway-vpc-endpoint-policies.md)」を参照してください。

   VPC エンドポイントポリシーは、VPC エンドポイントの作成後に更新できます。詳細については、「[VPC エンドポイントポリシーを更新する](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html#update-vpc-endpoint-policy)」を参照してください。

1. **エンドポイントの作成** を選択します。

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

------
#### [ AWS CLI ]

次の [create-vpc-endpoint](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-vpc-endpoint.html) コマンドは、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 を作成する
<a name="apigateway-private-api-create-using-console"></a>

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

------
#### [ AWS マネジメントコンソール ]

**プライベート API を作成するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

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

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

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

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

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

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

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

1. **[IP アドレスタイプ]** で、**[デュアルスタック]**を選択します。

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

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

------
#### [ AWS CLI ]

次の [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) コマンドは、プライベート 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"], "ipAddressType": "dualstack" }'
```

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

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

 ここまでの手順を完了したら、「[チュートリアル: AWS SDK または AWS CLI を使用して REST API を作成する](api-gateway-create-api-cli-sdk.md)」の手順に従って、この 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-gateway-create-api-cli-sdk.md)」の手順に従って、この 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-gateway-create-api-cli-sdk.md)」の手順に従って、この API のメソッドと統合を設定できます。ただし、API をデプロイすることはできません。API をデプロイするには、ステップ 3 に従い、リソースポリシーを API にアタッチします。

------

## ステップ 3: プライベート API のリソースポリシーをセットアップする
<a name="apigateway-private-api-set-up-resource-policy"></a>

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

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

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

------
#### [ AWS マネジメントコンソール ]

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

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

1. [**Create policy**] (ポリシーの作成) を選択します。

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

1. `{{vpcID}}` (中かっこを含む) を VPC ID に置き換えます。

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

------
#### [ AWS CLI ]

次の [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) コマンドは、リソースポリシーを既存の 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 エンドポイントポリシーを使用する](apigateway-vpc-endpoint-policies.md)」を参照してください。

## (オプション) VPC エンドポイントとプライベート API の関連付けまたは関連付けの解除
<a name="associate-private-api-with-vpc-endpoint"></a>

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 マネジメントコンソール) ]

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

**VPC エンドポイントをプライベート API に関連付けるには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

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

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

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

1. メインナビゲーションペインで、**[API の設定]** を選択します。

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

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

1. **[保存]** を選択します。

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

------
#### [ Dissociate a VPC endpoint (AWS マネジメントコンソール) ]

**プライベート REST API から VPC エンドポイントの関連付けを解除するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

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

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

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

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

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

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

1. **[保存]** を選択します。

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

------
#### [ Associate a VPC endpoint (AWS CLI) ]

次の [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) コマンドは、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](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) コマンドは、作成済みの API に VPC エンドポイントを関連付けます。

```
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](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) コマンドは、プライベート 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 をデプロイする
<a name="apigateway-private-api-deploy-using-console"></a>

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

------
#### [ AWS マネジメントコンソール ]

**プライベート API をデプロイするには**

1. API を選択します。

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

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

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

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

1. **[デプロイ]** をクリックします。

------
#### [ AWS CLI ]

次の [create-deployment](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-deployment.html) コマンドは、プライベート API をデプロイします。

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

------

## プライベート API のトラブルシューティング
<a name="apigateway-private-api-troubleshooting"></a>

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

### 問題: API Gateway VPC エンドポイントからパブリック API に接続できません
<a name="apigateway-private-api-troubleshooting-public-access"></a>

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

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

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

### 問題: API が `{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:********/****/****/"}` を返します
<a name="apigateway-private-api-troubleshooting-principal"></a>

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

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:role/developer",
                    "arn:aws:iam::111122223333:role/Admin"
                ]
            },
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/stage/GET/pets"
            ]
        }
    ]
}
```

------

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

### 問題: VPC エンドポイントが API に関連付けられているかどうかわかりません
<a name="apigateway-private-api-troubleshooting-associate-wait-time"></a>

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