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
相关产品推荐
相关产品推荐

