list/tuple of string in terraform not working in the IAM pol



我在S3桶中定义了一个对象列表:

locals {
s3_bucket_object_list = [
"Completed/",
"Error/",
"Processing/",
"Temp/"
]
s3_bucket_object_list_arn = [ for object in local.s3_bucket_object_list: "arn:aws:s3:::${var.bucket_name}/${object}*" ]
}

这里我需要列表中的"arn:aws:s3:::"稍后在IAM策略资源规范中使用,所以我使用了for表达式。然后我在以下策略中使用了本地s3_bucket_object_list_arn:

resource "aws_iam_policy" "s3" {
name = "s3-policy"
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Effect": "Allow",
"Resource": "${local.s3_bucket_object_list_arn}"
}
]
}
EOF
}

我得到了以下错误:

本地。S3_bucket_object_list_arn是一个包含#元素的元组。不能string required.

据我所知,如果它是一个单一的资源,资源应该用双引号括起来,这样它是一个字符串,但对于多个资源,这里可以使用列表,每个元素都是字符串。所以我想知道为什么它在我的情况下不起作用。

您的local.s3_bucket_object_list_arn是一个列表。要在IAM策略中使用它,您需要将其转换为有效的json列表. 为此,可以使用jsonencode:

resource "aws_iam_policy" "s3" {
name = "s3-policy"
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Effect": "Allow",
"Resource": ${jsonencode(local.s3_bucket_object_list_arn)}
}
]
}
EOF
}

最新更新