如何通过Terraform导入基于map变量(使用for_each)的现有AWS S3桶资源
如何导入基于Map变量用for_each创建的现有S3桶到Terraform
我明白你在导入现有S3桶时遇到的困扰——当Terraform资源用for_each基于map定义时,导入命令的格式和普通资源或者用count创建的资源完全不一样,很容易踩坑。
正确的导入命令
针对你的配置,直接用下面的命令就能成功导入:
terraform import 'aws_s3_bucket.bucket["logs"]' logs_bucket terraform import 'aws_s3_bucket.bucket["security"]' cloudtrail_bucket
为什么这个命令能行?
- 用单引号包裹资源地址是关键:在bash/zsh这类shell里,方括号和双引号会被当作特殊字符处理,单引号能让shell原封不动把地址传给Terraform。
- 资源地址的格式是
资源类型.资源名称["map键"]:这里的"logs"和"security"就是你var.s3_replication里的map键,Terraform用这些键来区分不同的资源实例。 - 命令末尾的
logs_bucket和cloudtrail_bucket是实际存在的S3桶名称,对应你配置里each.value.source的值。
你之前的命令为什么失败?
你尝试的几种写法都踩了典型的坑:
aws_s3_bucket.bucket[logs]:没给map键加引号,shell会把logs当成环境变量解析,导致Terraform收到的地址无效。aws_s3_bucket.bucket[0]:这是给用count创建的资源用的格式,for_each基于map时不适用这种索引方式。aws_s3_bucket.bucket[0].source这类写法:完全不符合Terraform资源地址的规范,导入只需要指定到资源实例级别,不需要引用内部属性。
导入后验证
导入完成后,运行terraform plan检查一下:如果一切正常,Terraform会提示现有资源和配置匹配,不会出现要创建新桶的计划,只会显示你后续可能需要更新的配置差异。
内容的提问来源于stack exchange,提问作者J. Patwary
相关产品推荐
相关产品推荐

