亚马逊云科技 SAM 对 HashiCorp Terraform 的支持现已正式上线

作者: 埃里克·约翰逊 |

2022 年 11 月,亚马逊云科技 宣布 公开预览 支持 HashiC or p Terrafor m 的 亚马逊云科技 无服务器应用程序模型 (亚马逊云科技 SAM) 。 公共预览版引入了一系列功能,以帮助 Terraform 用户在本地测试无服务器应用程序。今天,亚马逊云科技 宣布在 亚马逊云科技 SAM 中全面推出 Terraform 支持。这个 GA 版本扩展了 亚马逊云科技 SAM 的功能集,以增强无服务器应用程序的本地开发。

Terraform 和 亚马逊云科技 SAM 都是开源框架,允许开发人员将基础设施定义为代码 (IaC)。开发人员可以像共享代码一样对基础架构定义进行版本控制和共享。但是,由于 亚马逊云科技 SAM 是专门为无服务器设计的,因此它包括专为无服务器开发而设计的命令行接口 (CLI)。CLI 使开发人员能够使用本地仿真器以及构建和部署工具创建、调试和部署无服务器应用程序。在此版本中,亚马逊云科技 SAM 还将这些工具的子集制作给 Terraform 用户。

地形支持

公开预览博客 展示了对Terraform的初步支持。这篇博客演示了 亚马逊云科技 SAM 针对本地开发的扩展功能集。 该博客还使用了适用于 亚马逊云科技 Lambda 函数和层的 Serverless.tf 模块 ,而不是原生 Terraform 资源 ,从而简化了实现。

模块可以为 Lambda 函数和层构建部署工件。此外,该模块会自动生成 亚马逊云科技 SAM 与 Terraform 资源连接所需的元数据。要使用原生 Terraform 资源,请参阅 预览博客 了解元数据 配置。

正在下载代码

要了解 亚马逊云科技 SAM 对 Terraform 的支持,请访问 a w s-sam-terraform-examples 存储库。克隆存储库并切换到 ga 目录以开始使用:

git 克隆 https://github.com/aws-samples/aws-sam-terraform-examples

cd ga

在这个目录中,有两个演示应用程序。 这两个应用程序完全相同,唯一的不同是 api_gateway_v1 使用 亚马逊 API Gateway REST API (v1),ap i_ gateway_v2 使用 亚马逊 API Gateway HTTP API ( v 2)。 选择一个并切换到该目录中的 tf-resou rc es 文件夹。

cd api_gateway_v1/tf-resources

除非另有说明,否则本文中的示例引用了 api_gateway_ v1 应用程序。

代码结构

Code structure diagram

代码结构图

Terraform 支持将 iaC 分散到多个文件中。因此,开发人员通常将所有 Terraform 文件收集在一个目录中,并将资源文件保存在其他地方。示例应用程序是这样配置的。

任何 Terraform 或 亚马逊云科技 SAM 命令都必须从 主.tf 文件(在本例中为 tf-resources 目录)的位置运行。 由于 亚马逊云科技 SAM 命令通常从项目根目录运行,因此 亚马逊云科技 SAM 有一个支持嵌套结构的命令。如果从嵌套文件夹运行 相同的编译 命令,请将 terraform-project-root-project-root-path 标志 以及指向项目根目录的相对路径 或绝对路径传递。

本地调用

Terraform 的预览版支持本地调用,但该团队通过支持 Serverless.TF 简化了体验。演示应用程序中有两个功能。响应器函数是 API 网关端点的后端集成,而身份验证函数是自定义授权器。在 f unctions.tf 文件中找到这两个模块的定义。

响应器功能

module "lambda_function_responder" {
  source        = "terraform-aws-modules/lambda/aws"
  version       = "~> 6.0"
  timeout       = 300
  source_path   = "${path.module}/src/responder/"
  function_name = "responder"
  handler       = "app.open_handler"
  runtime       = "python3.9"
  create_sam_metadata = true
  publish       = true
  allowed_triggers = {
    APIGatewayAny = {
      service    = "apigateway"
      source_arn = "${aws_api_gateway_rest_api.api.execution_arn}/*/*"
    }
  }
}

有两个重要参数:

  • source_path ,它指向本地文件夹。由于这不是压缩文件,因此 Serverless.tf 会根据需要构建工件。
  • create_sam_dat a,它生成 亚马逊云科技 SAM 查找必要文件和模块所需的元数据。

要在本地调用该函数,请运行以下命令:

  1. 运行 build 运行任何构建脚本 sam build
    --hook-name terrafor 
     
     m--terraform-project-root-project-
    root-p
  2. 运行本地调用以调用所需的 Lambda 函数 sam 本地调用--h
    ook-name terrafor 
     
     m--terraform-project-root-project-project-project-project-project-project_responder.aws_lambda_func
    tion.this [0] '

由于该项目是 Terraform,因此需要使用值为 terrafor m 挂钩名称 参数才能让 亚马逊云科技 SAM 知道如何进行。函数名称是模块名称及其变为的资源类型的组合。如果您不确定名称,请运行不带名称的命令:

sam local invoke --hook-name terraform

亚马逊云科技 SAM 会对模板进行评估。如果只有一个函数,亚马逊云科技 SAM 会继续调用它。如果有多个(例如此处的情况),亚马逊云科技 SAM 会询问您是哪一个,并提供选项列表。

Example error text

错误文本示例

身份验证函数

授权器函数需要一些输入数据作为模拟事件。要为 api_gateway_v1 项目生成模拟事件,请执行以下操作:

