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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:10:36