如何通过 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 中设置非默认服务帐户?

terraform GCE 服务帐户节

如何使用 Terraform 将文件从本地计算机复制到存储帐户

如何使用 terraform 创建具有访问权限和密钥的 AWS IAM 服务账户