Terraform引用已有IAM实例配置文件报错,求排查原因
问题分析:Terraform获取IAM实例配置文件报错原因
问题背景
使用Terraform为新EC2实例配置已有IAM实例配置文件,由于资源声明与数据获取不在同一代码仓库,尝试通过标签过滤的方式用data块获取配置文件信息:
- core仓库的IAM实例配置文件资源声明:
resource "aws_iam_instance_profile" "bastion" { name = "instanceprofile-bastion-vpc-global-${var.app}-${var.env}" role = "${aws_iam_role.bastion.name}" tags = { Name = "instanceprofile-bastion-vpc-global-${var.app}-${var.env}" } }
(注:var.app值为core)
- isc仓库中编写的data块:
data "aws_iam_instance_profile" "bastion" { filter { name = "tag:name" values = ["instanceprofile-bastion-vpc-global-core-${var.env}"] } }
执行terraform validate或terraform plan时触发以下错误:
│ Error: Missing required argument │ │ on variables.dev.tf line 84, in data "aws_iam_instance_profile" "bastion": │ 84: data "aws_iam_instance_profile" "bastion" { │ │ The argument "name" is required, but no definition was found. ╵ ╷ │ Error: Unsupported block type │ │ on variables.dev.tf line 85, in data "aws_iam_instance_profile" "bastion": │ 85: filter { │ │ Blocks of type "filter" are not expected here.
错误原因验证
针对你提出的三个推测,验证结果如下:
- 推测1(标签变更未部署)不成立:当前报错属于Terraform配置语法错误,并非资源不存在的查询错误。如果是标签未部署,报错会提示找不到匹配的实例配置文件,而非参数缺失或不支持
filter块。 - 推测2(data块不支持过滤方式)是实际原因:
aws_iam_instance_profile数据源不支持filter块配置,且必须指定name作为必填参数。部分Terraform AWS数据源(如aws_instance)支持filter,但该数据源仅提供name作为唯一的查询参数。 - 推测3(无法重复分配实例配置文件)不成立:IAM实例配置文件可以同时关联多个EC2实例,没有使用限制。
正确配置方式
你尝试的官方文档语法是正确的,可正常获取目标资源:
data "aws_iam_instance_profile" "bastion" { name = "instanceprofile-bastion-vpc-global-core-${var.env}" }
可通过以下方式验证数据是否正确:
- 执行
terraform plan,查看输出中该数据源的详细信息 - 进入
terraform console,输入data.aws_iam_instance_profile.bastion查看返回的资源属性
内容的提问来源于stack exchange,提问作者prout
相关产品推荐
相关产品推荐

