![](/img/trans.png)
[英]How can I add IAM role for other project service account in Google Cloud in different project using Terraform
[英]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塊,但它沒有工作,因為它不直接期望該塊。
設想:
例如, 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
已經在與訂閱項目不同的項目中創建的解決方案。
我在訂閱項目上創建了一個服務帳戶 (SA),我將其命名為stackoverflow-playground-sa
並只賦予它Pub/Sub Editor
角色,如下面的屏幕截圖所示。
我為 SA 授予了主題topic-sof
上的Pub/Sub Subscriber
角色,如下面的屏幕截圖所示。 如果您不執行此步驟:您將在 terraform apply 收到此錯誤
Error: Error creating Subscription: googleapi: Error 403: User not authorized to perform this action
當然,我與一個對兩個項目都有足夠權限的用戶一起完成了角色分配的前兩個步驟
我為我的 SA 創建了一個 json 密鑰文件並下載到/path/to/my/key/stackoverflow-playground-sa.json
我使用身份驗證為我的 SA
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/key/stackoverflow-playground-sa.json
因此 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"
}
運行 ( apply
) my terraform 並創建訂閱pull-subscription-of-topic-in-another-project
並附加到另一個項目中的主題topic-sof
。
我使用 web ui 向topic-sof
發布了一條消息。
由於第 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.