Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 引用为每个循环使用创建的每个资源_Amazon Web Services_Terraform - Fatal编程技术网

Amazon web services 引用为每个循环使用创建的每个资源

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 {

我创建了许多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 {
        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}/*"],
  )