如何通过Terraform调用gcloud命令 创建启用TLS的Redis可运行示例
Terraform调用gcloud创建启用TLS的Redis实例实现方案
当前GCP Terraform provider的部分版本未暴露Redis实例TLS加密的原生配置参数,可通过Terraform原生的null_resource能力嵌入gcloud命令调用流程,完成带TLS的Redis实例创建,全程不需要依赖第三方插件。
前置检查项
- 运行Terraform的主机需提前完成gcloud安装,且已通过gcloud自身的认证流程(如用户登录、服务账号密钥挂载),可直接执行gcloud命令访问目标GCP项目
- 确认本机gcloud版本支持Redis实例的TLS配置参数
--transit-encryption-mode,使用2021年之后的稳定发行版即可正常调用 - 提前确认目标VPC网络的peering权限正常,避免命令执行时出现网络连通性报错
可直接运行的参考代码
# 配置基础GCP provider provider "google" { project = var.gcp_project_id region = var.gcp_region } # 定义输入变量 variable "gcp_project_id" {} variable "gcp_region" {} variable "redis_instance_name" {} variable "redis_memory_size_gb" { default = 5 } variable "redis_tier" { default = "STANDARD_HA" } # 用null_resource承载gcloud命令执行流程 resource "null_resource" "tls_enabled_redis" { # 配置触发执行的判断条件,保证参数无变化时不会重复执行命令 triggers = { instance_name = var.redis_instance_name memory_size = var.redis_memory_size_gb tier = var.redis_tier tls_mode = "SERVER_AUTHENTICATION" } # 创建阶段调用gcloud命令启动带TLS的Redis实例 provisioner "local-exec" { command = <<-EOT gcloud redis instances create ${var.redis_instance_name} \ --size=${var.redis_memory_size_gb} \ --tier=${var.redis_tier} \ --region=${var.gcp_region} \ --transit-encryption-mode=SERVER_AUTHENTICATION \ --network=projects/${var.gcp_project_id}/global/networks/default EOT } # 销毁阶段自动清理GCP侧的Redis实例,避免残留资源产生费用 provisioner "local-exec" { when = destroy command = "gcloud redis instances delete ${var.redis_instance_name} --region=${var.gcp_region} --quiet" } } # 输出提示,指导后续拉取TLS证书信息 output "redis_tls_config_tip" { value = "执行 gcloud redis instances describe ${var.redis_instance_name} --region=${var.gcp_region} --format='value(server_ca_certs[0].cert)' 即可获取TLS连接需要的根证书内容" }
实操注意事项
local-exec的执行上下文是运行Terraform的本地机器,不是云端执行环境,不要在命令字符串里硬编码敏感认证信息,优先依赖本机已配置的gcloud认证上下文- 通过该方式创建的Redis实例不会自动纳入Terraform状态管理,如需后续通过Terraform调整实例配置,可通过官方import能力将资源导入Terraform管理范围
- 必须给所有外部命令配置非交互参数(如上面delete命令里的
--quiet),否则Terraform执行过程中会因为等待用户输入卡在执行环节 - 在
null_resource的triggers字段中要枚举所有影响实例配置的参数,保证只有参数发生实际变更时才会重新执行创建命令,避免无意义的重复执行触发资源已存在的报错
内容的提问来源于stack exchange,提问作者Ganesh
相关产品推荐
相关产品推荐

