CloudFormation中是否可引用现有资源 类似Terraform的datasource功能?
CloudFormation支持多种方式获取已有资源的属性值,等效于Terraform的datasource能力,针对你需要查询跨账号统一安全组ID的场景,常用实现方案如下:
SSM Parameter Store取值方案(最适配你的跨账号场景)
你可以提前在每个目标账号的AWS Systems Manager Parameter Store中,将对应安全组的ID存入相同路径的字符串参数(比如路径统一为/shared/security-groups/common-sg),在CloudFormation模板中直接通过SSM参数类型取值即可,无需额外开发:# 模板参数部分定义 Parameters: CommonSecurityGroupId: Type: AWS::SSM::Parameter::Value<String> Default: /shared/security-groups/common-sg # 后续资源中引用时直接用 !Ref CommonSecurityGroupId 即可这个方案维护成本极低,只要保证跨账号的参数路径统一,模板不需要做账号适配即可通用。
跨栈导出导入方案
如果你的安全组本身是通过CloudFormation栈部署的,可以在安全组所属的栈输出(Outputs)中导出SG ID,其他栈直接用Fn::ImportValue(即!ImportValue)函数引用导出值即可,适合同账号或同组织内栈资源共享场景。自定义资源动态检索方案(完全等效Terraform datasource能力)
如果你需要通过标签、资源名称等条件动态检索资源属性,可以通过CloudFormation自定义资源实现:编写一个Lambda函数,调用AWS EC2的describe_security_groups接口按你指定的过滤条件(名称、标签、所属VPC等)查询匹配的安全组ID,将结果返回给CloudFormation栈。跨账号场景下只要给Lambda配置对应账号的IAM访问权限即可实现跨账号检索,灵活性最高。
注意:CloudFormation原生的「现有资源导入」功能是将已存在的资源纳入当前栈的生命周期管理,不适用于仅需要获取资源ID引用的场景,不要和上述查询能力混淆。
内容的提问来源于stack exchange,提问作者jlo-gmail

