使用Terraform Map与for_each时,子资源如何引用父资源
批量创建AWS SES邮箱身份及关联策略的修改方案
问题背景
原有代码通过硬编码单个邮箱创建SES邮件身份及关联策略,现已将aws_ses_email_identity改为使用for_each批量生成资源,需同步修改aws_iam_policy_document和aws_ses_identity_policy以关联每个批量生成的邮箱身份。
修改思路
由于父资源aws_ses_email_identity.main_from_email_map通过for_each迭代var.clientemails生成,后续的策略文档和身份策略也需要通过for_each遍历同一集合,为每个邮箱身份单独生成对应的权限策略。
完整修改代码
1. 变量定义(确保clientemails类型匹配)
variable "clientemails" { type = map(object({ email = string })) description = "批量创建的客户端邮箱列表" } # 假设已有命名空间定义 locals { namespace = "your-namespace" }
2. 批量生成SES邮箱身份(已完成)
resource "aws_ses_email_identity" "main_from_email_map" { for_each = var.clientemails email = each.value.email }
3. 批量生成IAM策略文档
data "aws_iam_policy_document" "main_from_email_policy_document" { for_each = var.clientemails statement { actions = ["SES:SendEmail", "SES:SendRawEmail"] resources = [aws_ses_email_identity.main_from_email_map[each.key].arn] principals { identifiers = ["*"] type = "AWS" } } }
4. 批量关联SES身份策略
resource "aws_ses_identity_policy" "email_notif_policy" { for_each = var.clientemails identity = aws_ses_email_identity.main_from_email_map[each.key].arn name = "${local.namespace}-ses_${each.key}_email_policy" policy = data.aws_iam_policy_document.main_from_email_policy_document[each.key].json }
关键说明
- 三个资源均使用
for_each = var.clientemails保持迭代一致性,通过each.key关联同一客户端的资源实例。 - 策略文档中通过
aws_ses_email_identity.main_from_email_map[each.key].arn获取对应邮箱身份的ARN。 - 策略名称加入
each.key确保唯一性,避免同名冲突。
内容的提问来源于stack exchange,提问作者user203687
相关产品推荐
相关产品推荐

