从 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?