使用带有 Terraform 的Amazon SAM CLI 进行本地调试和测试 - Amazon Serverless Application Model
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用带有 Terraform 的Amazon SAM CLI 进行本地调试和测试

Terraform 支持是Amazon SAM CLI 的预览版,可能会发生变化。要提供反馈和提交功能请求,请创建GitHub问题

Amazon Serverless Application Model命令行界面 (Amazon SAMCLI) 支持对您的Amazon Lambda函数和层进行本地调试和测试。有关此功能的介绍,请参见Amazon SAMCLI 对 Terraform 的支持是什么?

本地调试和测试概述

准备 Terraform 项目以进行本地调试和测试的一般过程包括:

  1. 根据您的 Terraform 项目结构确定是否需要定义。sam metadata resource

  2. 根据您的 Terraform 项目结构确定是否需要运行sam build

  3. 使用支持的Amazon SAM CLI 命令在本地调试和测试您的 Lambda 函数。

在本地调试和测试时,使用terraform planterraform apply来准备和部署您的更改。

相同的元数据资源

sam metadata resource是一种null_resource Terraform 资源类型,根据你的 Terraform 项目结构是可选的。要了解有关此资源类型的更多信息,请参阅 Terraform 文档中的 null_ resource。

为Amazon SAM CLIsam metadata resource 提供了在您的 Terraform 项目中查找 Lambda 函数和层及其源代码、构建依赖关系和构建逻辑所需的信息。如果您在 Terraform 项目之外构建 Lambda 资源工件,并将这些工件路径传递给您的 Terraform 项目,sam metadata resource则不是必需的。

或者,如果您使用 Terraform 变量定义您的 Lambda 工件,也不需要定义sam metadata resource。Amazon SAMCLI 将使用这些 Terraform 变量。有关 Terraform 变量的更多信息,请参阅 TF_VAR_nameTerraform 的开发者文档

否则,如果您在 Terraform 项目中构建 Lambda 函数和层,sam metadata resource则每个函数和层都需要使用。

定义相同的元数据资源

定义您的时,请使用以下准则sam metadata resource

  • 将您的sam metadata resource开头命名sam_metadata_为,以Amazon SAM便 CLI 将其标识为sam metadata resource

  • triggers区块中定义您的属性。

  • 使用depends_on参数定义您的 Lambda 函数或层构建逻辑。

这是一个基本的sam metadata resource模板结构:

resource "null_resource" "sam_metadata_..." { triggers = { resource_name = resource_name resource_type = resource_type original_source_code = original_source_code built_output_path = built_output_path } depends_on = [ null_resource.build_lambda_function # ref to your build logic ] }

您的详细信息sam metadata resource将因 Lambda 资源类型(函数或层)和打包类型(ZIP 或映像)而异。有关定义此资源的更多信息以及示例,请参阅相同的元数据资源

在 Terraform 上使用Amazon SAM命令行界面

使用支持的Amazon SAM CLI 命令时需要定义的主要属性是:

  • --hook-name

  • --beta-features

这些属性可以在运行Amazon SAM CLI 命令时从命令行定义,也可以在您的samconfig.toml文件中定义。添加以下内容以在samconfig.toml文件中定义这些属性:

version = 0.1 [default] [default.build.parameters] hook_name = "terraform" beta_features = true

或者,在使用Amazon SAM CLI 和支持的命令时配置这些属性。有关从命令行定义这些属性的示例,请参见以下示例:

# Using sam build with Terraform sam build --hook-name terraform --beta-features # Using sam local invoke with Terraform sam local invoke --hook-name terraform --beta-features # Using sam local start-lambda with Terraform sam local start-lambda --hook-name terraform --beta-features

如果您不允许使用测试版功能,Amazon SAMCLI 将在您定义--hook-name选项时提示您选择加入:

Supporting Terraform applications is a beta feature.
Please confirm if you would like to proceed using AWS SAM CLI with terraform application.
You can also enable this beta feature with 'sam local invoke --beta-features'. [y/N]: y

Experimental features are enabled for this session.
Visit the docs page to learn more about the AWS Beta terms https://aws.amazon.com/service-terms/.

使用 sam build 构建你的 Terraform 项目

只有在定义了时才需要运行sam build以初始化您的 Terraform 项目以进行本地调试和测试sam metadata resource。否则sam build,不需要运行。

要进行构建sam build,请从 Terraform 项目根目录运行以下命令:

sam build --hook-name terraform --beta-features lambda-resource-id

或者,您可以提供要构建id的 Lambda 函数或层。接受的 ID 是 Lambda 函数名称或完整的 Terraform 资源地址,例如aws_lambda_function.list_booksmodule.list_book_function.aws_lambda_function.this[0]

注意

运行时sam build,您的sam metadata resourcedepends_on参数必须引用您的 Lambda 资源构建逻辑。

有关 sam build 的更多信息,请参阅山姆·布莱德

使用 sam 本地调用进行本地测试

注意

要使用Amazon SAM CLI 在本地进行测试,必须安装和配置 Docker。有关说明,请参阅 安装 Docker 以便与Amazon SAM CLI 一起使用

以下是通过传入事件在本地测试 Lambda 函数的示例:

sam local invoke --hook-name terraform --beta-features hello_world_function -e events/event.json -

有关 sam local invoke 的更多信息,请参阅sam 本地调用

使用 sam 本地启动 lambda 进行本地测试

以下是使用在本地测试 Lambda 函数的示例Amazon CLI:

# Start Lambda sam local start-lambda --hook-name terraform --beta-features hello_world_function # Test locally aws lambda invoke --function-name hello_world_function --endpoint-url http://127.0.0.1:3001/ response.json --cli-binary-format raw-in-base64-out --payload file://events/event.json

有关 sam local start-lambda 的更多信息,请参阅sam local start-la

不支持的 Terraform 功能

目前不支持以下 Terraform 功能:

  • 链接到多个层的 Lambda 函数。

  • 对局部值进行地形化处理。