sam local generate-event apigateway authorizer

对于 api_gateway_v2 项目,请使用:

sam local generate-event apigateway request-authorizer

由此产生的事件是不同的,因为 API Gateway REST 和 HTTP API 可以以不同的方式处理自定义授权器。在这些示例中,REST 使用标准 令牌授权者 并返回相应的 亚马逊云科技 身份和访问管理 (IAM) 角色 。HTTP API 示例使用 简单的 “通过” 或 “失败 ” 选项。

每个示例都已经在 events /auth.json 中包含了格式正确的测试事件 。要调用 Auth 函数,请运行以下命令:

sam local invoke --hook-name terraform 'module.lambda_function_auth.aws_lambda_function.this[0]' -e events/auth.json

由于应用程序没有更改,因此无需再次运行 sam build 命令。

本地启动 api

现在,您可以使用正式发布的版本来模拟 API Gateway 的本地版本。每个示例都有两个端点。一个端点处于打开状态,自定义授权器保护另一个端点。两者都返回相同的响应:

{
  “message”: “Hello TF World”,
  “location”: “ip address”
}

要启动本地模拟器,请运行以下命令:

sam local start-api –hook-name terraform

亚马逊云科技 SAM 启动模拟器并公开两个终端节点以进行本地测试。

打开端点

使用 curl 测试开放端点:

curl --location http://localhost:3000/open

本地仿真器处理请求并在终端窗口中提供响应。模拟器还包括来自 Lambda 函数的日志。

Open endpoint example output

打开端点示例输出

身份验证端点

测试安全端点并传递额外的必需标 头 my header:

curl -v --location http://localhost:3000/secure --header 'myheader: 123456789'

端点返回带有 “Hello TF World” 消息的授权响应。使用无效的标头值再次尝试端点:

curl --location http://localhost:3000/secure --header 'myheader: IamInvalid'

端点返回未经身份验证的响应。

Unauthenticated response

未经身份验证的响应

参数

将 亚马逊云科技 SAM 与 Terraform 一起使用时,有几种选择:

  • 挂钩名称 :在使用 Terraform 时,每个命令都必须使用挂钩名称。这会告知 亚马逊云科技 SAM 该项目是一个 Terraform 应用程序。
  • skip-prepare-infra: 亚马逊云科技 SAM 使用 terraform plan 命令识别和处理所有必需的工件。但是,它只能在添加或修改新资源时运行。此选项可防止 亚马逊云科技 SAM 运行 terraform 计划命令。如果此标志已通过但计划不存在,则 亚马逊云科技 SAM 会忽略该标志并运行 terraform plan 命令。
  • Prepare-infra: 强制 亚马逊云科技 SAM 运行 terraf orm plan 命令。
  • Terraform-project-root-Path:将当前目录 替换为项目的根目录。 你可以使用绝对路径( /path/to/project/root )或相对路径( ../或.../... / )。
  • Terraform-Plan-File: 允许开发人员指定特定的 Terraform 计划文件 。此命令还允许 Terraform 用户使用本地命令。

组合这些选项可以创建较长的命令:

sam build --hook-name terraform --terraform-project-root-path ../

要么

sam local invoke –hook-name terraform –skip-prepare-infra 'module.lambda_function_responder.aws_lambda_function.this[0]'

您可以使用 samconfig 文件 来设置默认值、缩短命令和 优化开发过程 。使用新的 samconfig YAML 支持,文件如下所示:

version: 0.1
default:
  global:
    parameters:
      hook_name: terraform
      skip_prepare_infra: true
  build:
    parameters:
      terraform_project_root_path: ../

通过设置这些默认值,该命令现在缩短了:

sam local invoke 'module.lambda_function_responder.aws_lambda_function.this[0]'

亚马逊云科技 SAM 现在知道这是一个 Terraform 项目,除非缺少 Terraform 计划,否则会跳过准备任务。如果需要更新计划,请添加 —prepare-infra 标志以覆盖默认设置。

部署和远程调试

这些项目中的应用程序是常规的 Terraform 应用程序。将它们像任何其他 Terraform 项目一样部署。

terraform plan
terraform apply

目前,亚马逊云科技 SAM 加速器不支持 Terraform 项目。但是,由于 Terraform 使用 API 方法进行部署,因此无服务器应用程序可以快速部署。使用第三方手表和 terraform apply —auto-approve 命令来近似这种体验。

要进行日志记录,请使用 sam logs 命令。有关跟踪一项或所有资源日志的示例,请参阅项目的部署输出。

HashiCorp 云平台

HashiCorp 云平台 允许开发人员使用集中位置运行部署,以维护安全和状态。当开发人员在云中运行版本时,亚马逊云科技 SAM 无法在本地测试和调试中使用本地计划文件。但是,开发人员可以在云端生成计划并在本地使用该计划进行开发。有关说明,请参阅 文档

结论

HashiCorp Terraform 是一个流行的 iaC 框架,用于在 亚马逊云科技 云中构建应用程序。亚马逊云科技 SAM 是一个 IaC 框架,CLI 专为帮助开发人员构建无服务器应用程序而设计。

这篇博客介绍了对 Terraform 的新 亚马逊云科技 SAM 支持,以及开发人员如何将它们结合起来以最大限度地提高开发体验。该博客介绍了在本地调用单个函数、在本地模拟 API Gateway 端点以及在部署之前在本地测试 Lambda 授权器。最后,该博客部署了应用程序并使用 亚马逊云科技 SAM 来监控已部署的资源。

如需更多无服务器学习资源,请访问 无服务器世界


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。