Google Cloud 連線

Google Cloud 連線類型啟用 Google Cloud 整合。

驗證 Google Cloud

有三種方式可以使用 Airflow 連線至 Google Cloud

  1. 使用應用程式預設憑證

  2. 透過在 JSON 格式中指定金鑰檔案,使用服務帳戶。金鑰可以指定為金鑰檔案的路徑(金鑰檔案路徑)、金鑰酬載(金鑰檔案 JSON)或 Secret Manager 中的密碼(金鑰檔案 密碼名稱)。一次只能使用一種定義金鑰的方式。如果您需要管理多個金鑰,則應設定多個連線。

  3. 透過指定有效憑證設定檔案的路徑或內容,使用憑證設定檔案。憑證設定檔案是一種組態檔案,通常包含非敏感的中繼資料,以指示 google-auth 程式庫如何檢索外部主體權杖並將其交換為服務帳戶存取權杖。

    警告

    可能需要其他權限

    使用 Secret Manager 中的金鑰的連線需要應用程式預設憑證 (ADC) 具有訪問密碼酬載的權限。

    注意

    儲存連線的替代方法

    除了僅在 Secret Manager 中儲存金鑰外,還可以選擇儲存整個連線。有關更多詳細資訊,請參閱Google Secret Manager 後端

預設連線 ID

所有與 Google Cloud 相關的 Hook 和運算子預設都使用 google_cloud_default

關於應用程式預設憑證的注意事項

當在 Google Compute Engine 上執行 Airflow 時,應用程式預設憑證由 GCE 中繼資料伺服器推斷;當在 GKE 上執行時,則由 GKE 中繼資料伺服器推斷,這允許將 Kubernetes 服務帳戶映射到 GCP 服務帳戶工作負載身分。當為單個 GKE 叢集上的多個 Airflow 實例管理最小權限時,這可能很有用,每個實例都有不同的 IAM 覆蓋區。只需為您的工作節點/網路伺服器部署分配 KSA,工作負載身分就會將它們映射到單獨的 GCP 服務帳戶(而不是共享叢集級別的 GCE 服務帳戶)。從安全角度來看,它的優點是不會在磁碟或 Airflow 資料庫中儲存 Google 服務帳戶金鑰,從而不可能洩露敏感的長期憑證金鑰材料。

從 Airflow 的角度來看,應用程式預設憑證可以透過指定空的 URI 用於連線。

例如

export AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT='google-cloud-platform://'

設定連線

專案 ID(選填)

要連線的 Google Cloud 專案 ID。它被使用它的運算子用作預設專案 ID,通常可以在運算子層級覆寫。

金鑰檔案路徑

磁碟上服務帳戶金鑰檔案(JSON 格式)的路徑。

如果使用應用程式預設憑證,則為非必要。

金鑰檔案 JSON

磁碟上服務帳戶金鑰檔案(JSON 格式)的內容。

如果使用應用程式預設憑證,則為非必要。

憑證設定檔案

憑證設定檔案 JSON 或檔案系統上憑證設定檔案的路徑。

如果使用應用程式預設憑證,則為非必要。

持有金鑰檔案 JSON 的密碼名稱

Secret Manager 中包含服務帳戶金鑰的密碼名稱。

如果使用應用程式預設憑證,則為非必要。

範圍(逗號分隔)

要驗證的身分驗證的逗號分隔Google Cloud 範圍列表。

重試次數

整數,使用隨機指數輪詢退避重試的次數。如果所有重試都失敗,則 googleapiclient.errors.HttpError 代表最後一個請求。如果為零(預設值),我們只嘗試請求一次。

模擬鏈

選填服務帳戶,用於使用短期憑證模擬身分,或用於取得列表中最後一個帳戶的 access_token 的鏈式帳戶列表,該帳戶將在利用此連線的所有請求中被模擬身分。如果設定為字串,則帳戶必須授予原始帳戶「服務帳戶權杖建立者」IAM 角色。如果設定為逗號分隔列表,則列表中的身分必須將「服務帳戶權杖建立者」IAM 角色授予緊鄰的前一個身分,列表中的第一個帳戶將此角色授予原始帳戶。

在環境變數中指定連線時,您應使用 URI 語法指定,並具有以下要求

  • scheme 部分應等於 google-cloud-platform(注意:尋找連字號字元)

  • authority(使用者名稱、密碼、主機、埠口)、路徑將被忽略

  • 查詢參數包含特定於此連線類型之資訊。接受以下金鑰

    • project - 專案 ID

    • key_path - 金鑰檔案路徑

    • keyfile_dict - 金鑰檔案 JSON

    • key_secret_name - 持有金鑰檔案 JSON 的密碼名稱

    • key_secret_project_id - 持有金鑰檔案 JSON 的專案 ID

    • scope - 範圍

    • num_retries - 重試次數

請注意,URI 的所有組件都應進行 URL 編碼。

例如,使用 URI 格式

export AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT='google-cloud-platform://?key_path=%2Fkeys%2Fkey.json&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform&project=airflow&num_retries=5'

以及使用 JSON 格式

export AIRFLOW_CONN_GOOGLE_CLOUD_DEFAULT='{"conn_type": "google_cloud_platform", "extra": {"key_path": "/keys/key.json", "scope": "https://www.googleapis.com/auth/cloud-platform", "project": "airflow", "num_retries": 5}}'

