如何在Terraform数据资源aws_iam_policy_document中传递S3 ARN列表

时间:2020-07-06 16:26:04

标签: terraform

我正在尝试将多个值传递给数据资源“ aws_iam_policy_document”中的主要标识符。出现以下错误

属性“标识符”的值不合适:元素0:需要字符串。

s3_values变量定义为type = any并将值设置为 ....

s3_values:

  bucket: bucketname1
  s3_arns:
    - arn:aws:iam::1234567890:root
    - arn:aws:iam::2345678901:role/s3-read-role

数据“ aws_iam_policy_document”“ s3_policy” {

count = length(var.s3_arns)

     statement {
      sid    = "1"
      effect = "Allow"
      principals  {
        type        = "AWS"
        identifiers = ["${var.s3_values[count.index]["s3_arns"]}"]
                  }  
      actions   = ["s3:PutObject"]
      resources = ["arn:aws:s3:::${var.s3_values[count.index]["bucket"]}/*"]
     }
 
}

我收到以下错误

属性“标识符”的值不合适:元素0:需要字符串。

当仅传递一个值时,它起作用,但是当我们将多个值传递给变量s3_arns时,它不起作用。

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试为单个S3存储桶创建多个策略文档。最好使用创建可以访问所传递的每个ARN的单个策略文档,而不是使用count创建多个文档。

当前它适用于一个ARN,因为identifiers字段传递了一个字符串,并创建了一个包含一个字符串元素的列表。当您传递ARN列表时,identifiers字段将创建一个列表,该列表的列表元素包含ARN字符串。

我将通过使s3_arns字段始终为字符串列表,并删除数据资源上的count字段来解决此问题。完成后,您可以将行标识符更改为identifiers = var.s3_values.s3_arns,将资源行更改为resources = ["arn:aws:s3:::${var.s3_values.bucket}/*"]