Ingress部署中使用Vault AppRole时的Terraform错误技术问询
背景
我们正在修复Terraform与云服务商的状态不一致问题——此前通过云控制台UI删除了某数据库,但该变更未正确导入到Terraform中。出于特定原因,我们未执行terraform import命令,而是直接修改状态文件移除了该数据库的所有引用,plan等操作暂时恢复正常,但随即遇到了新问题。另外说明:我们也通过Terraform调用Helm搭建Kubernetes基础设施。
遇到的问题
现在Terraform生成的执行计划会移除一个Google Container Node Pool(这是预期结果),但同时会更新Kubernetes的Ingress资源(这并非我们预期的变更)。推测原因是搭建集群(包含节点池)的模块与Ingress模块之间存在Terraform依赖关系。
问题出在Ingress的更新操作上,具体执行计划如下:
# Terraform 将从Vault读取AppRole data "vault_approle_auth_backend_role_id" "role" { - backend = "approle" -> null ~ id = "auth/approle/role/nginx-ingress/role-id" -> (known after apply) ~ role_id = "<some UUID>" -> (known after apply) role_name = "nginx-ingress" } # 以下资源引发了报错 resource "helm_release" "nginx-ingress" { atomic = false chart = ".terraform/modules/nginx-ingress/terraform/../helm" ... ... - set_sensitive { - name = "appRole.roleId" -> null - value = (sensitive value) } + set_sensitive { + name = "appRole.roleId" + value = (sensitive value) } - set_sensitive { - name = "appRole.secretId" -> null - value = (sensitive value) } + set_sensitive { + name = "appRole.secretId" + value = (sensitive value) } }
收到的错误信息:
在扩展 module.nginx-ingress.helm_release.nginx-ingress 的执行计划以包含当前应用过程中已获取的新值时,Helm 提供者(registry.terraform.io/hashicorp/helm)为 .set_sensitive 生成了无效的新值:计划中的集合元素 cty.ObjectVal(map[string]cty.Value{"name":cty.StringVal("appRole.secretId"), "type":cty.NullVal(cty.String), "value":cty.StringVal("<some other UUID>")}) 与实际中的任何元素都不匹配。 这是提供者中的 bug,请在该提供者的官方问题追踪器中提交报告。
已尝试的方案
- 我们猜测AppRole的secretId可能发生了轮换或变更,于是从使用同一Vault中相同AppRole的其他环境状态文件里获取secretId,更新到当前修改后的状态文件,但问题并未解决。
内容的提问来源于stack exchange,提问作者EDG956
相关产品推荐
相关产品推荐

