Как создать подписку на Google Cloud Pubsub с учетной записью службы по terraform?

Из этого документа я хочу создать то же самое с помощью 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's 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 = "[email protected]"
  }
}

терраформ применять

  # 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 = "[email protected]"
        }

      + 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 ([email protected]). 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 официальным гуглом?


comment
Вы установили свои политики подписки IAM с помощью pubsub_subscription_iam?   -  person Marcin    schedule 06.01.2021


Ответы (2)


Ваша проблема здесь:

  dead_letter_policy {
    dead_letter_topic = "[email protected]"
  }

Вы пытаетесь назначить учетную запись службы 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
  }
person John Hanley    schedule 06.01.2021

В документе Terraform, который вы связали, говорится, как показано ниже.

Учетная запись службы Cloud Pub / Sub, связанная с родительским проектом этой подписки (например, service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com), должна иметь разрешение на отправку сообщений Acknowledge () в этой подписке.

Похоже, что ваша учетная запись службы, которую вы используете для политики недоставленных сообщений, не имеет соответствующего разрешения на подтверждение сообщений.

Согласно документу IAM, для подтверждения сообщений требуется как минимум роль pub / subscriber.

Дополнительную информацию о ролях pubsub см. здесь.

person kallusis369    schedule 06.01.2021