如何通过 terraform 使用服务帐户创建谷歌云 pubsub 订阅?
Posted
技术标签:
【中文标题】如何通过 terraform 使用服务帐户创建谷歌云 pubsub 订阅?【英文标题】:How to create a google cloud pubsub subscriptions with service account by terraform? 【发布时间】:2021-04-11 20:26:31 【问题描述】:从这个文档中,我想通过 terraform 创建同样的东西。
https://cloud.google.com/run/docs/tutorials/pubsub
gcloud pubsub subscriptions create myRunSubscription --topic myRunTopic \
--push-endpoint=SERVICE-URL/ \
--push-auth-service-account=cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com
terraform 的 main.tf
resource "google_pubsub_subscription" "my_task"
name = "my-task-subscription"
topic = google_pubsub_topic.my_task.name
ack_deadline_seconds = 20
push_config
push_endpoint = var.push_endpoint
dead_letter_policy
dead_letter_topic = "cloud-run-pubsub-invoker@my-project.iam.gserviceaccount.com"
地形应用
# module.pubsub.google_pubsub_subscription.my_task will be created
+ resource "google_pubsub_subscription" "my_task"
+ ack_deadline_seconds = 20
+ id = (known after apply)
+ message_retention_duration = "604800s"
+ name = "my-task-subscription"
+ path = (known after apply)
+ project = (known after apply)
+ topic = "MyTask"
+ dead_letter_policy
+ dead_letter_topic = "cloud-run-pubsub-invoker@my-project.iam.gserviceaccount.com"
+ expiration_policy
+ ttl = (known after apply)
+ push_config
+ push_endpoint = "https://an-endpoint.com"
出现错误:
Error: Error creating Subscription: googleapi: Error 400: Invalid resource name given (name=cloud-run-pubsub-invoker@my-project.iam.gserviceaccount.com). Refer to https://cloud.google.com/pubsub/docs/admin#resource_names for more information.
从 terraform 的文档中,dead_letter_policy
与 Pub/Sub 服务帐户相关:
https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/pubsub_subscription#dead_letter_policy
但为什么它不起作用?那么如何将--push-auth-service-account
设置为google官方呢?
【问题讨论】:
您是否使用pubsub_subscription_iam
设置了您的 IAM 订阅策略?
【参考方案1】:
您链接的 Terraform 文档如下所述。
与此订阅的关联的 Cloud Pub/Sub 服务帐号 父项目(即, service-project_number@gcp-sa-pubsub.iam.gserviceaccount.com) 必须 有权对此订阅的 Acknowledge() 消息。
您用于死信策略的服务帐户似乎没有适当的权限来确认消息。
根据 IAM 文档,它至少需要 pub/sub 订阅者 角色来确认消息。
请参阅 here 以获取有关 pubsub 角色的更多信息。
【讨论】:
【参考方案2】:你的问题在这里:
dead_letter_policy
dead_letter_topic = "cloud-run-pubsub-invoker@my-project.iam.gserviceaccount.com"
您正在尝试将服务帐户身份分配给dead_letter_topic
。这是不正确的。
改为使用类似这样的东西来创建主题:
resource "google_pubsub_topic" "example_dead_letter"
name = "example-topic-dead-letter"
或者这个来引用一个现有的话题:
data "google_pubsub_topic" "example_dead_letter"
name = "example-topic-dead-letter"
然后像这样使用该资源:
dead_letter_policy
dead_letter_topic = google_pubsub_topic.example_dead_letter.id
【讨论】:
以上是关于如何通过 terraform 使用服务帐户创建谷歌云 pubsub 订阅?的主要内容,如果未能解决你的问题,请参考以下文章
使用 terraform 如何创建一个跨多个项目使用的服务帐户?
如何在 terraform 中正确创建具有角色的 gcp 服务帐户
如何使用 Terraform 在 GKE 中设置非默认服务帐户?