Google Cloud 连接¶
Google Cloud 连接类型启用 Google Cloud 集成。
向 Google Cloud 身份验证¶
使用 Airflow 连接到 Google Cloud 的方法有三种
使用 应用程序默认凭据,
通过指定 JSON 格式的密钥文件来使用 服务帐户。密钥可以指定为密钥文件路径 (
密钥文件 路径
),作为密钥有效负载 (密钥文件 JSON
) 或作为 Secret Manager 中的机密 (密钥文件 机密 名称
)。一次只能使用一种定义密钥的方法。如果您需要管理多个密钥,则应配置多个连接。使用凭据配置文件,通过指定有效凭据配置文件的路径或内容。凭据配置文件是一个配置文件,通常包含非敏感元数据,用于指示
google-auth
库如何检索外部主体令牌并将其交换为服务帐号访问令牌。警告
可能需要其他权限
使用 Secret Manager 中密钥的连接要求应用程序默认凭据 (ADC) 具有访问机密有效负载的权限。
注意
存储连接的替代方法
除了仅在 Secret Manager 中存储密钥之外,还可以选择存储整个连接。有关更多详细信息,请参阅Google Secret Manager 后端。
默认连接 ID¶
所有与 Google Cloud 相关的钩子和运算符默认使用google_cloud_default
。
关于应用程序默认凭据的说明¶
在 Google Compute Engine 上运行 Airflow 时,应用程序默认凭据由 GCE 元数据服务器推断,在 GKE 上运行时由 GKE 元数据服务器推断,这允许将 Kubernetes 服务帐号映射到 GCP 服务帐号工作负载身份。当在单个 GKE 集群上管理多个 Airflow 实例的最小权限时,这非常有用,每个实例都有不同的 IAM 占用空间。只需为你的工作程序/Web 服务器部署分配 KSA,工作负载身份就会将它们映射到单独的 GCP 服务帐号(而不是共享集群级 GCE 服务帐号)。从安全角度来看,它具有不将 Google 服务帐号密钥存储在磁盘或 Airflow 数据库中的优点,从而不可能泄露敏感的长寿命凭据密钥材料。
从 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
表示最后一次请求。如果为零(默认值),则我们只尝试请求一次。- 模拟链
使用短期凭据模拟的可选服务帐户,或获取列表中最后一个帐户的访问令牌所需的帐户的链接列表,该帐户将在利用此连接的所有请求中模拟。如果设置为字符串,则该帐户必须授予原始帐户服务帐户令牌创建者 IAM 角色。如果设置为以逗号分隔的列表,则列表中的身份必须向直接前面的身份授予服务帐户令牌创建者 IAM 角色,列表中的第一个帐户向原始帐户授予此角色。
在环境变量中指定连接时,应使用 URI 语法指定它,并满足以下要求
scheme 部分应等于
google-cloud-platform
(注意:查找连字符)权限(用户名、密码、主机、端口)、路径被忽略
查询参数包含特定于此类型的连接的信息。接受以下键
project
- 项目 IDkey_path
- 密钥文件路径keyfile_dict
- 密钥文件 JSONkey_secret_name
- 保存密钥文件 JSON 的密钥名称key_secret_project_id
- 存储密钥文件 JSON 的项目 IDscope
- 范围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
甚至不需要生成密钥。
警告
DataflowCreateJavaJobOperator
和 DataflowCreatePythonJobOperator
目前不支持直接模拟。
对于连接到多个 Google 服务的运算符,所有挂钩都使用相同的 impersonation_chain
值(如果适用)。你还可以模拟来自原始帐户项目以外的项目的帐户。在这种情况下,除非你在连接配置或运算符参数中明确指定了项目 ID,否则模拟帐户的项目 ID 将用作运算符逻辑中的默认项目 ID。
模拟还可以用于链中:如果在连接中指定的 service 帐号在帐号 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 运算符、挂钩和传感器还支持 全域委托。委托允许用户或服务帐号授予另一个服务帐号代表他们执行操作的能力。这意味着委派其权限的用户或服务帐号可以继续访问和管理其自己的资源,而被委派的 service 帐号也可以访问和管理这些资源。
例如
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,
delegate_to=f"projects/-/serviceAccounts/SA@{PROJECT_ID}.iam.gserviceaccount.com",
)
请注意,由于大多数 Google 运算符和挂钩目前都支持全域委托,因此其使用应仅限于 Google Workspace (gsuite) 和营销平台运算符和挂钩,或通过 GoogleDiscoveryAPI 挂钩访问这些服务。它在以下用法中已弃用
所有 Google Cloud 运算符和挂钩。
Firebase 挂钩。
涉及不同提供商中的 Google Cloud 的所有传输运算符,例如:
airflow.providers.amazon.aws.transfers.gcs_to_s3.GCSToS3Operator
。