

# チュートリアル: Lambda プロキシ統合を使用して REST API を作成する
<a name="api-gateway-create-api-as-simple-proxy-for-lambda"></a>

[Lambda プロキシ統合](set-up-lambda-proxy-integrations.md)は、軽量で柔軟な API Gateway API 統合タイプであり、これを使用すると、API メソッドまたは API 全体を Lambda 関数と統合できます。Lambda 関数は、[Lambda がサポートする任意の言語](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)で記述できます。これはプロキシ統合であるため、API を再デプロイする必要がなく、いつでも Lambda 関数の実装を変更できます。

このチュートリアルでは、以下の作業を行います。
+ 「Hello, World\$1」 Lambda 関数を API のバックエンドにします。
+ 「Hello, World\$1」 Lambda プロキシ統合による API。

**Topics**
+ [「Hello, World\$1」 Lambda 関数](#api-gateway-proxy-integration-create-lambda-backend)
+ [「Hello, World\$1」 API](#api-gateway-create-api-as-simple-proxy-for-lambda-build)
+ [API をデプロイしてテストする](#api-gateway-create-api-as-simple-proxy-for-lambda-test)

## 「Hello, World\$1」 Lambda 関数
<a name="api-gateway-proxy-integration-create-lambda-backend"></a>

**「Hello, World\$1」を作成するには Lambda コンソールで Lambda 関数を作成します。**

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

1. AWS ナビゲーションバーで、[AWS リージョン](https://docs.aws.amazon.com/general/latest/gr/apigateway.html)を選択します。
**注記**  
Lambda 関数を作成したリージョンを書き留めます。これは、API を作成するときに必要になります。

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

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

1. **Author from scratch** を選択します。

1. [**基本的な情報**] で、以下の作業を行います。

   1. [**関数名**] に **GetStartedLambdaProxyIntegration** と入力します。

   1. **[ランタイム]** で、サポートされている最新の **Node.js** または **Python** ランタイムのいずれかを選択します。

   1. [**アーキテクチャ **] は、デフォルト設定のままにします。

   1. **[アクセス権限]** で、**[デフォルトの実行ロールの変更]** を展開します。**[実行ロール]**] ドロップダウンリストで、**[AWS ポリシーテンプレートから新しいロールを作成]** を選択します。

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

   1. [**Policy templates**] フィールドは空白のままにします。

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

1. インラインコードエディタの [**Function code (関数コード)**] に､以下のコードをコピーして貼り付けます｡

------
#### [ Node.js ]

   ```
   export const handler = async(event, context) => {
       console.log('Received event:', JSON.stringify(event, null, 2));
       var res ={
           "statusCode": 200,
           "headers": {
               "Content-Type": "*/*"
           }
       };
       var greeter = 'World';
       if (event.greeter && event.greeter!=="") {
           greeter =  event.greeter;
       } else if (event.body && event.body !== "") {
           var body = JSON.parse(event.body);
           if (body.greeter && body.greeter !== "") {
               greeter = body.greeter;
           }
       } else if (event.queryStringParameters && event.queryStringParameters.greeter && event.queryStringParameters.greeter !== "") {
           greeter = event.queryStringParameters.greeter;
       } else if (event.multiValueHeaders && event.multiValueHeaders.greeter && event.multiValueHeaders.greeter != "") {
           greeter = event.multiValueHeaders.greeter.join(" and ");
       } else if (event.headers && event.headers.greeter && event.headers.greeter != "") {
           greeter = event.headers.greeter;
       } 
       res.body = "Hello, " + greeter + "!";
       return res
   };
   ```

------
#### [ Python ]

   ```
   import json
   
   
   def lambda_handler(event, context):
       print(event)
   
       greeter = 'World'
   
       try:
           if (event['queryStringParameters']) and (event['queryStringParameters']['greeter']) and (
                   event['queryStringParameters']['greeter'] is not None):
               greeter = event['queryStringParameters']['greeter']
       except KeyError:
           print('No greeter')
   
       try:
           if (event['multiValueHeaders']) and (event['multiValueHeaders']['greeter']) and (
                   event['multiValueHeaders']['greeter'] is not None):
               greeter = " and ".join(event['multiValueHeaders']['greeter'])
       except KeyError:
           print('No greeter')
   
       try:
           if (event['headers']) and (event['headers']['greeter']) and (
                   event['headers']['greeter'] is not None):
               greeter = event['headers']['greeter']
       except KeyError:
           print('No greeter')
   
       if (event['body']) and (event['body'] is not None):
           body = json.loads(event['body'])
           try:
               if (body['greeter']) and (body['greeter'] is not None):
                   greeter = body['greeter']
           except KeyError:
               print('No greeter')
   
       res = {
           "statusCode": 200,
           "headers": {
               "Content-Type": "*/*"
           },
           "body": "Hello, " + greeter + "!"
       }
   
       return res
   ```

------

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

## 「Hello, World\$1」 API
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-build"></a>

ここで、「Hello, World\$1」に API を作成します。API Gateway コンソールを使用して Lambda 関数を実行します。

**「Hello, World\$1」を作成するには API**

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

1. API Gateway を初めて使用する場合は、サービスの特徴を紹介するページが表示されます。[**REST API**] で、[**構築**] を選択します。[**Create Example API (サンプル API の作成)**] がポップアップ表示されたら、[**OK**] を選択します。

   API Gateway を使用するのが初めてではない場合、[**Create API**] (API を作成)を選択します。[**REST API**] で、[**構築**] を選択します。

1.  [**API 名**] に「**LambdaProxyAPI**」と入力します。

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

1. **[API エンドポイントタイプ]** を **[リージョン別]** に設定したままにします。

1. **[IP アドレスの種類]** には **[IPv4]** を選択します。

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

API を作成したら、リソースを作成します。通常、API リソースはアプリケーションロジックに従ってリソースツリーに整理されます。この例では、**/helloworld** リソースを作成します。

**リソースを作成するには**

1. **[リソースの作成]** を選択します。

1. **[プロキシのリソース]** はオフのままにします。

1. **[リソースパス]** は `/` のままにします。

1. **[リソース名]** に「**helloworld**」と入力します。

1. **[CORS (Cross Origin Resource Sharing)]** はオフのままにします。

1. **[リソースの作成]** を選択します。

 プロキシ統合では、任意の HTTP メソッドを表すすべての `ANY` メソッドをキャッチオールがらリクエスト全体がそのままバックエンド Lambda 関数に送信されます。実際の HTTP メソッドは、実行時にクライアントによって指定されます。`ANY` メソッドでは、単一の API メソッドのセットアップを `DELETE`、`GET`、`HEAD`、`OPTIONS`、`PATCH`、`POST` および `PUT` のサポートされるすべての HTTP メソッドに使用できます。

**`ANY` メソッドを作成するには**

1. **/helloworld** リソースを選択し、**[メソッドを作成]** を選択します。

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

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

1. **[Lambda プロキシ統合]**を有効にします。

1. **[Lambda 関数]** で、Lambda 関数を作成した AWS リージョンを選択し、関数名を入力します。

1. 29 秒のデフォルトのタイムアウト値を使用するには、**[デフォルトタイムアウト]** をオンのままにします。カスタムのタイムアウトを設定するには、**[デフォルトタイムアウト]** を選択してから、タイムアウト値を `50` ～ `29000` ミリ秒の間で入力します。

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

## API をデプロイしてテストする
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-test"></a>

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

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

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

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

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

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

1. **[ステージの詳細]** で、コピーアイコンを選択して API の呼び出し URL をコピーします。

### ブラウザと cURL を使用して Lambda プロキシ統合で API をテストする
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-test-curl"></a>

API をテストするためにブラウザまたは [cURL](https://curl.se/) を使用できます。

クエリ文字列パラメータのみを使用して `GET` リクエストをテストする場合は、API の `helloworld` リソースの URL をブラウザのアドレスバーに入力できます。

API の `helloworld` リソースの URL を作成するには、リソース `helloworld` とクエリ文字列パラメータ `?greeter=John` を呼び出し URL に追加します。URL は次のようになります。

```
https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John
```

それ以外のメソッドの場合は、[POSTMAN](https://www.postman.com/) や [cURL](https://curl.se/) などの高度な REST API テストユーティリティを使用する必要があります。このチュートリアルでは cURL を使用します。以下の cURL コマンドの例は、cURL がコンピュータにインストールされていることを前提としています。

**cURL を使用してデプロイした API をテストするには**

1. ターミナルウィンドウを開きます。

1. 次の cURL コマンドをコピーしてターミナルウィンドウに貼り付け、呼び出し URL を前のステップでコピーした URL に置き換えて、URL の末尾に **/helloworld** を追加します。
**注記**  
Windows でコマンドを実行している場合は、代わりに次の構文を使用してください。  

   ```
   curl -v -X POST "https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld" -H "content-type: application/json" -d "{ \"greeter\": \"John\" }"
   ```

   1. `?greeter=John` のクエリ文字列パラメータを使用して API を呼び出すには

      ```
      curl -X GET 'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John'
      ```

   1. `greeter:John` のヘッダーパラメータを使用して API を呼び出すには

      ```
      curl -X GET https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \
        -H 'content-type: application/json' \
        -H 'greeter: John'
      ```

   1. `{"greeter":"John"}` の本文を使用して API を呼び出すには

      ```
      curl -X POST https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \
        -H 'content-type: application/json' \
        -d '{ "greeter": "John" }'
      ```

   すべてのケースで、出力は、次のレスポンス本文を持つ 200 レスポンスです。

   ```
   Hello, John!
   ```