Google Cloud 連線

Google Cloud 連線型別支援 Google Cloud 整合。

認證到 Google Cloud

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

  1. 使用 Application Default Credentials,

  2. 透過指定 JSON 格式的金鑰檔案來使用 服務賬號。金鑰可以指定為金鑰檔案路徑 (Keyfile Path)、金鑰內容 (Keyfile JSON) 或 Secret Manager 中的 Secret (Keyfile secret name`). 每次只能使用一種方式定義金鑰。如果您需要管理多個金鑰,則應配置多個連線。

  3. 透過指定有效 憑據配置檔案 的路徑或內容。憑據配置檔案是一個通常包含非敏感元資料的檔案,用於指導 google-auth 庫如何檢索外部主題令牌並將其交換為服務賬號訪問令牌。

    警告

    可能需要額外許可權

    使用 Secret Manager 中金鑰的連線要求 Application Default Credentials (ADC) 具有訪問 Secret 內容的許可權。

    注意

    另一種儲存連線的方式

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

預設連線 ID

所有與 Google Cloud 相關的 Hook 和 Operator 預設使用 google_cloud_default

關於 Application Default Credentials 的注意事項

在 Google Compute Engine 上執行 Airflow 時,Application Default Credentials 由 GCE 元資料伺服器推斷;在 GKE 上執行時,由 GKE 元資料伺服器推斷,這允許將 Kubernetes Service Accounts 對映到 GCP 服務賬號 Workload Identity。這在單個 GKE 叢集上管理多個具有不同 IAM 足跡的 Airflow 例項的最低許可權時非常有用。只需為您的 worker / webserver 部署分配 KSA,Workload Identity 就會將它們對映到單獨的 GCP 服務賬號(而不是共享叢集級 GCE 服務賬號)。從安全形度看,它的好處是不將 Google 服務賬號金鑰儲存在磁碟或 Airflow 資料庫中,從而避免敏感的長期憑據金鑰材料洩露。

從 Airflow 的角度來看,可以透過指定一個空 URI 來使用 Application Default Credentials 進行連線。

例如

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

配置連線

專案 ID(可選)

要連線的 Google Cloud 專案 ID。它被使用它的 Operator 用作預設專案 ID,並且通常可以在 Operator 級別覆蓋。

金鑰檔案路徑

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

如果使用 Application Default Credentials 則無需提供。

金鑰檔案 JSON 內容

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

如果使用 Application Default Credentials 則無需提供。

憑據配置檔案

憑據配置檔案的 JSON 內容或檔案系統上的憑據配置檔案路徑。

如果使用 Application Default Credentials 則無需提供。

儲存金鑰檔案 JSON 內容的 Secret 名稱

Secret Manager 中包含 服務賬號 金鑰的 Secret 名稱。

如果使用 Application Default Credentials 則無需提供。

範圍(逗號分隔)

要用於身份認證的逗號分隔的 Google Cloud 範圍 列表。

重試次數

整數,使用隨機指數退避演算法重試的次數。如果所有重試均失敗,googleapiclient.errors.HttpError 表示最後一次請求的錯誤。如果為零(預設),則只嘗試一次請求。

模擬鏈

可選的服務賬號,用於使用短期憑據進行模擬;或者是一系列按鏈式排列的賬號列表,用於獲取列表中最後一個賬號的 access_token,該賬號將在利用此連線的所有請求中被模擬。如果設定為字串,則該賬號必須授予發起賬號 Service Account Token Creator IAM 角色。如果設定為逗號分隔的列表,則列表中的身份必須將 Service Account Token Creator IAM 角色授予緊鄰的前一個身份,列表中第一個賬號將此角色授予發起賬號。

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

  • scheme 部分應等於 google-cloud-platform(注意:查詢連字元)

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

  • query parameters 包含此連線型別特有的資訊。接受以下鍵

    • project - 專案 ID

    • key_path - 金鑰檔案路徑

    • keyfile_dict - 金鑰檔案 JSON 內容

    • key_secret_name - 儲存金鑰檔案 JSON 內容的 Secret 名稱

    • 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 Operator 支援透過 impersonation_chain 引數(對於也與其他雲提供商服務通訊的 Operator 則是 google_impersonation_chain直接模擬服務賬號。模擬鏈也可以直接在 Google Cloud 連線上配置,如上所述,但傳遞給 Operator 的 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 連線中指定的服務賬號 Service Account Token Creator IAM 角色。這將允許生成 impersonated_account 的訪問令牌,從而可以使用其許可權代表其行事。impersonated_account 甚至無需生成金鑰。

對於連線到多個 Google 服務的 Operator,所有 Hook 都使用相同的 impersonation_chain 值(如果適用)。您還可以模擬來自非發起賬號專案中的賬號。在這種情況下,被模擬賬號的專案 ID 將被用作 Operator 邏輯中的預設專案 ID,除非您在連線配置或 Operator 引數中明確指定了專案 ID。

模擬也可以鏈式使用:如果連線中指定的服務賬號被授予對賬號 A 的 Service Account Token Creator 角色,並且賬號 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 Operator、Hook 和 Sensor 還支援域範圍委派。委派允許使用者或服務賬號授予另一個服務賬號代表其行事的能力。這意味著委派許可權的使用者或服務賬號可以繼續訪問和管理自己的資源,而被委派的服務賬號也可以訪問和管理這些資源。

例如

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 Operator 和 Hook 支援域範圍委派,但其使用應僅限於 Google Workspace (gsuite) 和營銷平臺 Operator 和 Hook,或透過 GoogleDiscoveryAPI Hook 訪問這些服務。在以下使用場景中已棄用

此條目有幫助嗎?