如何在 terraform 中传递 template_file var 部分中的列表而不是字符串

Dan*_*nny 5 amazon-web-services terraform terraform-provider-aws

我遇到的情况是,我有多个 SQS 队列,并且希望将这些 SQS 队列包含在 IAM 策略资源部分中。有没有合适的方法来做到这一点?我尝试将 sqs 队列 arn 列表传递到 var 部分,尽管看起来 terraform 需要此部分中的字符串

resource "aws_sqs_queue" "sqs_queue" {
   count                      = length(var.sqs_queue)
   name                       = element(var.sqs_queue, count.index)
   delay_seconds              = 0
   max_message_size           = var.sqs_max_message_size
   message_retention_seconds  = var.sqs_message_retention_seconds
   receive_wait_time_seconds  = 0
}

data "template_file" "lambda_policy" {
   template = file(var.lambda_policy)

   vars = {
     sqs_queues = aws_sqs_queue.sqs_queue[0].arn # want to change this to list of arn's
   }
}
Run Code Online (Sandbox Code Playgroud)

这个想法是通过 vars 部分传递 SQS arn 列表,以便它将在资源部分的 lambda_policy 文件中被替换

lambda_policy 文件 =>

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sqs:ReceiveMessage",
                "sqs:DeleteMessage"
            ],
            "Resource": "${sqs_queues}"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

不确定我是否以错误的方式做,或者是否有更好的方法来做到这一点。想法是堆叠所有创建的 sqs 队列 arns 以传递到策略模板文件,以便可以使用这些列表(在资源部分中)编译策略;并且该策略将在创建时传递给 lambda。

Mar*_*cin 8

最好使用templatefile。所以你可以:

locals {

  policy=templatefile(
               "${path.module}/lambda_policy.tmpl",
               {
                 sqs_queues = aws_sqs_queue.sqs_queue[*].arn
               }
              )

}
Run Code Online (Sandbox Code Playgroud)

哪里lambda_policy.tmpl

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sqs:ReceiveMessage",
                "sqs:DeleteMessage"
            ],
            "Resource": ${jsonencode(sqs_queues)}
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)