

# チュートリアル: プライベート REST API を作成する
<a name="private-api-tutorial"></a>

このチュートリアルでは、プライベート REST API を作成します。クライアントは Amazon VPC 内からのみ API にアクセスできます。API は、一般的なセキュリティ要件であるパブリックインターネットから分離されています。

このチュートリアルの完了には約 30 分かかります。まず、CloudFormation テンプレートを使用して Amazon VPC、VPC エンドポイント、AWS Lambda 関数を作成し、API のテストに使用する Amazon EC2 インスタンスを起動します。次に、AWS マネジメントコンソール を使用してプライベート API を作成し、VPC エンドポイントからのアクセスのみを許可するリソースポリシーをアタッチします。最後に、API をテストします。

![\[このチュートリアルで作成するプライベート API の概要。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/private-api-tutorial-diagram.png)


このチュートリアルを完了するには、AWS アカウントと、コンソールへのアクセス権がある AWS Identity and Access Management ユーザーが必要です。詳細については、「[API Gateway を使用するようにセットアップする](setting-up.md)」を参照してください。

このチュートリアルでは、 を使用しますAWS マネジメントコンソール この API とすべての関連リソースを作成する ‭CloudFormation テンプレートについては、‭[template.yaml](samples/private-api-full-template.zip) を参照してください。

**Topics**
+ [ステップ 1: 依存関係を作成する](#private-api-tutorial-create-dependencies)
+ [ステップ 2: プライベート API を作成する](#private-api-tutorial-create-api)
+ [ステップ 3: メソッドと統合を作成する](#private-api-tutorial-create-method)
+ [ステップ 4: リソースポリシーをアタッチする](#private-api-tutorial-attach-resource-policy)
+ [ステップ 5: API をデプロイする](#private-api-tutorial-deploy-api)
+ [ステップ 6: API がパブリックにアクセスできないことを確認する](#private-api-tutorial-test-private-api)
+ [ステップ 7: VPC のインスタンスに接続し、API を呼び出す](#private-api-tutorial-connect-to-instance)
+ [ステップ 8: クリーンアップする](#private-api-tutorial-cleanup)
+ [次のステップ: CloudFormation を使用して自動化する](#private-api-tutorial-next-steps)

## ステップ 1: 依存関係を作成する
<a name="private-api-tutorial-create-dependencies"></a>

[この CloudFormation テンプレート](samples/private-api-starter-template.zip)をダウンロードして解凍します。テンプレートを使用して、プライベート API のすべての依存関係を作成します。これには、Amazon VPC、VPC エンドポイント、API のバックエンドとして機能する Lambda 関数が含まれます。プライベート API は後で作成します。

**CloudFormation スタックを作成するには**

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソール を開きます。

1. [**スタックの作成**] を選択し、[**With new resources (standard) 新しいリソースを使用 (標準)**] を選択します。

1. [**Specify template (テンプレートの指定)**] で、[**Upload a template file (テンプレートファイルのアップロード)**] を選択します。

1. ダウンロードしたテンプレートを選択します。

1. [**Next (次へ)**] を選択します。

1. [**Stack name**] (スタックの名前) で、**private-api-tutorial** と入力し、[**Next**] (次へ) を選択します。

1. [**Configure stack options**] (スタックオプションの設定) で、[**Next**] (次へ) を選択します。

1. [**Capabilities**] (機能) で、CloudFormation がアカウントに IAM リソースを作成できることを承認します。

1. **[次へ]** を選択し、**[送信]** を選択します。

CloudFormation は API の依存関係をプロビジョニングします。これには数分かかる場合があります。CloudFormation スタックのステータスが **CREATE\$1COMPLETE** の場合は、[**Outputs**] (出力) を選択します。VPC エンドポイント ID を書き留めます。このチュートリアルの後の手順で必要になります。

## ステップ 2: プライベート API を作成する
<a name="private-api-tutorial-create-api"></a>

VPC 内のクライアントのみがアクセスできるようにプライベート API を作成します。

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

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

1. [**Create API**] (API を作成) を選択し、[**REST API**] で [**Build**] (構築) を選択します。

1. [**API 名**] に「**private-api-tutorial**」と入力します。

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

1. **[VPC エンドポイント ID]** に、CloudFormation スタックの **[出力]** からの VPC エンドポイント ID を入力します。

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

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

## ステップ 3: メソッドと統合を作成する
<a name="private-api-tutorial-create-method"></a>

API への `GET` リクエストを処理する `GET` メソッドと Lambda 統合を作成します。クライアントが API を呼び出すと、API Gateway はステップ 1 で作成した Lambda 関数にリクエストを送信し、クライアントに応答を返します。

**メソッドと統合を作成するには**

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

1. API を選択します。

1. **[メソッドの作成]** を選択します。

1. **[メソッドタイプ]** で、[`GET`] を選択します。

1. **[統合タイプ]** で、**[Lambda 関数]** を選択します。

1. **[Lambda プロキシ統合]**を有効にします。Lambda プロキシ統合では、API Gateway は定義された構造を使用して Lambda にイベントを送信し、Lambda 関数からの応答を HTTP 応答に変換します。

1. [**Lambda function**] (Lambda 関数) には、ステップ 1 で CloudFormation テンプレートを使用して作成した関数を選択します。関数の名前は **private-api-tutorial** で始まります。

1. **[メソッドの作成]** を選択します。

## ステップ 4: リソースポリシーをアタッチする
<a name="private-api-tutorial-attach-resource-policy"></a>

クライアントが VPC エンドポイントを介してのみ API を呼び出すことを許可する[リソースポリシー](apigateway-resource-policies.md)を API にアタッチします。API へのアクセスをさらに制限するには、VPC エンドポイントの [VPC エンドポイントポリシー](apigateway-vpc-endpoint-policies.md)を設定することもできますが、このチュートリアルでは不要です。

**リソースポリシーをアタッチするには**

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

1. API を選択します。

1. **[リソースポリシー]**、**[ポリシーを作成]** の順に選択します。

1. 以下のポリシーを入力します。*vpceID* を、CloudFormation スタックの [**Outputs**] (出力) からの VPC エンドポイント ID に置き換えます。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": "execute-api:/*",
               "Condition": {
                   "StringNotEquals": {
                       "aws:sourceVpce": "vpce-abcd1234"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": "execute-api:/*"
           }
       ]
   }
   ```

------

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

## ステップ 5: API をデプロイする
<a name="private-api-tutorial-deploy-api"></a>

次に、API をデプロイして、Amazon VPC のクライアントが使用できるようにします。

**API をデプロイするには**

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

1. API を選択します。

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

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

1. [**Stage name (ステージ名)**] に **test** と入力します。

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

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

これで、API をテストする準備ができました。

## ステップ 6: API がパブリックにアクセスできないことを確認する
<a name="private-api-tutorial-test-private-api"></a>

`curl` を使用して、Amazon VPC の外部から API を呼び出すことができないことを確認します。

**API をテストするために**

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

1. API を選択します。

1. メインナビゲーションペインで、**[ステージ]**、**[テスト]** ステージの順に選択します。

1. **[ステージの詳細]** で、コピーアイコンを選択して API の呼び出し URL をコピーします。URL は `https://abcdef123.execute-api.us-west-2.amazonaws.com/test` のようになります。ステップ 1 で作成した VPC エンドポイントではプライベート DNS が有効になっているため、提供された URL を使用して API を呼び出すことができます。

1. curl を使用して、VPC の外部からの API の呼び出しを試みる

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

   Curl は、API のエンドポイントを解決できないことを示します。別の応答が返された場合は、ステップ 2 に戻り、API のエンドポイントタイプに [**Private**] (プライベート) を選択します。

   ```
   curl: (6) Could not resolve host: abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

次に、VPC 内の Amazon EC2 インスタンスに接続して API を呼び出します。

## ステップ 7: VPC のインスタンスに接続し、API を呼び出す
<a name="private-api-tutorial-connect-to-instance"></a>

次に、Amazon VPC 内から API をテストします。プライベート API にアクセスするには、VPC 内の Amazon EC2 インスタンスに接続し、curl を使用して API を呼び出します。ブラウザでインスタンスに接続するには、Systems Manager の Session Manager を使用します。

**API をテストするには**

1. Amazon EC2 コンソール ([https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)) を開きます。

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

1. ステップ 1 で CloudFormation テンプレートを使用して作成した **private-api-tutorial** という名前のインスタンスを選択します。

1. [**Connect**] (接続) を選択し、[**Session Manager**] を選択します。

1. [**Connect**] (接続) を選択して、インスタンスへのブラウザベースのセッションを起動します。

1. Session Manager セッションで、curl を使用して API を呼び出します。Amazon VPC でインスタンスを使用しているため、API を呼び出すことができます。

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

   応答 `Hello from Lambda!` が得られたことを確認します。

![\[Session Manager を使用して、Amazon VPC 内から API を呼び出します。\]](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/images/private-api-tutorial-invoke.png)


Amazon VPC 内からのみアクセスできる API を正常に作成し、正常に動作することを確認しました。

## ステップ 8: クリーンアップする
<a name="private-api-tutorial-cleanup"></a>

不要なコストを回避するには、このチュートリアルで作成したリソースを削除します。次の手順は、REST API と CloudFormation スタックを削除します。

**REST API を削除するには**

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

1. [**API**] ページで API を選択します。**[API アクション]**、**[API を削除]** の順に選択し、選択を確定します。

**CloudFormation スタックを削除するには**

1. CloudFormation コンソール ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) を開きます。

1. CloudFormation スタックを選択します。

1. [**Delete**] (削除) を選択し、選択を確定します。

## 次のステップ: CloudFormation を使用して自動化する
<a name="private-api-tutorial-next-steps"></a>

このチュートリアルで使用するすべての AWS リソースの作成とクリーンアップを自動化できます。CloudFormation テンプレートの完全な例については、[template.yaml](samples/private-api-full-template.zip) を参照してください。