在 AWS CloudFromation 和 Serverless 中组织堆栈和共享资源

问题描述

我有一个关于使用 AWS Serverless 设计和组织 CloudFormation 资源的架构问题。

目前我有多个按域特定目的组织的堆栈,这很好用。大多数包含 Lambdas 的堆栈必须使用 Serverless(全部使用 SAM)进行转换。使用 EventBridgeS3+Events 的组合促进异步通信并且运行良好。我的问题是同步通信。

我不想使用从其他堆栈导出的名称从其他堆栈引用 Lambdas 并直接调用它们,因为这会导致更新和版本问题(如果在其他堆栈中引用了输出导出,我无法更改资源,除非先删除引用,这对于 CI/CD 来说并不理想并且将关注点分开)。

我一直在使用 API Gateway 作为抽象,但感觉相当笨拙。有这种分离是很好的,但必须有域和 DNS 解析 + 将 API GW 暴露在外部感觉不对。也许有更好的方法可以将 API GW 配置为仅限内部使用。如果您在这方面取得了成功,能否请您指点我的方向?

是否有更好的方法以同步方式从不同堆栈中抽象调用 Lambda 函数? (Common template patterns 用于 CF 或类似的东西?)

解决方法

我看到两个问题:

  1. 具有 API 网关的同步 Lambda 函数的替代方案。
  • Api Gateway 是一种简单的方法,通过 IAM 身份验证使其安全。与 REST API 相比,HTTP Api 是更简单且更便宜的选项。我们可以选择私有 Api 而不是区域/边缘,因为它不会暴露在 VPC 之外,以确保其移动安全。
  • 我们可以拥有一个以 Lambda 函数为目标的私有 ALB,用于不需要任何 API 网关功能的简单用例。(这将每月花费一些金额)
  • 我们始终可以通过 AWS SDK invoke 直接调用 lambda。
  1. 在模板之间共享资源的替代方法。
  • 如果我们需要删除和重新创建资源,导出和导入会有点问题,但如果我们只是更新它,应该不会有问题。
  • 我们始终可以将 Lambda 函数的 Arn 存储在源模板的 SSM 参数中,并从目标模板中的 SSM 参数解析 Arn 的值。这是完全解耦的。这比简单地对 Arn 的值进行硬编码要好。