簡體   English   中英

如何通過 terraform 使用服務帳戶創建谷歌雲 pubsub 拉取訂閱?

[英]How to create a google cloud pubsub pull subscriptions with service account by terraform?

google_pubsub_subscription的 terraform 文檔中,它提到在push_configuration下有一個oidc_token屬性允許推送訂閱使用服務帳戶,但沒有提到如何使用服務帳戶進行請求訂閱

如何明確設置在創建pull pubsub 訂閱期間要使用的服務帳戶?

我嘗試添加oidc_token塊,但它沒有工作,因為它不直接期望該塊。

設想:

  1. 我有一個服務帳戶可以訪問Project_A中的 pubsub 主題(以及附加訂閱的必要權限)
  2. 我想在 terraform 的Project_B中創建對這些主題的訂閱。
  3. 我需要在 terraform 中明確使用此服務帳戶,因此我可以在Project_B 上創建對 Project_A主題的訂閱

例如, google_cloudfunctions_function資源有一個名為 service_account_email 的字段,用於設置服務帳戶。 但是沒有用於google_pubsub_subscription資源,用於文檔中的請求訂閱

實際上,服務帳戶 ( service_account_email ) 將在oidc_token部分內指定(您必須在文檔中進一步指定 go :)

下面是帶有服務帳戶和受眾(可選)的推送訂閱的工作示例

variable "project" {
  type = string
  default = "<YOUR_PROJECT_ID>"
}

resource "google_pubsub_topic" "example" {
  project = var.project
  name = "example-topic"
}

resource "google_pubsub_subscription" "example" {
  project = var.project
  name  = "example-push-subscription-with-auth"
  topic = google_pubsub_topic.example.name

  push_config {
    push_endpoint = "https://example.com/push"
    oidc_token {
      service_account_email = "${var.project}@appspot.gserviceaccount.com"
      audience = "https://example.com/push"
    }

  }
}

我正在添加另一個答案,因為在不同的評論之后問題發生了很大變化。

這是假設主題topic-sof已經在與訂閱項目不同的項目中創建的解決方案。

  1. 我在訂閱項目上創建了一個服務帳戶 (SA),我將其命名為stackoverflow-playground-sa並只賦予它Pub/Sub Editor角色,如下面的屏幕截圖所示。 在此處輸入圖像描述

  2. 我為 SA 授予了主題topic-sof上的Pub/Sub Subscriber角色,如下面的屏幕截圖所示。 如果您不執行此步驟:您將在 terraform apply 收到此錯誤

 Error: Error creating Subscription: googleapi: Error 403: User not authorized to perform this action

在此處輸入圖像描述

當然,我與一個對兩個項目都有足夠權限的用戶一起完成了角色分配的前兩個步驟

  1. 我為我的 SA 創建了一個 json 密鑰文件並下載到/path/to/my/key/stackoverflow-playground-sa.json

  2. 我使用身份驗證為我的 SA

export GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/key/stackoverflow-playground-sa.json

因此 terraform 可以使用它來創建訂閱。

  1. 這是創建訂閱的 terraform 配置
variable "subscription_project" {
  type = string
  default = "<YOUR_SUBSCRIPTION_PROJECT>"
}

variable "topic_project" {
  type = string
  default = "<YOUR_TOPIC_PROJECT>"
}

resource "google_pubsub_subscription" "pull-subscription-of-topic-in-another-project" {
  project = var.subscription_project
  name  = "pull-subscription-of-topic-in-another-project"
  topic = "projects/${var.topic_project}/topics/topic-sof"
}
  1. 運行 ( apply ) my terraform 並創建訂閱pull-subscription-of-topic-in-another-project並附加到另一個項目中的主題topic-sof

  2. 我使用 web ui 向topic-sof發布了一條消息。

  3. 由於第 4 步,我仍然被認證為stackoverflow-playground-sa ,我拉取消息(在我的 treminal 中使用 gcloud)et voilà 消息收到: 在此處輸入圖像描述

總而言之:在您的 terraform 配置中沒有要為此要求指定的服務帳戶。 服務帳戶及其密鑰設置在 terraform 之外(步驟 1 到 4),以便 terraform 進程可以通過身份驗證和授權來創建配置的資源(在我們的例子中是訂閱)。 除了在第 4 步中使用服務帳戶密鑰之外,出於安全考慮,這是一種不好的做法。 另一種方法是使用

gcloud auth application-default login

這將使您可以設置您選擇的用戶的默認憑據。 鑒於該用戶具有我為 SA 設置的角色。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM