

# Amazon API Gateway エンドポイントを使用した Lambda 関数の呼び出し
<a name="services-apigateway"></a>

Amazon API Gateway を使用して、Lambda 関数の HTTP エンドポイントを持つウェブ API を作成できます。API Gateway は、HTTP リクエストを Lambda 関数にルーティングするウェブ API を、作成および文書化するためのツールを提供します。認証および認可のコントロールにより、API へのアクセスを保護できます。API は、インターネット経由でトラフィックを処理することも、VPC 内でのみアクセス可能にすることもできます。

**ヒント**  
Lambda には、HTTP エンドポイントを介して関数を呼び出す 2 つの方法として、API Gateway および Lambda 関数 URL が用意されています。ユースケースに最適な方法がわからない場合、「[HTTP リクエストを使用して Lambda 関数を呼び出す方法を選択する](apig-http-invoke-decision.md)」を参照してください。

API 内のリソースは、GET や POST などの 1 つ以上のメソッドを定義します。メソッドには、Lambda 関数または別の統合タイプにリクエストをルーティングする統合があります。各リソースとメソッドを個別に定義することも、特殊なリソースとメソッドタイプを使用して、パターンに一致するすべてのリクエストを照合することもできます。[プロキシリソース](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html)は、リソースの下にあるすべてのパスをキャッチします。`ANY` メソッドは、すべての HTTP メソッドをキャッチします。

