参考无服务器框架中的现有 Cloudformation 堆栈输出
Posted
技术标签:
【中文标题】参考无服务器框架中的现有 Cloudformation 堆栈输出【英文标题】:Reference Existing Cloudformation Stack Outputs in Serverless Framework 【发布时间】:2017-04-20 08:47:30 【问题描述】:我们正在评估是否将 Serverless 用于我们的一些新 AWS 应用程序基础设施。我们大量使用 Cloudformation(由 Ansible 部署),因此我们需要能够干净地引用现有 Cloudformation 堆栈的输出——一个直接的例子是获取我们现有 AWS 网络基础设施的子网 ID 以供 lambda 函数使用.
经过大量浏览,我还没有看到一种开箱即用的方法来做到这一点。我们现有的 Cloudformation 堆栈的命名方式是,如果我只需键入堆栈的名称和所需的输出变量,就可以在各种环境中可靠地获得所需的输出。我看到的一种可能的解决方案是使用 aws cli 提取变量并将它们作为环境变量传递给无服务器,但如果可能的话,我想要一种更简洁的方法。
【问题讨论】:
请说明您的问题是关于 AWS Serverless Application Model (SAM) 还是 Serverless Framework。 【参考方案1】:如果 Serverless Framework 允许您在 CloudFormation 模板中使用 Intrinsic Functions,您可以在 CloudFormation 模板中通过 exporting stack output values 从一个堆栈中使用 create cross-stack references(使用 Outputs
部分中的 Exports
属性) ,并使用另一个堆栈中的Fn::ImportValue
内部函数来引用导出的值。
【讨论】:
这绝对是最好的答案。我们避免了跨堆栈引用 1) b/c 它们直到最近才存在,2) 我喜欢通过显式将一个堆栈的输出作为参数传递给另一个堆栈所产生的更松散的耦合。我认为我们已经决定 'sls' 有点受限于我们的需求,但如果我们要使用它,这肯定是要走的路。【参考方案2】:我认为处理您的示例案例的最简单方法是让 lambda 使用 boto3
调用 boto3.client('cloudformation', region_name=*specified region*).describe_stacks(StackName=*specified stack*)['Stacks']
。此列表包含与指定的StackName
匹配的所有堆栈,如果您的所有网络基础设施共享其名称的子集,您可以通过将StackName
指定给该子字符串来列出所有堆栈。每个 Stack 对象都包含一个 'Outputs'
块。见here。
如果您想公开它以便在任何地方轻松使用,您可以将 API Gateway GET 方法附加到 lambda 并将其公开给 html 表单。
【讨论】:
感谢您的回复。我在这种方法中看到的问题是,理想情况下,我什至会在部署 Lambda 函数之前获得变量的值之前。由于我正在部署的功能需要连接到 RDS 实例,因此它们需要子网 ID 才能创建弹性网络接口并访问我们的网络。 @rumdrums 在连接到 RDS 之前有什么原因不能搜索值吗? 我的理解是,当我创建 lambda 函数时,我需要为它提供它将连接到的子网 ID,如 here 中描述的 VpcConfig 参数。我认为 lambda 函数在部署后无法获取子网 ID。 @rumdrums 一个 lambda 函数在由外部操作(API Gateway、DynamoDB、SNS 主题)触发时被部署。如果您不将它们存储在数据库中,您肯定可以让其部分功能查找所需的子网 ID。 lambda 的目的是不必为独立实例付费来监听/运行基于操作的代码,并且只在代码正在使用/运行时付费。 @rumdrums 我个人在 lambda 和我的 AWS 基础设施的其他部分之间使用的区别是 lambda 是专门为由操作触发的代码保留的。如果我需要根据计划运行某些东西,我会使用 ECS 并将代码放入 docker 容器中。此外,如果一个任务需要等待某个执行完成,可能会或可能不会超过 5 分钟,它会进入一个容器(lambda 函数运行时有 300 秒的硬性限制)。以上是关于参考无服务器框架中的现有 Cloudformation 堆栈输出的主要内容,如果未能解决你的问题,请参考以下文章
将现有 Cognito UserPool 导入到无服务器框架堆栈