使用Terraform创建GCP Pub/Sub Schema无需手动替换换行符的方案咨询
Terraform创建GCP Pub/Sub Schema自动转义换行解决方案
- 方案1:将原始Schema存为独立文件自动读取转义
你可以直接将产品团队提供的原始Proto内容原样保存为后缀为.proto的独立文件(例如usage_schema.proto),无需修改任何内容,修改Terraform代码如下即可自动完成转义:
resource "google_pubsub_schema" "schema" { name = var.schema_name type = var.schema_type // 自动读取文件并转义换行、双引号 definition = replace(replace(file("${path.module}/usage_schema.proto"), "\n", "\\n"), "\"", "\\\"") }
- 方案2:直接对变量值自动转义
如果你是通过变量传入Schema内容,无需修改变量的原始值,直接在资源定义中增加转义逻辑即可:
resource "google_pubsub_schema" "schema" { name = var.schema_name type = var.schema_type // 直接对原始变量值做转义处理 definition = replace(replace(var.schema_definition, "\n", "\\n"), "\"", "\\\"") }
- 方案3:代码内直接写多行Schema自动转义
如果你需要把Schema内容直接写在Terraform代码中,可以用heredoc语法写原始内容,套转义逻辑即可:
locals { // 直接粘贴原始Schema内容,无需修改 raw_schema = <<EOF syntax = "proto3"; package com.sntl.proto; message UsageMessageProto { string tenantEnvId = 1; string correlationId = 2; UsageDataProto data = 3; message UsageDataProto { string identity = 1; string sessionId = 2; uint32 clientVersion = 3; uint64 timeStamp = 4; string authId = 5; uint64 usageCountMultiplier = 6; uint64 hardlimit = 7; string machineId = 8; string serviceId = 9; uint64 vendorId = 10; string logComment = 11; } } EOF } resource "google_pubsub_schema" "schema" { name = var.schema_name type = var.schema_type definition = replace(replace(local.raw_schema, "\n", "\\n"), "\"", "\\\"") }
原理解释
GCP Pub/Sub Schema的底层API要求definition字段传入转义后的单行字符串,控制台手动创建时会自动完成转义操作,而Terraform默认会原样传入输入的字符串,因此需要通过内置的replace函数自动完成换行、双引号的转义,不需要手动修改原始Schema内容。
内容的提问来源于stack exchange,提问作者Gaurav Yadav
相关产品推荐
相关产品推荐

