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

Terraform部署Cognito用户池时邀请消息被强制重置为默认的问题

问题描述

我用Terraform编写代码,遍历列表为每个元素创建Cognito用户池。若同名用户池已存在,会保留现有状态,这部分功能正常。

通常逻辑是:

  • 代码中定义的参数会重置现有用户池的对应设置;
  • 未定义的参数则保留控制台配置,比如password_policy和verification_message_template都遵循此规则——定义则生效,不定义则保留原有设置。

但异常点:无论代码中是否定义invite_message_template,控制台里的「邀请消息」都会被重置为默认值。

请问这是预期行为吗?官方文档未对此说明。有没有办法保留控制台已设置的邀请消息模板?

相关代码

resource "aws_cognito_user_pool" "multitenantpools" {
  for_each = {for i, v in local.tenants_list_nonsensitive:  i => v}
    name = "pool-${each.value.tenant}-${var.env}"

    deletion_protection = "ACTIVE"
    username_attributes = ["email"]
    auto_verified_attributes = ["email"]

    # password_policy {
    #   minimum_length = 8
    #   require_numbers = true
    #   require_uppercase = true
    #   require_lowercase = true
    # }

    # verification_message_template {
    #   default_email_option = "CONFIRM_WITH_CODE"
    #   email_subject = "Account Confirmation"
    #   email_message = "Your confirmation code is {####}"
    # }

    admin_create_user_config {
      allow_admin_create_user_only = true
    }

    schema {
      attribute_data_type      = "String"
      developer_only_attribute = false
      mutable                  = true
      name                     = "email"
      required                 = true

      string_attribute_constraints {
        min_length = 1
        max_length = 256
      }
    }

    tags = {
      #Name  = "${local.pool_prefix}_${each.value.tenant}_${var.env}"
      domain = "${each.value.domain}" # trick to inject custom info for Client resource
      tenant = "${each.value.tenant}" # trick to inject custom info for Client resource
    }

}
解答

这不是预期行为,是Terraform AWS Provider对invite_message_template的特殊处理逻辑导致的:该字段属于admin_create_user_config的嵌套块,当你在代码中定义admin_create_user_config但未显式指定invite_message_template时,Provider会默认将其重置为AWS的默认值,而非保留现有配置。

要保留控制台已设置的邀请消息模板,有两种可行方案:

  • 显式导入现有配置到Terraform状态
    运行terraform import命令将现有用户池的invite_message_template配置导入状态,之后在代码中显式定义该块,确保后续变更不会覆盖:

    terraform import aws_cognito_user_pool.multitenantpools[<索引或键值>] <目标用户池ID>
    

    导入完成后,通过terraform show命令查看状态中的invite_message_template配置,将其复制到代码内的admin_create_user_config块中即可。

  • 使用ignore_changes生命周期参数
    在资源块中添加生命周期配置,让Terraform忽略invite_message_template的变更,这样控制台修改的配置不会被Terraform重置:

    resource "aws_cognito_user_pool" "multitenantpools" {
      # 现有代码...
    
      admin_create_user_config {
        allow_admin_create_user_only = true
      }
    
      lifecycle {
        ignore_changes = [
          admin_create_user_config[0].invite_message_template
        ]
      }
    
      # 现有代码...
    }
    

    注意:使用此方式后,若后续需要通过Terraform修改invite_message_template,需先移除ignore_changes配置再更新代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:22:31