如何用Terraform创建包含CloudFormation栈资源的AWS资源组?
解决Terraform创建关联CloudFormation栈的AWS资源组问题
你遇到的错误是因为Terraform的aws_resourcegroups_group资源目前仅支持TAG_FILTERS_1_0类型的资源查询,不直接支持CLOUDFORMATION_STACK_1_0类型。要实现将指定CloudFormation栈的资源纳入资源组,可通过以下两种方式解决:
方法一:通过标签过滤(推荐)
给CloudFormation栈中的所有资源统一添加标签(比如StackName=your-stack-name),然后在Terraform中用标签过滤规则创建资源组:
provider "aws" { # 按需配置区域等信息 } terraform { # 按需配置Terraform版本等 } resource "aws_resourcegroups_group" "test" { name = "test" description = "test" resource_query { type = "TAG_FILTERS_1_0" query = jsonencode({ ResourceTypeFilters = ["AWS::AllSupported"] TagFilters = [ { Key = "StackName" Values = ["your-stack-name"] } ] }) } }
补充:给CloudFormation栈资源自动打标签
如果你的CloudFormation栈还没给资源打标签,可以在栈模板中添加栈级别标签,让所有资源自动继承:
# CloudFormation模板示例 Tags: - Key: StackName Value: !Ref AWS::StackName Resources: YourEC2Instance: Type: AWS::EC2::Instance Properties: # 实例其他配置属性
方法二:导入手动创建的资源组
如果必须使用CLOUDFORMATION_STACK_1_0查询类型,可以先通过AWS CLI创建资源组,再将其导入Terraform管理:
- 使用AWS CLI创建资源组:
aws resource-groups create-group \ --name test \ --description "test" \ --resource-query '{"Type": "CLOUDFORMATION_STACK_1_0", "Query": "{\"ResourceTypeFilters\": [\"AWS::AllSupported\"], \"StackIdentifier\": \"arn:aws:cloudformation:XXXXXX:XXXXXX:stack/endofarn\"}"}'
- 将该资源组导入Terraform:
terraform import aws_resourcegroups_group.test test
- 导入后,Terraform会将该资源纳入状态管理,但注意Terraform仍不支持在配置文件中定义
CLOUDFORMATION_STACK_1_0类型的查询,后续修改建议切换到标签过滤方式,或通过AWS控制台/CLI操作。
内容的提问来源于stack exchange,提问作者plouer
相关产品推荐
相关产品推荐

