Google Cloud 连接¶
Google Cloud 连接类型启用 Google Cloud 集成。
身份验证到 Google Cloud¶
有三种方法可以使用 Airflow 连接到 Google Cloud
使用 应用程序默认凭据,
通过在 JSON 格式中指定密钥文件来使用服务帐户。密钥可以指定为密钥文件的路径(
Keyfile Path
)、密钥有效负载(Keyfile JSON
)或密钥管理器中的密钥(Keyfile secret name
)。一次只能使用一种定义密钥的方式。如果您需要管理多个密钥,则应配置多个连接。通过指定有效凭据配置文件的路径或内容,使用凭据配置文件。凭据配置文件是一个配置文件,通常包含非敏感元数据,以指示
google-auth
库如何检索外部主题令牌并将其交换为服务帐户访问令牌。警告
可能需要额外的权限
使用密钥管理器中密钥的连接需要 应用程序默认凭据 (ADC) 具有访问密钥有效负载的权限。
注意
存储连接的替代方法
除了仅在密钥管理器中存储密钥外,还可以选择存储整个连接。有关更多详细信息,请查看Google Secret Manager 后端。
默认连接 ID¶
所有与 Google Cloud 相关的钩子和运算符默认使用 google_cloud_default
。
关于应用程序默认凭据的说明¶
当在 Google Compute Engine 上运行 Airflow 时,应用程序默认凭据由 GCE 元数据服务器推断,或者当在 GKE 上运行时,由 GKE 元数据服务器推断,这允许将 Kubernetes 服务帐户映射到 GCP 服务帐户 工作负载身份。当在单个 GKE 集群上管理多个具有不同 IAM 占用空间的 Airflow 实例的最小权限时,这非常有用。只需为您的 worker/webserver 部署分配 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 的密钥名称
密钥管理器中包含 服务帐户密钥的密钥名称。
如果使用应用程序默认凭据,则不是必需的。
- 作用域(逗号分隔)
用于进行身份验证的逗号分隔的Google Cloud 作用域列表。
- 重试次数
整数,使用随机指数退避重试的次数。如果所有重试都失败,则
googleapiclient.errors.HttpError
表示最后一个请求。如果为零(默认),我们只尝试一次请求。- 模拟链
可选的服务帐户,用于使用短期凭据进行模拟,或者用于获取列表中最后一个帐户的 access_token 的帐户链表,该帐户将在利用此连接的所有请求中被模拟。如果设置为字符串,则该帐户必须授予原始帐户服务帐户令牌创建者 IAM 角色。如果设置为逗号分隔的列表,则列表中标识必须将服务帐户令牌创建者 IAM 角色授予直接前面的标识,并且列表中的第一个帐户将此角色授予原始帐户。
在环境变量中指定连接时,应使用 URI 语法指定,并满足以下要求
scheme 部分应等于
google-cloud-platform
(注意:查找连字符)忽略 authority(用户名、密码、主机、端口)和路径
查询参数包含此连接类型特定的信息。接受以下键
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
必须授予 Service Account Token Creator
IAM 角色给 google_cloud_default
连接中指定的服务帐户。这将允许生成 impersonated_account
的访问令牌,该令牌将允许使用其权限代表其执行操作。impersonated_account
甚至不需要生成密钥。
对于连接到多个 Google 服务的运算符,所有钩子都使用相同的 impersonation_chain
值(如果适用)。您还可以模拟来自原始帐户项目之外的项目的帐户。在这种情况下,除非您已在连接的配置或运算符的参数中显式指定项目 ID,否则模拟帐户的项目 ID 将用作运算符逻辑中的默认项目 ID。
模拟也可以在链中使用:如果在 Connection 中指定的服务帐户在帐户 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 运算符、钩子和传感器还支持 域范围委托。委托允许用户或服务帐户授予另一个服务帐户代表其执行操作的能力。这意味着委托其权限的用户或服务帐户可以继续访问和管理自己的资源,而委托的服务帐户也可以访问和管理这些资源。
例如
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 运算符和钩子当前都支持域范围委托,因此其用法应仅限于 Google Workspace (gsuite) 和营销平台运算符和钩子,或通过 GoogleDiscoveryAPI 钩子访问这些服务。它在以下用法中已弃用
所有 Google Cloud 运算符和钩子。
Firebase 钩子。
所有涉及不同提供商中 Google Cloud 的传输操作符,例如:
airflow.providers.amazon.aws.transfers.gcs_to_s3.GCSToS3Operator
。