Amazon web services Terraform-策略中的每个语句都应该只有一个资源

Amazon web services Terraform-策略中的每个语句都应该只有一个资源,amazon-web-services,terraform,Amazon Web Services,Terraform,我有一个aws\u iam\u policy\u文档,我正试图将它附加到多个队列。策略文档如下所示: data "aws_iam_policy_document" "my_policy" { statement { principals { type = "*" identifiers = ["*"] } actions = [ "sqs:SendMessage" ] resources = [

我有一个
aws\u iam\u policy\u文档
,我正试图将它附加到多个队列。策略文档如下所示:

data "aws_iam_policy_document" "my_policy" {
  statement {
    principals {
      type        = "*"
      identifiers = ["*"]
    }

    actions = [
      "sqs:SendMessage"
    ]

    resources = [
      "${aws_sqs_queue.q1.arn}",
      "${aws_sqs_queue.q2.arn}",
      "...",
      "${aws_sqs_queue.q8.arn}"
    ]

    condition {
      test = "ArnEquals"
      variable = "aws:SourceArn"
      values = [
        "${aws_sns_topic.sns_topic_name.arn}"
      ]
    }
  }
}
当我运行terraform plan时,它不会显示任何错误。但是,运行terraform apply I get:
策略无效。原因:策略中的每个语句应该正好有一个资源
。是否有一种方法可以为资源名输入一个变量,当连接到所述队列时,该变量将被队列名替换

这是我的队列和队列策略的外观:

resource "aws_sqs_queue" "queue_name" {
    name                       = "queue_name_${var.environment}"
    visibility_timeout_seconds = 30
    message_retention_seconds  = 345600
    max_message_size           = 262144
    delay_seconds              = 0
    receive_wait_time_seconds  = 0
}


resource "aws_sqs_queue_policy" "queue_name_policy" {
  queue_url = "${aws_sqs_queue.queue_name.id}"
  policy    = "${data.aws_iam_policy_document.my_policy.json}"
}
是否有一种方法可以为资源名输入一个变量,当连接到所述队列时,该变量将被队列名替换

Terraform有一个使用的循环迭代机制

我没有使用过这么多,目前我无法实际测试下面的代码,因此有一个小小的免责声明,我可能是错的,我认为这应该是可行的:

variable "number_of_queues" {
  default = 3
}

resource "aws_sqs_queue" "queue_name" {
  count = "${var.number_of_queues}"
  name  = "queue_name_${count.index}"
  // Other properties omitted
}

data "aws_iam_policy_document" "my_policy" {
  count = "${var.number_of_queues}"
  statement {
    resources = [
      "${aws_sqs_queue.queue_name[count.index].arn}",
    ]

    // Other properties omitted
  }
}

resource "aws_sqs_queue_policy" "queue_name_policy" {
  count = "${var.number_of_queues}"
  queue_url = "${aws_sqs_queue.queue_name[count.index].id}"
  policy    = "${data.aws_iam_policy_document.my_policy[count.index].json}"
}

您可能必须使用而不是方括号–不确定。

将主体
类型
更改为
AWS
查找
用于
地图
,括号语法正确。有用:
${aws_sqs_queue.queue_name}
是一个资源列表,您可以通过索引
aws_sqs_queue.queue_name[0]获取单个资源的
arn
.arn
您可以使用splat获取所有资源的
arn
列表:
aws\u sqs\u queue.queue\u name.*.arn
还可以通过索引
aws\u sqs\u queue.queue\u name.*.arn[0]
资源
块可以直接引用arn列表时,是否需要
aws_iam_策略文件上的
计数
,例如,`resources=[“${aws_sqs_queue.queue_name.*.arn},]”以及队列策略?