

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

# 使用本地调用 Lambda 函数 AWS SAM
<a name="serverless-sam-cli-using-invoke"></a>

在云中进行测试或部署之前本地调用 Lambda 函数可以带来多种好处。它允许您更快地测试函数的逻辑。首先本地测试可减少在云中测试或部署期间发现问题的可能性，从而帮助您避免不必要的成本。此外，本地测试使调试变得更加容易。

您可以通过使用 [sam local invoke](sam-cli-command-reference-sam-local-invoke.md) 命令并提供函数的逻辑 ID 和事件文件，在本地调用 Lambda 函数。**sam local invoke** 还接受 `stdin` 作为事件。有关事件的更多信息，请参阅*《AWS Lambda 开发人员指南》*中的[事件](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-event)。有关来自不同 AWS 服务的事件消息格式的信息，请参阅*《AWS Lambda 开发者指南*》中的[AWS Lambda 与其他服务一起使用](https://docs.aws.amazon.com/lambda/latest/dg/lambda-services.html)。

**注意**  
不建议在不受信任的代码中使用 SAM CLI 的本地调用功能。要与本地环境完全隔离，请直接在 Lambda 服务中执行代码。

**注意**  
该**sam local invoke**命令与 AWS Command Line Interface (AWS CLI) 命令相对应[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html)。您可以使用任一命令调用 Lambda 函数。

必须在包含要调用的函数的项目目录中运行 **sam local invoke** 命令。

 示例：

```
# Invoking function with event file
$ sam local invoke "Ratings" -e event.json

# Invoking function with event via stdin
$ echo '{"message": "Hey, are you there?" }' | sam local invoke --event - "Ratings"

# For more options
$ sam local invoke --help
```

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

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

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

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

该`--env-vars`选项支持两种文件格式。根据文件内容自动检测文件格式。

### 使用 JSON 声明环境变量
<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`。

### 使用.env 文件声明环境变量
<a name="serverless-sam-cli-using-invoke-environment-file-dotenv"></a>

您也可以使用`.env`文件来声明环境变量。`.env`文件中声明的变量全局应用于所有函数，相当于 JSON 格式的`Parameters`对象。

```
TABLE_NAME=localtable
BUCKET_NAME=amzn-s3-demo-bucket
STAGE=dev
```

该`.env`格式支持注释（以开头的行`#`）和带引号的值。

**注意**  
该`.env`格式仅支持全局环境变量。要声明特定于函数的环境变量，请使用 JSON 格式。

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

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

```
# Using a JSON file
sam local invoke --env-vars env.json

# Using a .env file
sam local invoke --env-vars .env
```

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

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

## 了解详情
<a name="serverless-sam-cli-using-invoke-learn"></a>

有关在本地调用函数的动手示例，请参阅*完整 AWS SAM 研讨会*中的[模块 2-本地运行](https://s12d.com/sam-ws-en-local)。