Terraform导入的aws_glue_connection如何避免覆盖connection_properties属性
解决方案
方案1:使用lifecycle规则忽略敏感字段变更(推荐适配你当前的需求)
直接在aws_glue_connection资源块中添加lifecycle配置,指定忽略connection_properties的整体或部分字段的变更,Terraform执行plan和apply时就不会覆盖你手动在控制台配置的凭证信息:
resource "aws_glue_connection" "some-connection-name" { name = "some-connection-name" physical_connection_requirements { availability_zone = var.availability_zone security_group_id_list = var.security_group_id_list subnet_id = var.subnet_id } connection_properties = { JDBC_CONNECTION_URL = "jdbc:postgresql://change_host_name:5432/db_name" JDBC_ENFORCE_SSL = "false" PASSWORD = "change_password" USERNAME = "change_username" } // 新增以下配置 lifecycle { ignore_changes = [ // 可以选择整体忽略connection_properties的所有变更 connection_properties // 如果需要保留对部分非敏感字段(比如JDBC_ENFORCE_SSL)的管理能力,可以只忽略敏感字段: // connection_properties["JDBC_CONNECTION_URL"], // connection_properties["USERNAME"], // connection_properties["PASSWORD"] ] } }
为什么省略connection_properties参数不生效?
对于Terraform而言,资源的所有参数如果没有显式在配置中声明,且没有被纳入ignore_changes规则,Terraform会默认将配置值与远端实际值对比,尝试将远端值对齐为配置中的预期值(未声明的属性会被Terraform判定为需要移除,因此仍然会触发覆盖操作)。
方案2:结合AWS密钥服务托管敏感配置(进阶,适合长期标准化管理)
如果你不想完全放弃对connection_properties的Terraform管理,又不希望在代码中存储明文凭证,可以将敏感值存储到AWS Secrets Manager或SSM Parameter Store中,通过Terraform数据源动态读取填充:
// 读取SSM参数存储中的敏感配置,需提前在AWS中配置好对应参数并授予Terraform访问权限 data "aws_ssm_parameter" "db_jdbc_url" { name = "/prod/glue/connection/jdbc_url" with_decryption = true } data "aws_ssm_parameter" "db_username" { name = "/prod/glue/connection/username" with_decryption = true } data "aws_ssm_parameter" "db_password" { name = "/prod/glue/connection/password" with_decryption = true } resource "aws_glue_connection" "some-connection-name" { name = "some-connection-name" physical_connection_requirements { availability_zone = var.availability_zone security_group_id_list = var.security_group_id_list subnet_id = var.subnet_id } connection_properties = { JDBC_CONNECTION_URL = data.aws_ssm_parameter.db_jdbc_url.value JDBC_ENFORCE_SSL = "false" PASSWORD = data.aws_ssm_parameter.db_password.value USERNAME = data.aws_ssm_parameter.db_username.value } }
该方案不需要手动在控制台修改配置,代码中无明文凭证,同时也能保证Terraform配置与远端实际值一致,不会触发不必要的变更。
注意事项
如果后续需要通过Terraform修改被ignore_changes覆盖的字段,只需临时将对应字段从ignore_changes列表中移除,修改配置完成apply后再重新添加即可。
内容的提问来源于stack exchange,提问作者John Skiles Skinner
相关产品推荐
相关产品推荐

