如何通过Terraform脚本在GCP中为单个Pub/Sub主题创建多个订阅
用Terraform批量创建Google Pub/Sub订阅
你可以通过Terraform的for_each或count特性批量生成多个订阅,以下是两种常用方案:
方案一:用for_each实现带自定义配置的批量订阅
适合需要给不同订阅设置不同属性(比如过滤规则、确认超时)的场景。
1. 定义订阅配置变量
先声明一个变量,存储所有订阅的名称和各自的自定义参数:
variable "pubsub_subscriptions" { type = map(object({ filter = string ack_deadline_seconds = number enable_message_ordering = bool })) default = { "example-1" = { filter = "attributes.KEY = \"value\"" ack_deadline_seconds = 20 enable_message_ordering = true }, "example-2" = { filter = "attributes.USER_TYPE = \"admin\"" ack_deadline_seconds = 30 enable_message_ordering = false }, "example-3" = { filter = "" # 无消息过滤 ack_deadline_seconds = 20 enable_message_ordering = true } } }
2. 修改资源块使用for_each
替换原有的单个订阅资源块,用for_each遍历上述变量生成多个订阅:
resource "google_pubsub_subscription" "subscriptions" { for_each = var.pubsub_subscriptions name = each.key topic = "{{topic-id}}" # 替换为你的主题ID labels = { application = var.app_name business_unit = var.business_unit contact_email = var.contact_email name = var.app_name owner = var.owner } message_retention_duration = "1200s" retain_acked_messages = true filter = each.value.filter ack_deadline_seconds = each.value.ack_deadline_seconds retry_policy { minimum_backoff = "180s" } enable_message_ordering = each.value.enable_message_ordering }
each.key会自动作为订阅名称,对应变量里的键(比如example-1)each.value调用对应订阅的自定义配置,实现不同订阅的差异化设置
方案二:用count实现同配置批量订阅
如果所有订阅的配置完全一致,仅名称不同,可以用更简单的count:
1. 定义订阅名称列表
variable "subscription_names" { type = list(string) default = ["example-1", "example-2", "example-3"] }
2. 修改资源块使用count
resource "google_pubsub_subscription" "subscriptions" { count = length(var.subscription_names) name = var.subscription_names[count.index] topic = "{{topic-id}}" labels = { application = var.app_name business_unit = var.business_unit contact_email = var.contact_email name = var.app_name owner = var.owner } message_retention_duration = "1200s" retain_acked_messages = true filter = "attributes.KEY = \"value\"" ack_deadline_seconds = 20 retry_policy { minimum_backoff = "180s" } enable_message_ordering = true }
count.index会依次取列表的索引值,遍历生成对应名称的订阅
内容的提问来源于stack exchange,提问作者Koushik J
相关产品推荐
相关产品推荐