直接模擬服務帳戶

Google 運算子透過 impersonation_chain 引數(對於也與其他雲端供應商服務通訊的運算子,則為 google_impersonation_chain)支援直接模擬服務帳戶。模擬鏈也可以直接在 Google Cloud 連線上設定,如上所述,但傳遞給運算子的 impersonation_chain 優先。

例如

import os

from airflow.providers.google.cloud.operators.bigquery import (
    BigQueryCreateEmptyDatasetOperator,
)

IMPERSONATION_CHAIN = "impersonated_account@your_project_id.iam.gserviceaccount.com"

create_dataset = BigQueryCreateEmptyDatasetOperator(
    task_id="create-dataset",
    gcp_conn_id="google_cloud_default",
    dataset_id="test_dataset",
    location="southamerica-east1",
    impersonation_chain=IMPERSONATION_CHAIN,
)

為了使此範例生效,帳戶 impersonated_account 必須授予 google_cloud_default 連線中指定的服務帳戶「服務帳戶權杖建立者」IAM 角色。這將允許產生 impersonated_account 的存取權杖,這將允許使用其權限代表其執行動作。impersonated_account 甚至不需要產生金鑰。

對於連線到多個 Google 服務的運算子,所有 Hook 都使用相同的 impersonation_chain 值(如果適用)。您也可以模擬來自非原始帳戶專案的帳戶。在這種情況下,模擬帳戶的專案 ID 將用作運算子邏輯中的預設專案 ID,除非您已在連線的組態或運算子的引數中明確指定專案 ID。

模擬也可以在鏈中使用:如果連線中指定的服務帳戶在帳戶 A 上被授予「服務帳戶權杖建立者」角色,並且帳戶 A 在帳戶 B 上具有此角色,那麼我們就可以模擬帳戶 B。

例如,使用以下 terraform 設定…

terraform {
  required_version = "> 0.11.14"
}
provider "google" {
}
variable "project_id" {
  type = "string"
}
resource "google_service_account" "sa_1" {
  account_id   = "impersonation-chain-1"
  project = "${var.project_id}"
}
resource "google_service_account" "sa_2" {
  account_id   = "impersonation-chain-2"
  project = "${var.project_id}"
}
resource "google_service_account" "sa_3" {
  account_id   = "impersonation-chain-3"
  project = "${var.project_id}"
}
resource "google_service_account" "sa_4" {
  account_id   = "impersonation-chain-4"
  project = "${var.project_id}"
}
resource "google_service_account_iam_member" "sa_4_member" {
  service_account_id = "${google_service_account.sa_4.name}"
  role               = "roles/iam.serviceAccountTokenCreator"
  member             = "serviceAccount:${google_service_account.sa_3.email}"
}
resource "google_service_account_iam_member" "sa_3_member" {
  service_account_id = "${google_service_account.sa_3.name}"
  role               = "roles/iam.serviceAccountTokenCreator"
  member             = "serviceAccount:${google_service_account.sa_2.email}"
}
resource "google_service_account_iam_member" "sa_2_member" {
  service_account_id = "${google_service_account.sa_2.name}"
  role               = "roles/iam.serviceAccountTokenCreator"
  member             = "serviceAccount:${google_service_account.sa_1.email}"
}

…我們應設定 Airflow 連線以使用 impersonation-chain-1 帳戶的金鑰,並為 impersonation_chain 引數提供以下值…

PROJECT_ID = os.environ.get("TF_VAR_project_id", "your_project_id")
IMPERSONATION_CHAIN = [
    f"impersonation-chain-2@{PROJECT_ID}.iam.gserviceaccount.com",
    f"impersonation-chain-3@{PROJECT_ID}.iam.gserviceaccount.com",
    f"impersonation-chain-4@{PROJECT_ID}.iam.gserviceaccount.com",
]

…然後請求將使用 impersonation-chain-4 帳戶的權限執行。

網域範圍委派

除了直接模擬服務帳戶外,某些 Google 運算子、Hook 和感測器還支援網域範圍委派。委派允許使用者或服務帳戶授予另一個服務帳戶代表其執行的能力。這表示委派其權限的使用者或服務帳戶可以繼續存取和管理自己的資源,而委派的服務帳戶也可以存取和管理這些資源。

例如

PROJECT_ID = os.environ.get("TF_VAR_project_id", "your_project_id")

SPREADSHEET = {
    "properties": {"title": "Test1"},
    "sheets": [{"properties": {"title": "Sheet1"}}],
}

from airflow.providers.google.suite.operators.sheets import (
    GoogleSheetsCreateSpreadsheetOperator,
)

create_spreadsheet_operator = GoogleSheetsCreateSpreadsheetOperator(
    task_id="create-spreadsheet",
    gcp_conn_id="google_cloud_default",
    spreadsheet=SPREADSHEET,
    impersonation_chain=f"projects/-/serviceAccounts/SA@{PROJECT_ID}.iam.gserviceaccount.com",
)

請注意,由於網域範圍委派目前受到大多數 Google 運算子和 Hook 的支援,因此其使用應僅限於 Google Workspace (gsuite) 和行銷平台運算子和 Hook,或透過 GoogleDiscoveryAPI Hook 存取這些服務。在以下用法中已被棄用

此條目是否有幫助?