**Topics**
+ [

## API タイプの選択
](#services-apigateway-apitypes)
+ [

## エンドポイントの Lambda 関数への追加
](#apigateway-add)
+ [

## プロキシ統合
](#apigateway-proxy)
+ [

## イベント形式
](#apigateway-example-event)
+ [

## レスポンスの形式
](#apigateway-types-transforms)
+ [

## アクセス許可
](#apigateway-permissions)
+ [

## サンプルアプリケーション
](#services-apigateway-samples)
+ [

## Powertools for AWS Lambda のイベントハンドラー
](#services-apigateway-powertools)
+ [

# チュートリアル: API Gateway で Lambda を使用する
](services-apigateway-tutorial.md)
+ [

# API Gateway API を使用した Lambda エラーの処理
](services-apigateway-errors.md)
+ [

# HTTP リクエストを使用して Lambda 関数を呼び出す方法を選択する
](apig-http-invoke-decision.md)

## API タイプの選択
<a name="services-apigateway-apitypes"></a>

API Gateway は、Lambda 関数を呼び出す 3 種類の API をサポートしています。
+ [HTTP API](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html): 軽量で低レイテンシーの RESTful API。
+ [REST API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-rest-api.html): カスタマイズ可能で機能豊富な RESTful API。
+ [WebSocket API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html): 全二重通信のためにクライアントとの永続的な接続を維持するウェブ API。

HTTP API と REST API は、両方とも HTTP リクエストを処理し、レスポンスを返す RESTful API です。HTTP API は新しいバージョンであり、API Gateway バージョン 2 API を使用して構築されています。HTTP API では、次の機能が新しく追加されました。

**HTTP API の機能**
+ **自動デプロイ** - ルートまたは統合を変更した場合、変更は自動デプロイが有効になっているステージに自動的にデプロイされます。
+ **デフォルトステージ** - API の URL のルートパスでリクエストを処理するデフォルトステージ (`$default`) を作成できます。名前付きステージの場合は、パスの先頭にステージ名を含める必要があります。
+ **CORS 設定** - CORS ヘッダーを関数コードで手動で追加する代わりに、送信レスポンスに CORS ヘッダーを追加するように API を設定できます。

REST API は、当初から API Gateway でサポートされている従来の RESTful API です。REST API には現在、より多くのカスタマイズ、統合、および管理機能があります。

**REST API の機能**
+ **統合タイプ** - REST API は、カスタム Lambda 統合をサポートします。カスタム統合では、リクエストのボディだけを関数に送信するか、関数に送信する前にリクエストボディに変換テンプレートを適用できます。
+ **アクセスコントロール** - REST API では、認証と認可のためのより多くのオプションがサポートされています。
+ **モニタリングとトレース** - REST API では、AWS X-Ray のトレースと追加のログ記録オプションがサポートされます。

詳細な比較については、「*API ゲートウェイのデベロッパーガイド*」の「[REST API と HTTP API のどちらかを選択する](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-vs-rest.html)」を参照してください。

WebSocket API も API Gateway バージョン 2 API を使用し、同様の機能セットをサポートします。クライアントと API 間の永続的な接続を活用できるアプリケーションには、WebSocket API を使用します。WebSocket API は全二重通信を提供します。つまり、クライアントと API の両方がレスポンスを待たずにメッセージを継続的に送信できます。

HTTP API では、簡略化されたイベント形式 (バージョン 2.0) がサポートされています。HTTP API からのイベントの例については、「[API Gateway で HTTP API の AWS Lambda プロキシ統合を作成する](https://docs.aws.amazon.com//apigateway/latest/developerguide/http-api-develop-integrations-lambda.html)」を参照してください。

詳細については、「[API Gateway で HTTP API の AWS Lambda プロキシ統合を作成する](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html)」を参照してください。

## エンドポイントの Lambda 関数への追加
<a name="apigateway-add"></a>

**パブリックエンドポイントを Lambda 関数に追加するには**

1. Lambda コンソールの [[関数ページ]](https://console.aws.amazon.com/lambda/home#/functions) を開きます。

1. 関数を選択します。

1. [**機能の概要**] で、[**トリガーを追加**] を選択します。

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

1. **[Create an API]** (API の作成) または **[Use an existing API]** (既存の API の使用) を選択します。

   1. **[New API]** (新しい API): **[API type]** (API タイプ) で、**[HTTP API]** を選択します。詳細については、「[API タイプの選択](#services-apigateway-apitypes)」を参照してください。

   1. **[既存の API]**: ドロップダウンリストから API を選択するか、API ID (r3pmxmplak など) を入力します。

1. [**Security (セキュリティ)**] で、[**Open (開く)**] を選択します。

1. [**Add**] (追加) をクリックします。

## プロキシ統合
<a name="apigateway-proxy"></a>

API Gateway API は、ステージ、リソース、メソッド、および統合で構成されています。ステージとリソースによって、エンドポイントのパスが決まります。

**API パス形式**
+ `/prod/` - `prod` ステージおよびルートリソース。
+ `/prod/user` - `prod` ステージおよび `user` リソース。
+ `/dev/{proxy+}` - `dev` ステージ内の任意のルート。
+ `/` - (HTTP API) デフォルトのステージおよびルートリソース。

Lambda 統合は、パスと HTTP メソッドの組み合わせを Lambda 関数にマッピングします。HTTP リクエストのボディをそのまま渡すように (カスタム統合)、またはヘッダー、リソース、パス、メソッドなどすべてのリクエスト情報を含むドキュメントにリクエストボディをカプセル化するように、API Gateway を設定できます。

詳細については、「[API Gateway での Lambda プロキシ統合](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html)」を参照してください。

## イベント形式
<a name="apigateway-example-event"></a>

Amazon API Gateway は、HTTP リクエストの JSON 表現を含むイベントを使用して、関数を[同期的に](invocation-sync.md)呼び出します。カスタム統合の場合、イベントはリクエストのボディです。プロキシ統合の場合、イベントは定義された構造を持ちます。API Gateway REST API からのプロキシイベントの例については、「*API Gateway デベロッパーガイド*」の「[プロキシ統合のための Lambda 関数の入力形式](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format)」を参照してください。

## レスポンスの形式
<a name="apigateway-types-transforms"></a>

API Gateway は関数からのレスポンスを待ち、その結果を発信者に中継します。カスタム統合の場合は、統合レスポンスとメソッドレスポンスを定義して、関数からの出力を HTTP レスポンスに変換します。プロキシ統合の場合、関数はレスポンスを特定の形式で表現して応答する必要があります。

次の例は、Node.js 関数からのレスポンスオブジェクトを示しています。レスポンスオブジェクトは、JSON ドキュメントを含む成功した HTTP レスポンスを表します。

**Example index.js - プロキシ統合レスポンスオブジェクト (Node.js)**  

```
var response = {
      "statusCode": 200,
      "headers": {
        "Content-Type": "application/json"
      },
      "isBase64Encoded": false,
      "multiValueHeaders": { 
        "X-Custom-Header": ["My value", "My other value"],
      },
      "body": "{\n  \"TotalCodeSize\": 104330022,\n  \"FunctionCount\": 26\n}"
    }
```

Lambda ランタイムは、レスポンスオブジェクトを JSON にシリアル化し、API に送信します。API はレスポンスを解析し、それを使用して HTTP レスポンスを作成します。次に、そのレスポンスを元のリクエストを実行したクライアントに送信します。

**Example HTTP レスポンス**  

```
< HTTP/1.1 200 OK
  < Content-Type: application/json
  < Content-Length: 55
  < Connection: keep-alive
  < x-amzn-RequestId: 32998fea-xmpl-4268-8c72-16138d629356
  < X-Custom-Header: My value
  < X-Custom-Header: My other value
  < X-Amzn-Trace-Id: Root=1-5e6aa925-ccecxmplbae116148e52f036
  <
  {
    "TotalCodeSize": 104330022,
    "FunctionCount": 26
  }
```

## アクセス許可
<a name="apigateway-permissions"></a>

Amazon API Gateway は、関数の[リソースベースのポリシー](access-control-resource-based.md)から関数を呼び出すアクセス許可を取得します。API 全体に対する呼び出しアクセス許可を付与したり、ステージ、リソース、またはメソッドに対する制限付きアクセスを付与したりできます。

Lambda コンソールまたは API Gateway コンソールを使用するか、AWS SAM テンプレートで API を関数に追加すると、関数のリソースベースのポリシーが自動的に更新されます。関数ポリシーの例を以下に示します。

**Example 関数ポリシー**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "default",
  "Statement": [
    {
      "Sid": "nodejs-apig-functiongetEndpointPermissionProd-BWDBXMPLXE2F",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-2:111122223333:function:nodejs-apig-function-1G3MXMPLXVXYI",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "111122223333"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:execute-api:us-east-2:111122223333:ktyvxmpls1/*/GET/"
        }
      }
    }
  ]
}
```

次の API オペレーションを使用して、関数ポリシーのアクセス許可を手動で管理できます。
+ [AddPermission](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html)
+ [RemovePermission](https://docs.aws.amazon.com/lambda/latest/api/API_RemovePermission.html)
+ [GetPolicy](https://docs.aws.amazon.com/lambda/latest/api/API_GetPolicy.html)

既存の API への呼び出しアクセス許可を付与するには、`add-permission` コマンドを使用します。例:

```
aws lambda add-permission \
  --function-name my-function \
  --statement-id apigateway-get --action lambda:InvokeFunction \
  --principal apigateway.amazonaws.com \
  --source-arn "arn:aws:execute-api:us-east-2:123456789012:mnh1xmpli7/default/GET/"
```

以下の出力が表示されます。

```
{
    "Statement": "{\"Sid\":\"apigateway-test-2\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-2:123456789012:function:my-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:us-east-2:123456789012:mnh1xmpli7/default/GET\"}}}"
}
```

**注記**  
関数と API が異なる AWS リージョンにある場合、ソース ARN のリージョン識別子は、API のリージョンではなく、関数のリージョンと一致している必要があります。API Gateway が関数を呼び出すと、API の ARN に基づくリソース ARN が使用されますが、その関数のリージョンと一致するように変更されます。

この例のソース ARN は、API のデフォルトステージにあるルートリソースの GET メソッドでの統合に ID `mnh1xmpli7` のアクセス許可を付与します。ソース ARN でアスタリスクを使用すると、複数のステージ、メソッド、またはリソースにアクセス許可を付与できます。

**リソースパターン**
+ `mnh1xmpli7/*/GET/*` - すべてのステージのすべてのリソースの GET メソッド。
+ `mnh1xmpli7/prod/ANY/user` - `prod` ステージの `user` リソースにおけるすべてのメソッド。
+ `mnh1xmpli7/*/*/*` - すべてのステージのすべてのリソースの任意のメソッド。

ポリシーの表示とステートメントの削除の詳細については、「」を参照してください[Lambda でのリソースベースの IAM ポリシーの表示](access-control-resource-based.md)

## サンプルアプリケーション
<a name="services-apigateway-samples"></a>

[Node.js を使用した API Gateway](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/nodejs-apig) のサンプルアプリには、AWS SAM テンプレートを使用した関数が含まれています。このテンプレートは、AWS X-Ray のトレースが有効にされた REST API を作成します。これには、デプロイ、関数の呼び出し、API のテスト、およびクリーンアップ用のスクリプトも含まれます。

## Powertools for AWS Lambda のイベントハンドラー
<a name="services-apigateway-powertools"></a>

Powertools for AWS Lambda ツールキットのイベントハンドラーは、API Gateway エンドポイント (HTTP または REST) によって呼び出される Lambda 関数を記述するときに、ルーティング、ミドルウェア、CORS 設定、OpenAPI 仕様生成、リクエスト検証、エラー処理、その他の便利な機能を提供します。イベントハンドラーユーティリティは、Python および TypeScript/JavaScript で使用できます。詳細については、*Powertools for AWS Lambda (Python) ドキュメント*の「[イベントハンドラー REST API](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/api_gateway/)」および *Powertools for AWS Lambda (TypeScript) ドキュメント*の「[イベントハンドラー HTTP API](https://docs.aws.amazon.com/powertools/typescript/latest/features/event-handler/http/)」を参照してください。

### Python
<a name="services-apigateway-powertools-python"></a>

```
from aws_lambda_powertools import Logger
from aws_lambda_powertools.event_handler import APIGatewayRestResolver
from aws_lambda_powertools.logging import correlation_paths
from aws_lambda_powertools.utilities.typing.lambda_context import LambdaContext

app = APIGatewayRestResolver()
logger = Logger()

@app.get("/healthz")
def ping():
    return {"message": "health status ok"}

@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST)  
def lambda_handler(event: dict, context: LambdaContext) -> dict:
    return app.resolve(event, context)
```

### Typescript
<a name="services-apigateway-powertools-typescript"></a>

```
import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest';
import { Logger } from '@aws-lambda-powertools/logger';
import {
  correlationPaths,
  search,
} from '@aws-lambda-powertools/logger/correlationId';
import type { Context } from 'aws-lambda/handler';

const logger = new Logger({
  correlationIdSearchFn: search,
});

const app = new Router({ logger });

app.get("/healthz", async () => {
  return { message: "health status ok" };
});

export const handler = async (event: unknown, context: Context) => {
  // You can continue using other utilities just as before
  logger.addContext(context);
  logger.setCorrelationId(event, correlationPaths.API_GATEWAY_REST);
  return app.resolve(event, context);
};
```

# チュートリアル: API Gateway で Lambda を使用する
<a name="services-apigateway-tutorial"></a>

このチュートリアルでは、HTTP リクエストを使用して Lambda 関数を呼び出す REST API を作成します。Lambda 関数は、DynamoDB テーブルで作成、読み取り、更新、および削除 (CRUD) 操作を実行します。このチュートリアルで提供される関数はデモ用ですが、任意の Lambda 関数を呼び出すことができる API Gateway REST API を設定する方法を学びます。

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/APIG_tut_resources.png)


API Gateway を使用することで、Lambda 関数を呼び出すためのセキュアな HTTP エンドポイントがユーザーに提供されるとともに、トラフィックのスロットリングと、API コールの自動的な検証と承認によって、関数に対する大量の呼び出しを管理するためにも役立ちます。API Gateway は、AWS Identity and Access Management (IAM) と Amazon Cognito を使用した柔軟なセキュリティコントロールも提供します。これは、アプリケーションへの呼び出しに事前承認が必要なユースケースに役立ちます。

**ヒント**  
Lambda には、HTTP エンドポイントを介して関数を呼び出す 2 つの方法として、API Gateway および Lambda 関数 URL が用意されています。ユースケースに最適な方法がわからない場合、「[HTTP リクエストを使用して Lambda 関数を呼び出す方法を選択する](apig-http-invoke-decision.md)」を参照してください。

このチュートリアルは、以下の段階を通じて完了します。

1. DynamoDB テーブルで操作を実行するための Lambda 関数を Python または Node.js で作成し、設定する。

1. API Gateway で、Lambda 関数に接続するための REST API を作成する。

1. DynamoDB テーブルを作成し、コンソールで Lambda 関数を使用してテーブルをテストする。

1. API をデプロイし、ターミナルで curl を使用してセットアップ全体をテストする。

これらの段階を完了することにより、あらゆる規模で Lambda 関数をセキュアに呼び出すことができる HTTP エンドポイントを作成するために API Gateway を使用する方法を学びます。また、API をデプロイする方法と、それをコンソールでテスト、およびターミナルを使用して HTTP リクエストを送信することでテストする方法も学びます。

## 許可ポリシーを作成する
<a name="services-apigateway-tutorial-policy"></a>

Lambda 関数の[実行ロール](lambda-intro-execution-role.md)を作成する前に、必要な AWS リソースにアクセスするための許可を関数に付与する許可ポリシーを作成する必要があります。このチュートリアルでは、このポリシーが、DynamoDB テーブルで CRUD 操作を実行し、Amazon CloudWatch Logs に書き込むことを Lambda に許可します。

**ポリシーを作成する**

1. IAM コンソールの[ポリシー](https://console.aws.amazon.com/iam/home#/policies)ページを開きます。

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

1. **[JSON]** タブを選択して、次のカスタムポリシーを JSON エディタに貼り付けます。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "Stmt1428341300017",
         "Action": [
           "dynamodb:DeleteItem",
           "dynamodb:GetItem",
           "dynamodb:PutItem",
           "dynamodb:Query",
           "dynamodb:Scan",
           "dynamodb:UpdateItem"
         ],
         "Effect": "Allow",
         "Resource": "*"
       },
       {
         "Sid": "",
         "Resource": "*",
         "Action": [
           "logs:CreateLogGroup",
           "logs:CreateLogStream",
           "logs:PutLogEvents"
         ],
         "Effect": "Allow"
       }
     ]
   }
   ```

------

1. **[次へ: タグ]** を選択します。

1. **[次へ: レビュー]** を選択します。

1. **[ポリシーの確認]** でポリシーの **[名前]** に「**lambda-apigateway-policy**」と入力します。

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

## 実行ロールを作成する
<a name="services-apigateway-tutorial-role"></a>

[実行ロール](lambda-intro-execution-role.md)とは、AWS のサービス およびリソースに対するアクセス許可を Lambda 関数に付与する AWS Identity and Access Management (IAM) のロールです。関数が DynamoDB テーブルで操作を実行できるようにするには、前のステップで作成した許可ポリシーをアタッチします。

**実行ロールを作成して、カスタム許可ポリシーをアタッチする**

1. IAM コンソールの[ロールページ](https://console.aws.amazon.com/iam/home#/roles)を開きます。

1. **[ロールの作成]** を選択します。

1. 信頼されたエンティティには、**[AWS サービス]** を選択し、ユースケースには **[Lambda]** を選択します。

1. **[次へ]** をクリックします。

1. ポリシー検索ボックスに、「**lambda-apigateway-policy**」と入力します。

1. 検索結果で作成したポリシー (`lambda-apigateway-policy`) を選択し、**[次へ]** を選択します。

1. **[ロールの詳細]** で **[ロール名]** に **lambda-apigateway-role** を入力してから、**[ロールの作成]** を選択します。

## Lambda 関数を作成する
<a name="services-apigateway-tutorial-function"></a>

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開き、**[関数の作成]** を選択します。

1. **[一から作成]** を選択します。

1. **[関数名]** に「`LambdaFunctionOverHttps`」と入力します。

1. **[ランタイム]** で、最新の Node.js または Python ランタイムを選択します。

1. **[アクセス権限]** で、**[デフォルトの実行ロールの変更]** を展開します。

1. **[既存の実行ロールを使用する]** を選択し、前に作成した **lambda-apigateway-role** ロールを選択します。

1. [**関数の作成**] を選択してください。

1. **[コードソース]** ペインで、デフォルトコードを次の Node.js または Python コードに置き換えます。

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

   `region` 設定は、関数をデプロイし、[DynamoDB テーブルを作成](#services-apigateway-tutorial-table)する AWS リージョン と一致させる必要があります。

**Example index.mjs**  

   ```
   import { DynamoDBDocumentClient, PutCommand, GetCommand, 
            UpdateCommand, DeleteCommand} from "@aws-sdk/lib-dynamodb";
   import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
   
   const ddbClient = new DynamoDBClient({ region: "us-east-2" });
   const ddbDocClient = DynamoDBDocumentClient.from(ddbClient);
   
   // Define the name of the DDB table to perform the CRUD operations on
   const tablename = "lambda-apigateway";
   
   /**
    * Provide an event that contains the following keys:
    *
    *   - operation: one of 'create,' 'read,' 'update,' 'delete,' or 'echo'
    *   - payload: a JSON object containing the parameters for the table item
    *     to perform the operation on
    */
   export const handler = async (event, context) => {
      
        const operation = event.operation;
      
        if (operation == 'echo'){
             return(event.payload);
        }
        
       else { 
           event.payload.TableName = tablename;
           let response;
           
           switch (operation) {
             case 'create':
                  response = await ddbDocClient.send(new PutCommand(event.payload));
                  break;
             case 'read':
                  response = await ddbDocClient.send(new GetCommand(event.payload));
                  break;
             case 'update':
                  response = ddbDocClient.send(new UpdateCommand(event.payload));
                  break;
             case 'delete':
                  response = ddbDocClient.send(new DeleteCommand(event.payload));
                  break;
             default:
               response = 'Unknown operation: ${operation}';
             }
           console.log(response);
           return response;
       }
   };
   ```

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

**Example lambda\$1function.py**  

   ```
   import boto3
   
   # Define the DynamoDB table that Lambda will connect to
   table_name = "lambda-apigateway"
   
   # Create the DynamoDB resource
   dynamo = boto3.resource('dynamodb').Table(table_name)
   
   # Define some functions to perform the CRUD operations
   def create(payload):
       return dynamo.put_item(Item=payload['Item'])
   
   def read(payload):
       return dynamo.get_item(Key=payload['Key'])
   
   def update(payload):
       return dynamo.update_item(**{k: payload[k] for k in ['Key', 'UpdateExpression', 
       'ExpressionAttributeNames', 'ExpressionAttributeValues'] if k in payload})
   
   def delete(payload):
       return dynamo.delete_item(Key=payload['Key'])
   
   def echo(payload):
       return payload
   
   operations = {
       'create': create,
       'read': read,
       'update': update,
       'delete': delete,
       'echo': echo,
   }
   
   def lambda_handler(event, context):
       '''Provide an event that contains the following keys:
         - operation: one of the operations in the operations dict below
         - payload: a JSON object containing parameters to pass to the 
           operation being performed
       '''
       
       operation = event['operation']
       payload = event['payload']
       
       if operation in operations:
           return operations[operation](payload)
           
       else:
           raise ValueError(f'Unrecognized operation "{operation}"')
   ```

------
**注記**  
この例では、DynamoDB テーブルの名前が関数コード内の変数として定義されます。実際のアプリケーションでは、このパラメータを環境変数として渡し、テーブル名をハードコーディングしないことがベストプラクティスです。詳細については、「[AWS Lambda 環境変数の使用](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html)」を参照してください。

1. **[DEPLOY]** セクションで、**[デプロイ]** を選択して関数のコードを更新します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

## 関数をテストする
<a name="services-apigateway-tutorial-test-function"></a>

関数を API Gateway と統合する前に、関数が正常にデプロイされたことを確認します。Lambda コンソールを使用してテストイベントを関数に送信します。

1. 関数の Lambda コンソールページで、**[テスト]** タブを選択します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/test-tab.png)

1. **[イベント JSON]** セクションまで下にスクロールし、デフォルトのイベントを次のように置き換えます。このイベントは、Lambda 関数で想定される構造と一致します。

   ```
   {
       "operation": "echo",
       "payload": {
           "somekey1": "somevalue1",
           "somekey2": "somevalue2"
       }
   }
   ```

1. **[テスト]** を選択します。

1. **[関数の実行: 成功]** で、**[詳細]** を展開します。以下のようなレスポンスが表示されます。

   ```
   {
     "somekey1": "somevalue1",
     "somekey2": "somevalue2"
   }
   ```

## API Gateway を使用して REST API を作成する
<a name="services-apigateway-tutorial-api"></a>

このステップでは、Lambda 関数を呼び出すために使用する API Gateway REST API を作成します。

**API を作成するには**

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

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

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

1. **[API の詳細]** で **[新しい API]** を選択したままにし、**[API 名]** には **DynamoDBOperations** と入力します。

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

## REST API でリソースを作成する
<a name="services-apigateway-tutorial-resource"></a>

API に HTTP メソッドを追加するには、まずそのメソッドが操作を実行するリソースを作成する必要があります。ここでは、DynamoDB テーブルを管理するためのリソースを作成します。

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

1. [API Gateway コンソール](https://console.aws.amazon.com/apigateway)の API の **[リソース]** ページで、**[リソースの作成]** をクリックします。

1. **[リソースの詳細]** の **[リソース名]** に、**DynamoDBManager** と入力します。

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

## HTTP POST メソッドを作成する
<a name="services-apigateway-tutorial-method"></a>

このステップでは、`DynamoDBManager` リソースのためのメソッド (`POST`) を作成します。この `POST` メソッドを Lambda 関数にリンクして、メソッドが HTTP リクエストを受け取るときに、API Gateway が Lambda 関数を呼び出すようにします。

**注記**  
 このチュートリアルの目的上、DynamoDB テーブルですべての操作を実行する単一の Lambda 関数を呼び出すために、1 つの HTTP メソッド (`POST`) が使用されます。実際のアプリケーションでは、操作ごとに異なる Lambda 関数と HTTP メソッドを使用することがベストプラクティスです。詳細については、Serverless Land の「[Lambda モノリス](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/monolith)」を参照してください。

**POST メソッドを作成する**

1. API の **[リソース]** ページで、`/DynamoDBManager` リソースが強調表示されていることを確認します。次に、**[メソッド]** ペインで **[メソッドの作成]** をクリックします。

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

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

1. **[Lambda 関数]** で、使用する関数 (`LambdaFunctionOverHttps`) の Amazon リソースネーム (ARN)を選択します。

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

## DynamoDB テーブルを作成する
<a name="services-apigateway-tutorial-table"></a>

Lambda 関数が CRUD 操作を実行する空の DynamoDB テーブルを作成します。

**DynamoDB テーブルを作成する**

1. DynamoDB コンソールで [[テーブル]](https://console.aws.amazon.com/dynamodbv2#tables) ページを開きます。

1. **[テーブルの作成]** を選択します。

1. [**テーブルの詳細**] で、次の操作を行います。

   1. **[テーブル名]** に「**lambda-apigateway**」と入力します。

   1. **[パーティションキー]** に「**id**」と入力し、データ型を **[文字列]** のままにします。

1. **[Table settings]** (テーブル設定) では、**[Default settings]** (デフォルト設定) をそのまま使用します。

1. **[テーブルの作成]** を選択します。

## API Gateway、Lambda、および DynamoDB の統合をテストする
<a name="services-apigateway-tutorial-test-setup"></a>

これで、API Gateway API メソッドの Lambda 関数および DynamoDB テーブルとの統合をテストするための準備が整いました。API Gateway コンソールで、コンソールのテスト機能を使用して `POST` メソッドにリクエストを直接送信します。このステップでは、まず `create` 操作を使用して DynamoDB テーブルに新しい項目を追加し、次に `update` 操作を使用してその項目を変更します。

**テスト 1 DynamoDB テーブルで新しい項目を作成する**

1. [API Gateway コンソール](https://console.aws.amazon.com/apigateway)で、API (`DynamoDBOperations`) を選択します。

1. `DynamoDBManager` リソースの **[POST]** メソッドを選択します。

1. **[テスト]** タブを選択します。タブを表示するには、右矢印ボタンを選択する必要がある場合があります。

1. **[テストメソッド]** では、**[クエリ文字列]** と **[ヘッダー]** を空白のままにします。**[リクエスト本文]** に以下の JSON を貼り付けます。

   ```
   {
     "operation": "create",
     "payload": {
       "Item": {
         "id": "1234ABCD",
         "number": 5
       }
     }
   }
   ```

1. **[テスト]** を選択します。

   テストが完了したときに表示される結果には、`200` というステータスが表示されるはずです。このステータスコードは、`create` 操作が正常に実行されたことを示します。

    それを確認するため、DynamoDB テーブルに新しい項目が含まれていることをチェックします。

1. DynamoDB コンソールで [[Tables]](https://console.aws.amazon.com/dynamodbv2#tables) (テーブル) ページを開き、`lambda-apigateway` テーブルを選択します。

1. **[Explore table items]** (テーブルアイテムの探索) を選択します。**[返された項目]** ペインに、**[id]** `1234ABCD` と **[番号]** `5` が付いた 1 つの項目が表示されます。例:  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/items-returned.png)

**テスト 2 DynamoDB テーブルの項目を更新する**

1. [API Gateway コンソール](https://console.aws.amazon.com/apigateway)で POST メソッドの **[テスト]** タブに戻ります。

1. **[テストメソッド]** では、**[クエリ文字列]** と **[ヘッダー]** を空白のままにします。**[リクエスト本文]** に以下の JSON を貼り付けます。

   ```
   {
       "operation": "update",
       "payload": {
           "Key": {
               "id": "1234ABCD"
           },
           "UpdateExpression": "SET #num = :newNum",
           "ExpressionAttributeNames": {
               "#num": "number"
           },
           "ExpressionAttributeValues": {
               ":newNum": 10
           }
       }
   }
   ```

1. **[テスト]** を選択します。

   テストが完了したときに表示される結果には、`200` というステータスが表示されるはずです。このステータスコードは、`update` 操作が正常に実行されたことを示します。

    それを確認するため、DynamoDB テーブルの項目が変更されていることをチェックします。

1. DynamoDB コンソールで [[テーブル]](https://console.aws.amazon.com/dynamodbv2#tables) ページを開き、`lambda-apigateway` テーブルを選択します。

1. **[Explore table items]** (テーブルアイテムの探索) を選択します。**[返された項目]** ペインに、**[id]** `1234ABCD` と **[番号]** `10` が付いた 1 つの項目が表示されます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/items-returned-2.png)

## API をデプロイする
<a name="services-apigateway-tutorial-deploy-api"></a>

クライアントが API を呼び出すには、デプロイと関連するステージを作成する必要があります。ステージは、メソッドと統合が含まれる API のスナップショットを表します。

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

1. [API Gateway コンソール](https://console.aws.amazon.com/apigateway)の **[API]** ページを開き、`DynamoDBOperations` API を選択します。

1. API の **[リソース]** ページで **[API のデプロイ]** をクリックします。

1. **[ステージ]** で **[\$1新しいステージ\$1]** をクリックし、**[ステージ名]** には **test** を入力します。

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

1. **[ステージの詳細]** ペインで **[URL を呼び出す]** をコピーします。これは、HTTP リクエストを使用して関数を呼び出すために、次のステップで使用します。

## HTTP リクエストを使用して関数を呼び出すために curl を使用する
<a name="services-apigateway-tutorial-invoke-function"></a>

これで、API に HTTP リクエストを発行することで Lambda 関数を呼び出せるようになりました。このステップでは、DynamoDB テーブルに新しい項目を作成してから、その項目でオペレーションの読み取り、更新、削除を実行します。

**curl を使用して DynamoDB テーブルに項目を作成するには**

1. ローカルマシンでターミナルまたはコマンドプロンプトを開き、前のステップでコピーした呼び出し URL を使用して次の `curl` コマンドを実行します。このコマンドでは、以下のオプションを使用します。
   + `-H`: リクエストにカスタムヘッダーを追加します。ここでは、コンテンツタイプを JSON として指定します。
   + `-d`: リクエストボディでデータを送信します。このオプションは、デフォルトで HTTP POST メソッドを使用します。

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "create", "payload": {"Item": {"id": "5678EFGH", "number": 15}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"create\", \"payload\": {\"Item\": {\"id\": \"5678EFGH\", \"number\": 15}}}'
   ```

------

   オペレーションが成功すると、HTTP ステータスコードが 200 のレスポンスが返されます。

1. また、次の操作を実行して、DynamoDB コンソールを使用して新しい項目がテーブルにあることを確認できます。

   1. DynamoDB コンソールで [[テーブル]](https://console.aws.amazon.com/dynamodbv2#tables) ページを開き、`lambda-apigateway` テーブルを選択します。

   1. **[Explore table items]** (テーブルアイテムの探索) を選択します。**[返された項目]** ペインに、**[id]** `5678EFGH` と **[number]** (番号) `15` が付いた 1 つの項目が表示されます。

**curl を使用して DynamoDB テーブルの項目を読み取るには**
+ ターミナルまたはコマンドプロンプトで、以下の `curl` コマンドを実行して、先ほど作成した項目の値を読み取ります。独自の呼び出し URL を使用してください。

------
#### [ Linux/macOS ]

  ```
  curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
  -H "Content-Type: application/json" \
  -d '{"operation": "read", "payload": {"Key": {"id": "5678EFGH"}}}'
  ```

------
#### [ PowerShell ]

  ```
  curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"read\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}}}'
  ```

------

  Node.js 関数コード、または Python 関数コードのどちらを選択したかに応じて、次のいずれかの出力が表示されます。

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

  ```
  {"$metadata":{"httpStatusCode":200,"requestId":"7BP3G5Q0C0O1E50FBQI9NS099JVV4KQNSO5AEMVJF66Q9ASUAAJG",
  "attempts":1,"totalRetryDelay":0},"Item":{"id":"5678EFGH","number":15}}
  ```

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

  ```
  {"Item":{"id":"5678EFGH","number":15},"ResponseMetadata":{"RequestId":"QNDJICE52E86B82VETR6RKBE5BVV4KQNSO5AEMVJF66Q9ASUAAJG",
  "HTTPStatusCode":200,"HTTPHeaders":{"server":"Server","date":"Wed, 31 Jul 2024 00:37:01 GMT","content-type":"application/x-amz-json-1.0",
  "content-length":"52","connection":"keep-alive","x-amzn-requestid":"QNDJICE52E86B82VETR6RKBE5BVV4KQNSO5AEMVJF66Q9ASUAAJG","x-amz-crc32":"2589610852"},
  "RetryAttempts":0}}
  ```

------

**curl を使用して DynamoDB テーブルの項目を更新するには**

1. ターミナルまたはコマンドプロンプトで、以下の `curl` コマンドを実行して、先ほど作成した項目の `number` 値を更新します。独自の呼び出し URL を使用してください。

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "update", "payload": {"Key": {"id": "5678EFGH"}, "UpdateExpression": "SET #num = :new_value", "ExpressionAttributeNames": {"#num": "number"}, "ExpressionAttributeValues": {":new_value": 42}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"update\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}, \"UpdateExpression\": \"SET #num = :new_value\", \"ExpressionAttributeNames\": {\"#num\": \"number\"}, \"ExpressionAttributeValues\": {\":new_value\": 42}}}'
   ```

------

1. 項目の `number` の値が更新されたことを確認するには、別の読み取りコマンドを実行します。

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "read", "payload": {"Key": {"id": "5678EFGH"}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"read\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}}}'
   ```

------

**curl を使用して DynamoDB テーブルの項目を削除するには**

1. ターミナルまたはコマンドプロンプトで、以下の `curl` コマンドを実行して、先ほど作成した項目を削除します。独自の呼び出し URL を使用してください。

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "delete", "payload": {"Key": {"id": "5678EFGH"}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"delete\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}}}'
   ```

------

1. 削除操作が正常に実行されたことを確認します。DynamoDB コンソールの **[項目を探索]** ページの **[返された項目]** ペインで、**[id]** `5678EFGH` の項目がテーブル内に存在しなくなったことを確認します。

## リソースをクリーンアップする (オプション)
<a name="cleanup"></a>

このチュートリアル用に作成したリソースは、保持しない場合は削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウント アカウントに請求される料金の発生を防ぎます。

**Lambda 関数を削除するには**

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開きます。

1. 作成した関数を選択します。

1. **[アクション]** で、**[削除]** を選択します。

1. テキスト入力フィールドに **confirm** と入力し、**[削除]** を選択します。

**実行ロールを削除する**

1. IAM コンソールの [[ロール]](https://console.aws.amazon.com/iam/home#/roles) ページを開きます。

1. 作成した実行ロールを選択します。

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

1. テキスト入力フィールドにロールの名前を入力し、**[Delete]** (削除) を選択します。

**API を削除する**

1. API Gateway コンソールで [API のページ](https://console.aws.amazon.com/apigateway/main/apis)を開きます。

1. 作成した API を選択します。

1. [** Actions**] で、[**Delete **] を選択します。

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

**DynamoDB テーブルを削除するには**

1. DynamoDB コンソールで [[Tables (テーブル)] ページ](https://console.aws.amazon.com//dynamodb/home#tables:)を開きます。

1. 作成したテーブルを選択します。

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

1. テキストボックスに「**delete**」と入力します。

1. **[テーブルの削除]** を選択します。

# API Gateway API を使用した Lambda エラーの処理
<a name="services-apigateway-errors"></a>

API Gateway はすべての呼び出しエラーと関数エラーを内部エラーとして扱います。Lambda API が呼び出しリクエストを拒否した場合、API Gateway は 500 エラーコードを返します。関数が実行されてもエラーが返された場合、または誤った形式でレスポンスが返された場合、API Gateway は 502 を返します。どちらの場合も、API Gateway からのレスポンスの本文は `{"message": "Internal server error"}` です。

**注記**  
API Gateway は、Lambda 呼び出しを再試行しません。Lambda がエラーを返す場合、API Gateway はクライアントにエラーレスポンスを返します。

以下の例では、関数エラーになり API Gateway から 502 が返されたリクエストの X-Ray トレースマップを示しています。クライアントは一般的なエラーメッセージを受け取ります。

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/tracemap-apig-502.png)


エラーレスポンスをカスタマイズするには、コードでエラーをキャッチし、レスポンスを必要な形式に加工する必要があります。

**Example [index.js](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/nodejs-apig/function/index.mjs) - エラーの形式**  

```
var formatError = function(error){
  var response = {
    "statusCode": error.statusCode,
    "headers": {
      "Content-Type": "text/plain",
      "x-amzn-ErrorType": error.code
    },
    "isBase64Encoded": false,
    "body": error.code + ": " + error.message
  }
  return response
}
```

API Gateway は、このレスポンスをカスタムステータスコードと本文を含む HTTP エラーに変換します。トレースマップで、関数ノードが緑色なのは、エラーを処理したためです。

![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/tracemap-apig-404.png)


# HTTP リクエストを使用して Lambda 関数を呼び出す方法を選択する
<a name="apig-http-invoke-decision"></a>

Lambda の一般的なユースケースの多くでは、HTTP リクエストを使用した関数の呼び出しを行います。例えば、ウェブアプリケーションがブラウザリクエストを通じて関数を呼び出すようにしたい場合があります。Lambda 関数を使用して、完全な REST API の作成、モバイルアプリからのユーザーインタラクションの処理、HTTP コールによる外部サービスからのデータの処理、カスタムウェブフックの作成を行うこともできます。

以下のセクションでは、HTTP によって Lambda を呼び出す際の選択について説明し、特定のユースケースに適した意思決定に役立つ情報を提供します。

## HTTP 呼び出し方法を選択する場合、どのような選択肢がありますか
<a name="w2aad101c29c46b9"></a>

Lambda には、HTTP リクエストを使用して関数を呼び出す方法として、主に[関数 URL](urls-configuration.md) と [API Gateway](services-apigateway.md) の 2 つがあります。両者の主な違いは以下のとおりです。
+ **Lambda 関数 URL** は、Lambda 関数のシンプルで直接的な HTTP エンドポイントを提供します。シンプルさとコスト効率のために最適化されており、HTTP 経由で Lambda 関数を公開するための最速のパスを提供します。
+ **API Gateway** は、豊富な機能を備えた API をビルドするためのより高度なサービスです。API Gateway は、本番環境 API を大規模にビルドおよび管理することに最適化されており、セキュリティ、モニタリング、トラフィック管理の包括的なツールを提供します。

## 要件が既にわかっている場合の推奨事項
<a name="w2aad101c29c46c11"></a>

要件が既に明確な場合は、基本的な推奨事項を以下に示します。

基本認証方式とリクエスト/レスポンス処理のみが必要で、コストと複雑さを最小限に抑えたいシンプルなアプリケーションやプロトタイプには、**[関数 URL](urls-configuration.md)** をお勧めします。

**[API Gateway](services-apigateway.md)** は、大規模な本稼働用アプリケーションや、[OpenAPI Description](https://www.openapis.org/) サポート、認証オプションの選択、カスタムドメイン名、またはスロットリング、キャッシュ、リクエスト/レスポンス変換を含む豊富なリクエスト/レスポンス処理など、より高度な機能が必要な場合に適しています。

## Lambda 関数を呼び出す方法を選択する際の考慮事項
<a name="w2aad101c29c46c13"></a>

関数 URL と API Gateway から選択する場合、次の要素を考慮する必要があります。
+ ユーザーの認証に OAuth または Amazon Cognito が必要かどうかなど、認証のニーズ
+ スケーリング要件と実装する API の複雑さ
+ リクエストの検証やリクエスト/レスポンスのフォーマットなどの高度な機能が必要かどうか
+ モニタリング要件
+ コスト目標

これらの要素を理解することで、セキュリティ、複雑さ、コスト要件のバランスを取るのに最適なオプションを選択できます。

次の情報は、2 つのオプションの主な違いをまとめたものです。

### 認証
<a name="w2aad101c29c46c13c11b1"></a>
+ **関数 URL** は AWS Identity and Access Management (IAM) を通じて基本的な認証オプションを提供します。エンドポイントは、パブリック (認証なし) にするか、IAM 認証を要求するように設定できます。IAM 認証では、標準の AWS 認証情報または IAM ロールを使用してアクセスを制御できます。設定は簡単ですが、このアプローチでは、他の認証方式に比べてオプションが限られています。
+ **API Gateway** では、より包括的な認証オプションが使用できます。IAM 認証に加えて、[Lambda オーソライザー](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html) (カスタム認証ロジック)、[Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) ユーザープール、および OAuth2.0 フローを使用できます。この柔軟性により、サードパーティー認証プロバイダー、トークンベースの認証、多要素認証などの複雑な認証スキームを実装できます。

### リクエスト/レスポンス処理
<a name="w2aad101c29c46c13c11b3"></a>
+ **関数 URL** は、基本的な HTTP リクエストとレスポンスの処理を提供します。標準 HTTP メソッドがサポートされており、組み込みの Cross-Origin Resource Sharing (CORS) サポートが含まれています。JSON ペイロードとクエリパラメータは処理できますが、リクエスト変換や検証機能は提供されません。レスポンス処理も同様にシンプルです。クライアントは Lambda が返すのとまったく同じように、Lambda 関数からレスポンスを受け取ります。
+ **API Gateway** では、高度なリクエストおよびレスポンス処理機能が提供されます。リクエスト検証機能の定義、マッピングテンプレートを使用したリクエストとレスポンスの変換、リクエスト/レスポンスヘッダーの設定、およびレスポンスキャッシュの実装ができます。API Gateway はバイナリペイロードとカスタムドメイン名もサポートしており、クライアントに到達する前にレスポンスを変更できます。JSON スキーマを使用して、リクエスト/レスポンスの検証と変換のモデルを設定できます。

### スケーリング
<a name="w2aad101c29c46c13c11b5"></a>
+ **関数 URL** は、Lambda 関数の同時実行数の制限に合わせて直接スケーリングし、設定された同時実行数の上限まで関数をスケールアップすることでトラフィックの急増を処理します。この制限に達すると、Lambda は HTTP 429 レスポンスで追加のリクエストに応答します。組み込みのキューイングメカニズムがないため、スケーリングの処理は Lambda 関数の設定に完全に依存します。デフォルトでは、Lambda 関数の同時実行数は AWS リージョンあたり 1,000 に制限されています。
+ **API Gateway** には、Lambda 独自のスケーリングに加えて追加のスケーリング機能があります。リクエストキューイングとスロットリング制御が組み込まれているため、トラフィックの急増をより適切に管理できます。API Gateway は、デフォルトでリージョンごとに 1 秒あたり最大 10,000 件のリクエストを処理できます。バーストキャパシティは 1 秒あたり 5,000 件のリクエストです。また、バックエンドを保護するために、さまざまなレベル (API、ステージ、またはメソッド) でリクエストを調整するツールも提供します。

### モニタリング
<a name="w2aad101c29c46c13c11b7"></a>
+ **関数 URL** は、リクエスト数、レイテンシー、エラー率など、Amazon CloudWatch メトリクスによる基本的なモニタリングを提供します。標準の Lambda メトリクスとログにアクセスでき、関数に送信される未加工のリクエストが表示されます。これにより運用上の重要な可視性が得られますが、メトリクスは主に関数の実行に関するものになります。
+ **API Gateway** では、詳細なメトリクス、ログ記録、トレースオプションなど、包括的なモニタリング機能が提供されます。CloudWatch を使用して、API コール、レイテンシー、エラー率、キャッシュヒット/ミス率をモニタリングできます。また、API Gateway は AWS X-Ray と統合して分散型トレースを行い、ログ形式のカスタマイズが可能です。

### Cost
<a name="w2aad101c29c46c13c11b9"></a>
+ **関数 URL** は、標準の Lambda 料金モデルに従います。関数の呼び出しと計算時間についてのみ料金が発生します。URL エンドポイント自体には追加料金はかかりません。これにより、API Gateway の追加機能が必要ない場合は、シンプルな API またはトラフィックの少ないアプリケーションに対して費用対効果の高い選択肢になります。
+ **API Gateway** には、REST API で受信される 100 万回の API コールと、HTTP API で受信される 100 万回の API コールを含む[無料利用枠](https://aws.amazon.com/api-gateway/pricing/#Free_Tier)が用意されています。無料利用枠を超えると、API Gateway では API コール、データ転送、キャッシュ (有効になっている場合) に対して料金が発生します。独自のユースケースのコストについては、API Gateway の[料金ページ](https://aws.amazon.com/api-gateway/pricing/)を参照してください。

### その他の機能
<a name="w2aad101c29c46c13c11c11"></a>
+ **関数 URL** は、簡単に利用でき、Lambda と直接統合できるように設計されています。HTTP エンドポイントと HTTPS エンドポイントの両方をサポートし、組み込みの CORS サポートとデュアルスタック (IPv4 および IPv6) エンドポイントを提供します。高度な機能はありませんが、HTTP 経由で Lambda 関数を公開する迅速かつシンプルな方法が必要なシナリオに適しています。
+ **API Gateway** には、API バージョニング、ステージ管理、使用量プランの API キー、Swagger/OpenAPI による API ドキュメント、WebSocket API、VPC 内のプライベート API、セキュリティを強化するための WAF 統合など、さまざまな追加機能が含まれています。また、カナリアデプロイ、テスト用のモック統合、Lambda 以外の他の AWS のサービスとの統合もサポートされています。

## Lambda 関数を呼び出す方法を選択する
<a name="w2aad101c29c46c15"></a>

Lambda 関数 URL と API Gateway の選択基準とその主な違いについて確認した後は、ニーズに最適なオプションを選択し、以下のリソースを使用して利用を開始できます。

------
#### [ Function URLs ]

**以下のリソースを使用して関数 URL の使用を開始する**
+ 「[チュートリアル: 関数 URL を使用する Lambda 関数の作成](urls-webhook-tutorial.md)」に従います。
+ 関数 URL の詳細については、このガイドの「[Lambda 関数 URL の作成と管理](urls-configuration.md)」の章を参照してください。
+ 次の操作を実行して、コンソール内ガイド付きチュートリアル「**シンプルなウェブアプリケーションを作成**」を試します。

1. Lambda コンソールの[関数ページ](https://console.aws.amazon.com/lambda/home#/functions)を開きます。

1. 画面の右上にあるアイコンを選択して、ヘルプパネルを開きます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/images/console_help_screenshot.png)

1. **[チュートリアル]** を選択します。

1. **[シンプルなウェブアプリケーションを作成]** で、**[チュートリアルを開始]** を選択します。

------
#### [ API Gateway ]

**以下のリソースを使用して Lambda と API Gateway の使用を開始する**
+ 「[チュートリアル: API Gateway で Lambda を使用する](services-apigateway-tutorial.md)」に従って、バックエンド Lambda 関数と統合した REST API を作成します。
+ API Gateway が提供するさまざまな種類の API の詳細については、「*Amazon API Gateway デベロッパーガイド*」の以下のセクションを参照してください。
  + [API Gateway REST API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-rest-api.html)
  + [API Gateway HTTP API](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html)
  + [API Gateway WebSocket API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html)
+ 「*Amazon API Gateway デベロッパーガイド*」の「[Amazon API Gateway のチュートリアルとワークショップ](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-tutorials.html)」セクションで 1 つまたは複数の例を試してください。

------