如何在Terraform数据源中传入指定值而非遍历集合?
解决Terraform中直接指定Azure Key Vault Secret名称而非遍历集合的问题
情况一:仅需检查单个固定名称的Secret
如果你的需求是只验证某一个特定名称的Secret是否存在,不需要和每个用户绑定,直接修改数据源配置即可:
data "azurerm_key_vault_secret" "secret_check" { name = "PM-your-target-secret" # 替换成你要检查的具体Secret名称 key_vault_id = module.variables.keyVault-id }
然后调整snowflake_user里的密码引用逻辑,因为数据源不再是集合类型,直接用data.azurerm_key_vault_secret.secret_check.value即可:
resource "snowflake_user" "userSVC_db" { for_each = var.user_collection name = each.key ... password = ( each.value.password_overwrite == false ? random_password.password[index(keys(var.user_collection), each.key)].result : each.value.password_overwrite == true ? random_password.password-overwrite.result : each.value.password_overwrite == null ? data.azurerm_key_vault_secret.secret_check.value : null ) }
情况二:为部分用户单独绑定Secret(不遍历全集合)
如果需要给特定用户对应各自的Secret,但不想遍历整个var.user_collection集合,可以先筛选出需要从Key Vault取密码的用户子集:
locals { # 只保留password_overwrite为null的用户,也就是需要从Key Vault取密码的用户 secret_users = { for user_key, user_attr in var.user_collection : user_key => user_attr if user_attr.password_overwrite == null } }
接着修改数据源,只遍历这个筛选后的子集:
data "azurerm_key_vault_secret" "secret_check" { for_each = local.secret_users name = "PM-${replace(each.value.name, "_", "-")}" key_vault_id = module.variables.keyVault-id }
最后在snowflake_user里引用时,直接用当前用户的key去访问数据源即可(因为只有符合条件的用户才在secret_users里,不会出现键不存在的问题):
resource "snowflake_user" "userSVC_db" { for_each = var.user_collection name = each.key ... password = ( each.value.password_overwrite == false ? random_password.password[index(keys(var.user_collection), each.key)].result : each.value.password_overwrite == true ? random_password.password-overwrite.result : each.value.password_overwrite == null ? data.azurerm_key_vault_secret.secret_check[each.key].value : null ) }
内容的提问来源于stack exchange,提问作者Tomas Gryzbon
相关产品推荐
相关产品推荐

