【问题标题】:Terraform pass string as list using for expressionTerraform 使用 for 表达式将字符串作为列表传递
【发布时间】:2021-12-01 23:42:02
【问题描述】:

我正在尝试使用随机生成的密码创建三个 elasticache redis 用户。这些 ES Redis 用户每个都有不同的名称,因此我使用for_each 根据service_name 设置用户名。这很好用!我正在运行的问题是为该用户使用随机密码。我正在使用随机密码生成器,每个用户的计数为3。我无法将密码作为列表传递并遇到此错误:Inappropriate value for attribute "passwords": set of string required. 任何帮助将不胜感激。

resource "random_password" "my_passwords" {
  count = 3
  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"
  passwords     = "[for r random_password.my_passwords : r.result]"

【问题讨论】:

  • passwords 参数的值中有错字。由于" 的拼写错误,您将list 构造函数中的for 表达式转换为文字字符串。从值中删除拼写错误",让我们知道接下来会发生什么。
  • 我解决了这个问题 - 仍然是同样的问题。

标签: amazon-web-services terraform


【解决方案1】:

我不会使用 random_password 对金额进行硬编码,而是使用相同的 for 循环...

见下面的代码:

resource "random_password" "pws" {
  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"
  passwords     = [ random_password.pws[each.key].result ]
}

这样,两个资源上的密钥是相同的,我们可以从任何在 my_service_names 上循环的资源访问它们,就像我在那里做的那样:
random_password.pws[each.key].result

【讨论】:

  • 工作就像一个魅力!非常感谢。
  • @Doug 很高兴它对你有用,terraform 非常严格,但是一旦你完成了其中的一些,它就会成为第二天性
猜你喜欢
  • 1970-01-01
  • 2022-08-18
  • 2015-06-02
  • 2018-04-05
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
相关资源
最近更新 更多