You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform使用for_each创建SQS时如何访问特定实例属性

报错原因&修复方案

1. output.tf 缺少实例索引报错

你用for_each创建的aws_sqs_queue.CloudTrail_SQS是键值对格式的多实例集合,不能直接访问属性,需要指定实例索引,或者直接输出所有实例的属性集合。
修改后的output.tf示例:

# 输出所有SQS队列的ARN,格式为队列名:ARN的键值对
output "sqs_queue_arn" {
  value       = { for queue_name, queue_obj in aws_sqs_queue.CloudTrail_SQS : queue_name => queue_obj.arn }
  description = "The ARN map of all SQS queues."
}

# 输出所有SQS队列的URL,格式为队列名:URL的键值对
output "sqs_queue_id" {
  value       = { for queue_name, queue_obj in aws_sqs_queue.CloudTrail_SQS : queue_name => queue_obj.id }
  description = "The URL map of all SQS queues."
}

如果你只要单个队列的属性,也可以直接指定队列名索引,比如aws_sqs_queue.CloudTrail_SQS["CloudTrail_Event_One"].arn

2. IAM policy 错误使用each对象报错

each关键字只能在声明了for_each参数的resource/data块内部使用,你的aws_iam_policy_document没有配置for_each,所以不能用each.key。
如果要给所有SQS队列授权,直接用splat表达式提取所有ARN即可,修改后的代码示例:

data "aws_iam_policy_document" "policy_document"{
  statement{
    actions = [
      "sqs:GetQueueUrl",
      "sqs:ReceiveMessage"
    ]
    effect = "Allow"
    resources = values(aws_sqs_queue.CloudTrail_SQS)[*].arn
  }
}

如果需要每个队列单独生成policy,就给这个data块加上和SQS一样的for_each配置:

data "aws_iam_policy_document" "policy_document"{
  for_each = var.sqs_queue_names
  statement{
    actions = [
      "sqs:GetQueueUrl",
      "sqs:ReceiveMessage"
    ]
    effect = "Allow"
    resources = [aws_sqs_queue.CloudTrail_SQS[each.key].arn]
  }
}

内容的提问来源于stack exchange,提问作者bibi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:15:00