

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在本地运行 API Gateway AWS SAM
<a name="serverless-sam-cli-using-start-api"></a>

在本地运行 Amazon API Gateway 可以带来多种好处。例如，在本地运行 API Gateway 可以让您在部署到 AWS 云端之前在本地测试 API 端点。如果您先在本地测试，则通常可以减少在云中的测试和开发，从而有助于降低成本。此外，在本地运行使调试变得更加容易。

要启动可用于测试 HTTP 请求/响应功能的 API Gateway 本地实例，请使用命令。`sam local start-api` AWS SAMCLI此功能具有热重载功能，让您可以快速开发和迭代函数。

**注意**  
*热重载*是指只刷新已更改的文件，并且应用程序的状态保持不变。相比之下，*实时重载*是指刷新整个应用程序，并且应用程序的状态会丢失。

有关使用 `sam local start-api` 命令的说明，请参阅 [使用 sam local start-api 进行测试简介](using-sam-cli-local-start-api.md)。

默认情况下， AWS SAM 使用 AWS Lambda 代理集成，同时支持两种`HttpApi``Api`资源类型。有关`HttpApi`资源类型的代理集成的更多信息，请参阅《*API Gateway 开发者*指南》 APIs中的[使用 HTTP 的 AWS Lambda 代理集成](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html)。有关代理与 `Api` 资源类型集成的更多信息，请参阅*《API Gateway 开发人员指南》*中的[理解 API Gateway Lambda 代理集成](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-create-api-as-simple-proxy)。

**示例**：

```
$ sam local start-api
```

AWS SAM 自动查找 AWS SAM 模板中已定义`HttpApi`或`Api`事件源的所有函数。然后，它将函数挂载在定义的 HTTP 路径中。

在以下 `Api` 示例中，对于 `GET` 请求，`Ratings` 函数将在 `/ratings` 中挂载 `ratings.py:handler()`：

```
Ratings:
  Type: AWS::Serverless::Function
  Properties:
    Handler: ratings.handler
    Runtime: python3.9
    Events:
      Api:
        Type: Api
        Properties:
          Path: /ratings
          Method: get
```

以下是 `Api` 响应示例：

```
// Example of a Proxy Integration response
exports.handler = (event, context, callback) => {
    callback(null, {
        statusCode: 200,
        headers: { "x-custom-header" : "my custom header value" },
        body: "hello world"
    });
}
```

如果您修改了函数的代码，请对 `sam local start-api` 运行 `sam build` 命令以检测您的更改。

## 环境变量文件
<a name="serverless-sam-cli-using-start-api-environment-variable"></a>

要在本地声明可覆盖模板中定义的值的环境变量，请执行以下操作：

1. 创建包含要覆盖的环境变量的 JSON 文件。

1. 使用 `--env-vars` 参数覆盖模板中定义的值。

### 声明环境变量
<a name="serverless-sam-cli-using-invoke-environment-file-declaring"></a>

要声明可全局应用于所有资源的环境变量，请如下所示指定 `Parameters` 对象：

```
{
    "Parameters": {
        "TABLE_NAME": "localtable",
        "BUCKET_NAME": "amzn-s3-demo-bucket",
        "STAGE": "dev"
    }
}
```

要为每个资源声明不同的环境变量，请如下所示为每个资源指定对象：

```
{
    "MyFunction1": {
        "TABLE_NAME": "localtable",
        "BUCKET_NAME": "amzn-s3-demo-bucket",
    },
    "MyFunction2": {
        "TABLE_NAME": "localtable",
        "STAGE": "dev"
    }
}
```

为每个资源指定对象时，可以使用以下标识符，这些标识符按优先级从高到低的顺序列出：

1. `logical_id`

1. `function_id`

1. `function_name`

1. 完整路径标识符

您可以在单个文件中结合使用上述两种声明环境变量的方法。如果这样做，您为特定资源提供的环境变量会优先于全局环境变量。

将环境变量保存在 JSON 文件中，例如 `env.json`。

### 覆盖环境变量值
<a name="serverless-sam-cli-using-start-api-environment-file-override"></a>

要用 JSON 文件中定义的变量覆盖环境变量，请将 `--env-vars` 参数与 **invoke** 或 **start-api** 命令一起使用。例如：

```
$ sam local start-api --env-vars env.json
```

## 图层
<a name="serverless-sam-cli-using-start-api-layers"></a>

如果应用程序包含层，有关如何在本地主机上调试层的问题，请参阅[使用带有 Lambda 层的 Lambda 层来提高效率 AWS SAM](serverless-sam-cli-layers.md)。