List 在Terraform的文件()中使用函数var{count.index}创建AWS IAM策略 我正在创建一个IAM策略列表,它以.json格式存储 我只有一个资源块,通过使用count=length(count)我想创建一个多IAM策略 策略以.json格式存储。我使用file()在Terraform中引用它们

List 在Terraform的文件()中使用函数var{count.index}创建AWS IAM策略 我正在创建一个IAM策略列表,它以.json格式存储 我只有一个资源块,通过使用count=length(count)我想创建一个多IAM策略 策略以.json格式存储。我使用file()在Terraform中引用它们,list,file,variables,terraform,List,File,Variables,Terraform,如果我创建了一个多资源块,程序就可以运行了 main.tf: resource "aws_iam_role_policy" "cloudcheckr" { count = "${length(var.file_name)}" role = "${aws_iam_role.cloudcheckr.id}" // An IAM role is created in another resource block name = "${var.file_name

如果我创建了一个多资源块,程序就可以运行了

main.tf:

resource "aws_iam_role_policy" "cloudcheckr" {
  count     = "${length(var.file_name)}"
  role      = "${aws_iam_role.cloudcheckr.id}"   // An IAM role is created in another resource block
  name      = "${var.file_name[count.index]}"
  policy    = "${file("${var.file_name[count.index]}.json")}"

变量.tf:

variable "file_name" {
  type = "list"
  default = [
    "xxxxxx",
    "xxxxxx",
    "xxxxxx",
    "xxxxxx",
  ]
}
预期成果:

创建了多个IAM策略

实际结果:

aws\u iam\u role\u policy.cloudcheckr:发生3个错误:
*aws_iam_role_policy.cloudcheckr[3]:文件:打开iam_policy_cloudcheckr_security.json:在以下位置中没有此类文件或目录:
${file(${var.file_name[count.index]}.json”)}
*aws_iam_role_policy.cloudcheckr[0]:文件:打开iam_policy_cloudcheckr_cloudwatchflowlogs.json:在以下位置中没有此类文件或目录:
${file(${var.file_name[count.index]}.json”)}
*aws_iam_role_policy.cloudcheckr[2]:文件:打开iam_policy_cloudcheckr_inventory.json:中没有此类文件或目录:
${file(${var.file_name[count.index]}.json”)}

第一次查看时没有问题。但是仍然有几种方法可以解决文件路径问题

在模块内部使用
file()
时非常有用,您通常希望创建相对于模块基的路径,如下所示:
file(${path.module}/file”)

因此,您的代码可以更改为

resource "aws_iam_role_policy" "cloudcheckr" {
  count     = "${length(var.file_name)}"
  role      = "${aws_iam_role.cloudcheckr.id}"   // An IAM role is created in another resource block
  name      = "${var.file_name[count.index]}"
  policy    = "${file("${path.module}/${var.file_name[count.index]}.json")}"
}
如果这不起作用,请尝试使用
format()

考虑使用“Path”:一个摘要:语法是Path.TYPE。类型可以是cwd、模块或根。cwd将插入当前工作目录。模块将插入到当前模块的路径。root将插入根模块的路径。
  policy    = "${file(format("%s/%s.json", "${path.module}, ${var.file_name[count.index]}"))}"