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

Terraform使用for表达式传递字符串列表解决ElastiCache用户密码赋值报错

问题原因

  • 语法错误1:passwords赋值时把for表达式用双引号包裹,导致整个值被识别为普通字符串,不符合属性要求的类型规范
  • 语法错误2:for表达式缺少in关键字,即便去掉引号也会触发语法报错
  • 类型不匹配:修正语法后,列表推导返回的是list(string)类型,而aws_elasticache_user的passwords属性要求传入set(string)类型,类型不一致触发你收到的报错
  • 逻辑缺陷:当前用count生成密码、for_each创建用户的写法,没有将密码和用户做一一绑定,会导致所有用户共用全部3个密码,且后续调整服务数量时对应关系会错乱

解决方案

方案1:快速修复(仅解决类型报错,不修正逻辑问题)

如果确实需要每个用户都配置全部3个密码,修正语法并通过toset()转换类型即可:

resource "aws_elasticache_user" "my-users" {
  for_each = toset(var.my_service_names)
  user_id       = "${each.key}-${var.env}"
  user_name     = "${each.key}-${var.env}"
  access_string = "on ~* +@all"
  engine        = "REDIS"
  passwords     = toset([for r in random_password.my_passwords : r.result])
}

方案2:规范写法(每个用户对应独立密码,生产环境推荐)

把random_password也改为使用和ElastiCache用户一致的for_each规则,实现用户和密码一一对应,避免后续变更出现错乱:

# 改为for_each生成密码,和用户一一绑定
resource "random_password" "my_passwords" {
  for_each = toset(var.my_service_names)
  length           = 19
  special          = true
  override_special = "_%@"
}

resource "aws_elasticache_user" "my-users" {
  for_each = toset(var.my_service_names)
  user_id       = "${each.key}-${var.env}"
  user_name     = "${each.key}-${var.env}"
  access_string = "on ~* +@all"
  engine        = "REDIS"
  # 取当前用户对应密码,用toset包裹满足类型要求
  passwords     = toset([random_password.my_passwords[each.key].result])
}

这种写法下,每个服务对应的用户会匹配独立生成的随机密码,增减服务数量时密码和用户的对应关系也不会发生偏移。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:06:04