Amazon web services 引用为每个循环使用创建的每个资源
我创建了许多s3存储桶,每个存储桶都使用for_,而创建资源时没有任何问题。我以后在引用这些资源时遇到困难。我希望能够参考所有的资源。像这样:Amazon web services 引用为每个循环使用创建的每个资源,amazon-web-services,terraform,Amazon Web Services,Terraform,我创建了许多s3存储桶,每个存储桶都使用for_,而创建资源时没有任何问题。我以后在引用这些资源时遇到困难。我希望能够参考所有的资源。像这样: resource "aws_s3_bucket" "dm_client" { for_each = toset(var.dm_client_bucket) bucket = format("dm-%s-%s",var.env,each.value) acl = "private" versioning {
resource "aws_s3_bucket" "dm_client" {
for_each = toset(var.dm_client_bucket)
bucket = format("dm-%s-%s",var.env,each.value)
acl = "private"
versioning {
enabled = true
}
...
data "aws_iam_policy_document" "dm_permission_client" {
statement {
sid = "ClientAccess"
actions = [
"s3:List*",
"s3:Get*"
]
resources = [
aws_s3_bucket.dm_internal["*"].arn,
"${aws_s3_bucket.dm_internal["*"].arn}/*",
aws_s3_bucket.dm_client["*"].arn,
"${aws_s3_bucket.dm_client["*"].arn}/*"
]
}
}```
I've tried using *, "*", etc.. To no avail..
当您对每个_使用
时
资源值将成为从键到表示资源实例的对象的映射。[*]
运算符用于列表,因此在这种情况下不起作用
相反,您可以编写一个:
在您描述的情况下,您需要一个列表,但类似的语法也可以从键到ARN字符串派生映射:
{ for k, b in aws_s3_bucket.dm_internal : k => b.arn }
当应用于列表或集合时,[*]
运算符()是表达式的缩写
aws\u iam\u policy\u文档中的resources
参数需要一个字符串列表,但是如果您直接在那里为表达式使用,则会得到一个字符串列表。要获取参数所需的字符串的平面列表,请使用:
当您对每个_使用时
资源值将成为从键到表示资源实例的对象的映射。[*]
运算符用于列表,因此在这种情况下不起作用
相反,您可以编写一个:
在您描述的情况下,您需要一个列表,但类似的语法也可以从键到ARN字符串派生映射:
{ for k, b in aws_s3_bucket.dm_internal : k => b.arn }
当应用于列表或集合时,[*]
运算符()是表达式的缩写
aws\u iam\u policy\u文档中的resources
参数需要一个字符串列表,但是如果您直接在那里为表达式使用,则会得到一个字符串列表。要获取参数所需的字符串的平面列表,请使用:
谢谢你的回复!不幸的是,当我用你的例子。它返回创建IAM策略dm dev服务策略时出错:格式错误的策略文档:资源dm dev作业必须采用ARN格式或“*”。听起来至少有一个S3存储桶ARN的格式与此配置预期的格式不符。如果您运行TerraformPlan
,并查找针对该资源的bucket策略建议的JSON对象,您应该能够在那里看到生成的ARN,并确保所有ARN都具有有效语法。我对S3 ARN结构不太熟悉,但我的初步猜测是,ARN
属性可能已经有一个路径部分,因此将/*
附加到末尾可能会产生无效结果。感谢您的回复。实际上,我意识到使用您的示例将引用不是策略正在创建的s3 bucket的bucket,从而导致无效资源。感谢您的回复!不幸的是,当我用你的例子。它返回创建IAM策略dm dev服务策略时出错:格式错误的策略文档:资源dm dev作业必须采用ARN格式或“*”。听起来至少有一个S3存储桶ARN的格式与此配置预期的格式不符。如果您运行TerraformPlan
,并查找针对该资源的bucket策略建议的JSON对象,您应该能够在那里看到生成的ARN,并确保所有ARN都具有有效语法。我对S3 ARN结构不太熟悉,但我的初步猜测是,ARN
属性可能已经有一个路径部分,因此将/*
附加到末尾可能会产生无效结果。感谢您的回复。我实际上意识到,使用您的示例将引用不是策略正在创建的s3桶的桶,从而导致无效资源。
resources = concat(
[for b in aws_s3_bucket.dm_internal : b.arn],
[for b in aws_s3_bucket.dm_internal : "${b.arn}/*"],
[for b in aws_s3_bucket.dm_client : b.arn],
[for b in aws_s3_bucket.dm_client : "${b.arn}/*"],
)