如何通过 terraform 创建 lambda 事件模板?

Zha*_* Yi 8 aws-lambda terraform

当我触发 lambda 函数时,我可以从事件模板中选择一个事件。如何在 terraform 中创建自定义事件模板。我想让开发人员通过从列表中选择这个自定义事件模板来更容易地触发 lambda。

我想在此列表中添加一个事件:

在此处输入图片说明

Muk*_*lan 6

我确实尝试过一些东西并且成功了。我必须警告,这是逆向工程,将来可能随时崩溃,但到目前为止对我来说效果很好。

根据用于测试 lambda 函数的 Amazon 文档,每当为任何 lambda 创建 a 时Shareable Test Event,它都会存储在架构注册表下的新架构下lambda-testevent-schemas

我利用了这些信息并找出了 AWS 遵循的约定来跟踪事件,以便我可以使用这些约定来使用 terraform 管理资源

  1. 模式的名称是_<name_of_lambda_function>-schema,因此,从 terraform 我管理一个名为的新模式_<name_of_lambda_function>-schema
resource "aws_schemas_schema" "my_lambda_shared_events" {
  name          = "_${aws_lambda_function.my_lambda.function_name}-schema"
  registry_name = "lambda-testevent-schemas"
  type          = "OpenApi3"
  description   = "The schema definition for shared test events"
  content       = local.my_lambda_shared_events_schema
}
Run Code Online (Sandbox Code Playgroud)
  1. 我创建了一个遵循约定的 json 文档 (my_lambda_shared_events_schema) OpenAPI3。例如=>
resource "aws_schemas_schema" "my_lambda_shared_events" {
  name          = "_${aws_lambda_function.my_lambda.function_name}-schema"
  registry_name = "lambda-testevent-schemas"
  type          = "OpenApi3"
  description   = "The schema definition for shared test events"
  content       = local.my_lambda_shared_events_schema
}
Run Code Online (Sandbox Code Playgroud)

terraform 应用后,您应该能够在 AWS 控制台中看到 terraform 托管的可共享事件。

使用此方法时的一些重要问题:

  1. 如果您使用此方法使用 terraform 添加事件,则从控制台添加的任何事件都将丢失。
  2. 模式注册表lambda-testevent-schemas是一个特殊的注册表,不能使用 terraform 进行管理,因为它可能会破坏在此 terraform 模块范围之外创建的其他 lambda 函数事件。
  3. 需要lambda-testevent-schemas事先可用。您可以在应用模块之前进行检查以创建此注册表,或者为任何随机 lambda 函数创建任何随机可共享事件。这需要为每个账户的每个区域执行一次。
  4. 如果您在为 lambda 创建 json 架构时遇到困难,您可以从控制台创建一次事件,然后从EventBridge架构注册表复制 json。


mjg*_*py3 5

不幸的是,在此回答 (2020-02-21) 时,无法通过 AWS 提供的 API 实现此目的。因此,terraform 提供程序无法完成此操作(仅限于 API 中可用的内容)。

希望能够通过 terraform 配置测试事件。

几个选项

  • 建议 AWS 公开一些用于管理测试事件的 API。这将使 AWS terraform 提供商的贡献者有机会添加此资源。
  • 以提供开发商邮递员收集,设置shell脚本(或其他脚本)的使用awscli,或一些其他的机制来调用的lambda表达式。这本质上与将模板功能从控制台中提取到您自己的工具中是一样的。