从 VPC 内的另一个 cloudformation 模板引用 SecurityGroup

Posted

技术标签:

【中文标题】从 VPC 内的另一个 cloudformation 模板引用 SecurityGroup【英文标题】:Reference SecurityGroup from another cloudformation template inside VPC 【发布时间】:2014-08-08 03:29:00 【问题描述】:

我有一个 VPC(通过 cloudformation 创建),它为在该 VPC 中创建的所有堆栈创建一些通用共享基础架构,例如ssh jumphost 和 ssh jumphost 的安全组。

我有一个单独的 cloudformation 模板,用于在现有 VPC 中创建 Web+App+DB 堆栈。

如何从第一个模板中定义的通用 ssh jumphost 允许入站 ssh 22 到我的堆栈模板中的实例?

根据文档,在 VPC 中我需要指定 SourceSecurityGroupId,它必须具有实际的 VPC ID 或使用 Ref 函数来查找在 this 中定义的安全组的 ID strong> 模板。

如何在同一个 VPC 中但从另一个模板引用现有 SG?

编辑:

通过 NAT 实例出站的问题相同。 NAT 实例在 VPC 级别提供,但每个堆栈都需要其安全组来允许对 NAT 实例进行出站访问。

【问题讨论】:

【参考方案1】:

更新:自从我最初的回答以来,这已经改变了。另请参阅 Vor 下面的答案,该答案建议使用 custom resources and Lambda 来允许跨堆栈引用。

原答案

不支持从另一个堆栈引用资源,因此您不能使用Ref()。您可以使用SourceSecurityGroupId(如您所建议的那样)并将其作为parameter 传递,和/或您可以使用SourceSecurityGroupName。但 Cloudformation 无法以编程方式引用其他堆栈。

我喜欢使用 Python、boto 和 troposphere library 编写 Cloudformation 模板来解决代码中的此类问题。

【讨论】:

所以你说我可以做以下之一:明确输入ID作为参数;对模板中的 ID 进行硬编码;或使用SourceSecurityGroupName。我什至可以使用SourceSecurityGroupName 吗?文档说,“对于 VPC 中的实例,请指定 SourceSecurityGroupId 属性。” 在python中这样做是如何解决的?您仍然需要生成模板。还是使用 boto 来检索所需的 GroupId,然后将其输入到模板中? 我的错误,您是正确的,您不能在 VPC 中使用 SourceSecurityGroupName。是的,我使用 boto 来查找组 ID。所以就像我说的,不支持跨 VPC 引用。 因此,如果我想要它作为普通的 cloudformation 模板,最好的办法是硬编码模板中的 ID (feh) 或将其作为参数要求? 是的,没错。除非您以编程方式进行,否则这些都是您的选择。【参考方案2】:

上一个答案的替代方法是创建一个CustomResource。您可以在订阅 SQS 队列的 EC2 上运行服务。一旦 CFN 到达CustomResource,它将向您提供的主题发送 SNS 通知。然后您的服务将收到通知、处理请求并做出响应。

还有一个库可以帮助您设置custom service https://github.com/aws/aws-cfn-resource-bridge

【讨论】:

这很酷。所以你正在使用发布/订阅队列以编程方式传递参数? 没错。您还可以设置 AWS Lambda 函数来处理来自 CFN 的请求,避免管理自己的进程/队列 这比在本地用 Python 或其他编程语言做的要好,但我不想在一年后切换选定的答案。我会投票。 您可以使用 Lambda 来执行此操作吗?蛮狂野的。某处有例子吗?您是否有要点或 AWS 是否有两个 CFN 模板通过 Lambda 进行通信的示例? docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…

以上是关于从 VPC 内的另一个 cloudformation 模板引用 SecurityGroup的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS CloudFormation 创建 Amazon VPC?

无法从 VPC 内的 *** 浏览亚马逊零售网站

VPC 内的 Terraform Spot 实例

从 VPC 内将“禁止”异常发布到 API Gateway Websocket API

将元素从一个对象添加/合并到数组内的另一个对象

如何从组件文件夹内的另一个文件夹中调用一个类?