

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Amazon API Gateway 端點調用 Lambda 函數
API Gateway

您可以使用 Amazon API Gateway 為您的 Lambda 函數建立具有 HTTP 端點的 Web API。API Gateway 提供了用於建立和記錄 Web API 的工具，可將 HTTP 請求路由至 Lambda 函數。您可以使用身分驗證和授權控制來保護對 API 的存取。您的 API 可以透過網際網路提供流量，也可以只在 VPC 內存取。

**提示**  
Lambda 提供兩種透過 HTTP 端點調用函數的方式：API Gateway 與 Lambda 函數 URL。如果不確定哪種方法最適合自己的使用案例，請參閱[選取一種使用 HTTP 請求調用 Lambda 函數的方法](apig-http-invoke-decision.md)。

API 中的資源定義一個或多個方法，例如 GET 或 POST。方法具有將請求路由到 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)
+ [

## Proxy 整合
](#apigateway-proxy)
+ [

## 事件格式
](#apigateway-example-event)
+ [

## 回應格式
](#apigateway-types-transforms)
+ [

## 許可
](#apigateway-permissions)
+ [

## 範例應用程式
](#services-apigateway-samples)
+ [

## Powertools for AWS Lambda 的事件處理常式
](#services-apigateway-powertools)
+ [

# 教學課程：搭配使用 Lambda 與 API Gateway
](services-apigateway-tutorial.md)
+ [

# 使用 API Gateway API 處理 Lambda 錯誤
](services-apigateway-errors.md)
+ [

# 選取一種使用 HTTP 請求調用 Lambda 函數的方法
](apig-http-invoke-decision.md)

## 選擇 API 類型


API Gateway 支援三種調用 Lambda 函數的 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)：與用戶端維持持續連線以進行全雙工通訊的 Web API。

HTTP API 和 REST API 都是處理 HTTP 請求並傳回回應的 RESTful API。HTTP API 較新，並且是使用 API Gateway 版本 2 API 建置而成。下列功能是 HTTP API 的新功能：

**HTTP API 功能**
+ **自動部署** - 當您修改路由或整合時，變更會自動部署至已啟用自動部署的階段。
+ **預設階段** - 您可以建立預設階段 (`$default`)，在 API URL 的根路徑提供請求。對於具名階段，您必須在路徑的開頭加入階段名稱。
+ **CORS 組態** - 您可以設定 API 將 CORS 標頭新增到傳出回應中，而不是在函數程式碼中手動新增。

REST API 是 API Gateway 自推出以來支援的典型 RESTful API。REST API 目前具有更多的自訂、整合和管理功能。

**REST API 功能**
+ **整合類型** - REST API 支援自訂 Lambda 整合。您可以使用自訂整合，只將請求的本文傳送到函數，或者在將請求本文傳送到函數之前套用轉換範本。
+ **存取控制** - REST API 支援其他身分驗證和授權選項。
+ **監控和追蹤** – REST APIs支援 AWS X-Ray 追蹤和其他記錄選項。

如需詳細比較，請參閱《API Gateway 開發人員指南》**中的 [Choose between HTTP APIs and REST APIs](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 APIs AWS Lambda 代理整合](https://docs.aws.amazon.com//apigateway/latest/developerguide/http-api-develop-integrations-lambda.html)。

如需詳細資訊，請參閱[在 API Gateway 中建立 HTTP APIs AWS Lambda 代理整合](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html)。

## 將端點新增至您的 Lambda 函數


**若要將公有端點新增至您的 Lambda 函數**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇一個函數。

1. 在**函數概觀**下，選擇**新增觸發條件**。

1. 選取 **API Gateway** (API Gateway )。

1. 選擇 **Create an API** (建立 API) 或 **Use an existing API** (使用現有 API)。

   1. **全新 API**：對於 **API type** (API 類型)，請選擇 **HTTP API**。如需詳細資訊，請參閱[選擇 API 類型](#services-apigateway-apitypes)。

   1. **現有 API：**從下拉式清單中選取 API 或輸入 API ID (例如，r3pmxmplak)。

1. 在 **Security** (安全性) 中，選擇 **Open** (開啟)。

1. 選擇 **Add** (新增)。

## Proxy 整合


API Gateway API 由階段、資源、方法和整合所組成。階段和資源決定端點的路徑：

**API 路徑格式**
+ `/prod/` - `prod` 階段和根資源。
+ `/prod/user` - `prod` 階段和 `user` 資源。
+ `/dev/{proxy+}` - `dev` 階段中的任何路由。
+ `/` - (HTTP API) 預設階段和根資源。

Lambda 整合將路徑和 HTTP 方法組合映射到一個 Lambda 函數。您可以設定 API Gateway 依現狀傳遞 HTTP 請求的主體 (自訂整合)，或將請求主體封裝在一個包含所有請求資訊 (包括標頭、資源、路徑和方法) 的文件中。

如需設定詳細資訊，請參閱 [Lambda proxy integrations in API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html)。

## 事件格式


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)。

## 回應格式


API Gateway 會等待函數的回應並將結果轉達給呼叫者。對於自訂整合，您可以定義整合回應和方法回應，將函數的輸出轉換為 HTTP 回應。對於代理整合，函數必須以特定格式的回應表示作出回應。

下列範例顯示來自 Node.js 函數的回應物件。回應物件表示包含 JSON 文件的成功 HTTP 回應。

**Example index.mjs - 代理整合回應物件 (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
  }
```

## 許可


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` 資源上的 ANY 方法。
+ `mnh1xmpli7/*/*/*` - 所有階段中所有資源上的任何方法。

如需檢視政策和移除陳述式的詳細資訊，請參閱 [在 Lambda 中檢視資源型 IAM 政策](access-control-resource-based.md)。

## 範例應用程式


[具有 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 的事件處理常式


撰寫 API Gateway 端點 (HTTP 或 REST) 調用的 Lambda 函數時，來自 Powertools for AWS 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


```
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


```
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);
};
```

# 教學課程：搭配使用 Lambda 與 API Gateway
教學課程

在此教學課程中，您將建立 REST API，並透過此 API 調用 Lambda 函數。Lambda 函數會對 DynamoDB 資料表執行建立、讀取、更新及刪除 (CRUD) 操作。這裡提供的函數僅供示範，您將學習如何設定可調用任何 Lambda 函數的 API Gateway REST API。

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


使用 API Gateway 為使用者提供安全的 HTTP 端點以調用 Lambda 函數，並透過流量限流以及自動驗證和授權 API 呼叫，協助管理函數的大量呼叫。API Gateway 也提供使用 AWS Identity and Access Management (IAM) 和 Amazon Cognito 的彈性安全控制。對於需要預先授權才能呼叫應用程式的使用案例，這非常有用。

**提示**  
Lambda 提供兩種透過 HTTP 端點調用函數的方式：API Gateway 與 Lambda 函數 URL。如果不確定哪種方法最適合自己的使用案例，請參閱[選取一種使用 HTTP 請求調用 Lambda 函數的方法](apig-http-invoke-decision.md)。

完成本教學課程需逐一進行以下階段：

1. 以 Python 或 Node.js 建立並設定 Lambda 函數，用於對 DynamoDB 資料表執行操作。

1. 在 API Gateway 中建立 REST API 以連接 Lambda 函數。

1. 建立 DynamoDB 資料表，然後在主控台中使用您的 Lambda 函數進行測試。

1. 在終端內使用 curl 部署 API 並測試完整設定。

完成這些階段後，您將了解如何使用 API Gateway 建立 HTTP 端點，以安全地調用任何規模的 Lambda 函數。您也會學習如何部署 API，以及如何在控制台中以及使用終端傳送 HTTP 請求來進行測試。

## 建立許可政策


在建立 Lambda 函數的[執行角色](lambda-intro-execution-role.md)之前，您必須先建立許可政策，以授予函數存取所需 AWS 資源的許可。在本教學課程中，政策允許 Lambda 對 DynamoDB 資料表執行 CRUD 操作，以及寫入 Amazon CloudWatch Logs。

**建立政策**

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. 選擇**建立政策**。

## 建立執行角色


[執行角色](lambda-intro-execution-role.md)是授予 Lambda 函數存取 AWS 服務 和資源許可的 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 函式


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/zh_tw/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

## 測試函數


在將函數與 API Gateway 整合之前，請確認已成功部署該函數。使用 Lambda 主控台將測試事件傳送至函式。

1. 在函式的 Lambda 主控台頁面中，選擇**測試**索引標籤。  
![\[\]](http://docs.aws.amazon.com/zh_tw/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


在此步驟中，您將建立用來調用 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 上建立資源


若要將 HTTP 方法新增到 API 中，首先需為該方法建立用來操作的資源。您可以在此建立資源來管理 DynamoDB 資料表。

**若要建立資源**

1. 在 [API Gateway 主控台](https://console.aws.amazon.com/apigateway)的 API **資源**頁面上，選擇**建立資源**。

1. 在**資源詳細資訊**中，針對**資源名稱**輸入 **DynamoDBManager**。

1. 選擇 **建立資源** 。

## 建立 HTTP POST 方法


在此步驟中，您將為 `DynamoDBManager` 資源建立方法 (`POST`)。您需將此 `POST` 方法連結到 Lambda 函數，如此一來當方法收到 HTTP 請求，API Gateway 就會調用 Lambda 函數。

**注意**  
 基於本教學課程的目的，會使用一個 HTTP 方法 (`POST`) 來調用單一 Lambda 函數，該函數會對 DynamoDB 資料表執行所有操作。在實際的應用程式中，最佳實務是針對每項操作使用不同的 Lambda 函數和 HTTP 方法。如需詳細資訊，請參閱無伺服器園地中的 [The Lambda Monolith](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/monolith)。

**建立 POST 方法**

1. 在 API 的**資源**頁面上，確定已反白選取 `/DynamoDBManager` 資源。然後，在**方法**窗格中，選擇**建立方法**。

1. 針對**方法類型**，選擇 **POST**。

1. 對於**整合類型**，讓 **Lambda 函數**維持在已選取的狀態。

1. 對於 **Lambda 函數**，請為函數 (`LambdaFunctionOverHttps`) 選擇 Amazon Resource Name (ARN)。

1. 選擇**建立方法**。

## 建立 DynamoDB 資料表


建立空白的 DynamoDB 資料表，Lambda 函數會對該資料表執行 CRUD 操作。

**若要建立 DynamoDB 資料表**

1. 開啟 DynamoDB 主控台的[資料表](https://console.aws.amazon.com/dynamodbv2#tables)頁面。

1. 選擇 **建立資料表** 。

1. 在 **Table details** (資料表詳細資訊) 下，執行下列動作：

   1. 對於 **Table name** (資料表名稱)，請輸入 **lambda-apigateway**。

   1. 對於 **Partition key** (分割區索引鍵)，輸入**id**，並保持資料類型設定為 **String** (字串)。

1. 在 **Table settings** (資料表設定) 下，保留 **Default settings** (預設設定)。

1. 選擇 **建立資料表** 。

## 測試 API Gateway、Lambda 和 DynamoDB 的整合


您現在已準備好測試 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 主控台的 [資料表頁面](https://console.aws.amazon.com/dynamodbv2#tables) ，然後選擇 `lambda-apigateway` 資料表。

1. 選擇 **探索資料表項目** 。在 **Items returned** (傳回的項目) 窗格中，應該會看到一個包含 **id** `1234ABCD` 和 **number** `5` 的項目。範例：  
![\[\]](http://docs.aws.amazon.com/zh_tw/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. 選擇 **探索資料表項目** 。在 **Items returned** (傳回的項目) 窗格中，應該會看到一個包含 **id** `1234ABCD` 和 **number** `10` 的項目。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/items-returned-2.png)

## 部署 API


為了讓用戶端能呼叫您的 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 請求調用函數。

## 使用 curl 來透過 HTTP 請求調用函數


您現在可以透過向 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. 選擇 **探索資料表項目** 。在 **Items returned** (傳回的項目) 窗格中，應該會看到一個包含 **id** `5678EFGH` 和 **number** `15` 的項目。

**若要使用 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` 的項目已不存在於資料表中。

## 清除資源 (選用)


除非您想要保留為此教學課程建立的資源，否則您現在便可刪除。透過刪除您不再使用 AWS 的資源，您可以避免不必要的 費用 AWS 帳戶。

**若要刪除 Lambda 函數**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇您建立的函數。

1. 選擇 **Actions** (動作)、**Delete** (刪除)。

1. 在文字輸入欄位中輸入 **confirm**，然後選擇**刪除**。

**刪除執行角色**

1. 開啟 IAM 主控台中的 [角色頁面](https://console.aws.amazon.com/iam/home#/roles) 。

1. 選取您建立的執行角色。

1. 選擇**刪除**。

1. 在文字輸入欄位中輸入角色的名稱，然後選擇 **刪除** 。

**若要刪除 API**

1. 開啟 API Gateway 主控台中的 [API 頁面](https://console.aws.amazon.com/apigateway/main/apis) 。

1. 選取您建立的 API。

1. 選擇 **動作** 、**刪除** 。

1. 選擇 **刪除** 。

**若要刪除 DynamoDB 資料表**

1. 開啟 DynamoDB 主控台的 [資料表頁面](https://console.aws.amazon.com//dynamodb/home#tables:) 。

1. 選取您建立的資料表。

1. 選擇 **刪除** 。

1. 在文字方塊中輸入 **delete**。

1. 選擇 **刪除資料表** 。

# 使用 API Gateway API 處理 Lambda 錯誤
錯誤

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/zh_tw/lambda/latest/dg/images/tracemap-apig-502.png)


若要自訂錯誤回應，您必須在程式碼中發現錯誤，並以必要的格式格式化回應。

**Example [index.mjs](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/zh_tw/lambda/latest/dg/images/tracemap-apig-404.png)


# 選取一種使用 HTTP 請求調用 Lambda 函數的方法
API Gateway 與函數 URL 比較

Lambda 的許多常見使用案例涉及使用 HTTP 請求調用您的函數。例如，您可能希望 Web 應用程式透過瀏覽器請求調用您的函式。Lambda 函式也可用於建立完整的 REST API、處理來自行動應用程式的使用者互動、透過 HTTP 呼叫處理來自外部服務的資料，或建立自訂 Webhook。

以下各節說明透過 HTTP 調用 Lambda 的選擇，並提供資訊以協助您針對特定使用案例做出正確決策。

## 選取 HTTP 調用方法時，您有哪些選擇？
您有哪些選擇

Lambda 提供兩種主要方法來使用 HTTP 請求調用函數 - [函數 URL](urls-configuration.md) 和 [API Gateway](services-apigateway.md)。這兩種選項的主要差異如下所示：
+ **Lambda 函數 URL** 可為 Lambda 函數提供簡單、直接的 HTTP 端點。已針對簡單性和成本效益對其進行最佳化，並提供透過 HTTP 公開 Lambda 函數的最快路徑。
+ **API Gateway** 是一種更進階的服務，用於建置功能完整的 API。API Gateway 已針對大規模建置和管理生產 API 進行最佳化，並提供完整的安全、監控和流量管理工具。

## 您已知道自己需求時的建議
基本建議

如果您已經清楚自己的需求，以下是基本建議：

建議**[函數 URL](urls-configuration.md)** 用於簡單的應用程式或原型設計，其中您只需要基本的身分驗證方法和請求/回應處理，並想要將成本和複雜性降至最低。

**[API Gateway](services-apigateway.md)** 是大規模生產應用程式或需要更進階功能的情況的更佳選擇，例如 [OpenAPI Description](https://www.openapis.org/) 支援、身分驗證選項、自訂網域名稱或豐富的請求/回應處理，包括限流、快取和請求/回應轉換。

## 選擇調用 Lambda 函數的方法時應考慮的事項
應考慮什麼

在函數 URL 和 API Gateway 之間選取時，需要考慮下列因素：
+ 您的身分驗證需要，例如是否需要 OAuth 或 Amazon Cognito 來驗證使用者
+ 您的擴展需求以及您要實作之 API 的複雜性
+ 您是否需要進階功能，例如請求驗證和請求/回應格式化
+ 您的監控需求
+ 您的成本目標

透過了解這些因素，可以選擇最能平衡您的安全性、複雜性和成本需求的選項。

下列資訊摘要說明兩個選項之間的主要差異。

### 身分驗證

+ **函數 URLs**提供基本身分驗證選項。 AWS Identity and Access Management 可以將端點設定為公有 (無身分驗證) 或需要 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 流程。此彈性可讓您實作複雜的身分驗證機制，包括第三方身分驗證提供者、權杖型身分驗證和多重要素身分驗證。

### 請求/回應處理

+ **函數 URL** 提供基本的 HTTP 請求和回應處理。它們支援標準 HTTP 方法，並包含內建的跨來源資源共用 (CORS) 支援。雖然他們可以自然處理 JSON 承載和查詢參數，但它們不提供請求轉換或驗證功能。回應處理同樣簡單 – 用戶端接收來自 Lambda 函數的回應，就像 Lambda 傳回它一樣。
+ **API Gateway** 可提供複雜的請求和回應處理功能。您可以定義請求驗證器，使用映射範本轉換請求和回應，設定請求/回應標頭，以及實作回應快取。API Gateway 也支援二進位承載和自訂網域名稱，並且可以在回應到達用戶端之前對其進行修改。可以使用 JSON 結構描述來設定請求/回應驗證和轉換的模型。

### 擴展

+ **函數 URL** 會根據 Lambda 函數的並行限制直接擴展，並透過將函數擴展到其設定的並行限制上限來處理流量尖峰。達到該限制後，Lambda 會使用 HTTP 429 回應來回應其他請求。沒有內建佇列機制，因此處理擴展完全取決於 Lambda 函數的組態。根據預設，Lambda 函數每個 有 1，000 個並行執行的限制 AWS 區域。
+ 除了 Lambda 自己的擴展之外，**API Gateway** 還提供其他擴展功能。它包含內建的請求佇列和限流控制，可讓您更輕鬆地管理流量尖峰。根據預設，API Gateway 每秒最多可以處理 10,000 個請求，高載容量為每秒 5,000 個請求。它也提供在不同層級調節請求的工具 (API、階段或方法)，以保護後端。

### 監控

+ **函數 URL** 透過 Amazon CloudWatch 指標提供基本監控，包括請求計數、延遲和錯誤率。可以存取標準 Lambda 指標和日誌，它們會顯示傳入函數的原始請求。雖然這可提供基本的操作可見性，但指標主要著重於函數執行。
+ **API Gateway** 提供全面的監控功能，包括詳細的指標、記錄和追蹤選項。可以透過 CloudWatch 來監控 API 呼叫、延遲、錯誤率和快取命中率/遺失率。API Gateway 也會整合 與 AWS X-Ray 以進行分散式追蹤，並提供可自訂的記錄格式。

### Cost

+ **函數 URL** 遵循標準 Lambda 定價模型 – 您只需支付函數調用和運算時間的費用。URL 端點本身不收取額外費用。如果您不需要 API Gateway 的其他功能，這對於簡單的 API 或低流量應用程式而言是一個具成本效益的選擇。
+ **API Gateway** 提供[免費方案](https://aws.amazon.com/api-gateway/pricing/#Free_Tier)，其中包含針對 REST API 收到的一百萬個 API 呼叫，以及針對 HTTP API 收到的一百萬個 API 呼叫。之後，API Gateway 會針對 API 呼叫、資料傳輸和快取 (如果啟用) 收取費用。請參閱 API Gateway [定價頁面](https://aws.amazon.com/api-gateway/pricing/)，了解您自己的使用案例費用。

### 其他功能

+ **函數 URL** 旨在實現簡便性和直接 Lambda 整合。它們支援 HTTP 和 HTTPS 端點，提供內建 CORS 支援，並提供雙堆疊 (IPv4 和 IPv6) 端點。雖然它們缺乏進階功能，但它們在您需要快速、直接地透過 HTTP 公開 Lambda 函數時表現卓越。
+ **API Gateway** 包含許多其他功能，例如 API 版本控制、階段管理、用於用量計劃的 API 金鑰、透過 Swagger/OpenAPI 的 API 文件、WebSocket API、VPC 中的私有 API 以及 WAF 整合，以提供額外的安全性。它還支援 Canary 部署、用於測試的模擬整合，以及與 Lambda AWS 服務 以外的其他 整合。

## 選取調用 Lambda 函數的方法
選取調用方法

現在您已了解在 Lambda 函數 URL 和 API Gateway 之間進行選擇的條件，以及它們之間的主要差異，您可以選擇最符合您需求的選項，並使用下列資源來協助您開始使用。

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

**使用下列資源開始使用函數 URL**
+ 遵循教學課程[建立具有函數 URL 的 Lambda 函數](urls-webhook-tutorial.md)
+ 在本指南的 [建立及管理 Lambda 函數 URL](urls-configuration.md) 章節中進一步了解 函數 URL
+ 透過執行以下操作，嘗試主控台內的引導式教學課程**建立簡單的 Web 應用程式**：

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇畫面右上角的圖示以開啟說明面板。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/console_help_screenshot.png)

1. 選取**教學課程**。

1. 在**建立簡單的 Web 應用程式中**，選擇**開始教學課程**。

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

**使用下列資源開始使用 Lambda 和 API Gateway**
+ 依照教學課程[搭配使用 Lambda 與 API Gateway](services-apigateway-tutorial.md) 來建立與後端 Lambda 函數整合的 REST API。
+ 在 *Amazon API Gateway 開發人員指南*的下列章節中，進一步了解 API Gateway 提供的不同類型 API：
  + [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 開發人員指南*的[教學課程和研討會](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-tutorials.html)一節中的一個或多個範例。

------