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

