Google Cloud Functions 操作符¶
先决条件任务¶
要使用这些操作符,您必须执行以下几项操作
使用 Cloud Console 选择或创建一个 Cloud Platform 项目。
为您的项目启用结算,如 Google Cloud 文档中所述。
启用 API,如 Cloud Console 文档中所述。
通过 pip 安装 API 库。
pip install 'apache-airflow[google]'有关详细信息,请参阅 安装。
CloudFunctionDeleteFunctionOperator¶
使用此操作符从 Google Cloud Functions 中删除函数。
有关参数定义,请查看 CloudFunctionDeleteFunctionOperator
。
使用此操作符¶
delete_function = CloudFunctionDeleteFunctionOperator(task_id="delete_function", name=FUNCTION_NAME)
模板化¶
template_fields: Sequence[str] = (
"name",
"gcp_conn_id",
"api_version",
"impersonation_chain",
)
CloudFunctionDeployFunctionOperator¶
使用此操作符将函数部署到 Google Cloud Functions。如果已存在具有此名称的函数,则会将其更新。
有关参数定义,请查看 CloudFunctionDeployFunctionOperator
。
参数¶
创建 DAG 时,可以使用 default_args 字典传递与其他任务通用的参数
default_args: dict[str, Any] = {"retries": 3}
请注意,上述示例中正文和默认参数都不完整。根据设置的变量,传递源代码相关字段的方式可能有所不同。目前,您可以传递 sourceArchiveUrl
、sourceRepository
或 sourceUploadUrl
,如 Cloud Functions API 规范中所述。
此外,default_args
或直接操作符参数可能包含 zip_path
参数,以便在部署之前运行上传源代码的额外步骤。在这种情况下,您还需要在正文中提供一个空的 sourceUploadUrl
参数。
使用此操作符¶
根据参数的组合,函数的源代码可以从不同的来源获取
body = {"name": FUNCTION_NAME, "entryPoint": ENTRYPOINT, "runtime": RUNTIME, "httpsTrigger": {}}
if SOURCE_ARCHIVE_URL:
body["sourceArchiveUrl"] = SOURCE_ARCHIVE_URL
elif SOURCE_REPOSITORY:
body["sourceRepository"] = {"url": SOURCE_REPOSITORY}
elif ZIP_PATH:
body["sourceUploadUrl"] = ""
default_args["zip_path"] = ZIP_PATH
elif SOURCE_UPLOAD_URL:
body["sourceUploadUrl"] = SOURCE_UPLOAD_URL
else:
raise Exception("Please provide one of the source_code parameters")
用于创建操作符的代码
deploy_function = CloudFunctionDeployFunctionOperator(
task_id="deploy_function",
project_id=PROJECT_ID,
location=LOCATION,
body=body,
validate_body=VALIDATE_BODY,
)
您也可以在不使用项目 ID 的情况下创建操作符 - 项目 ID 将从使用的 Google Cloud 连接中检索
deploy_function_no_project = CloudFunctionDeployFunctionOperator(
task_id="deploy_function_no_project", location=LOCATION, body=body, validate_body=VALIDATE_BODY
)
模板化¶
template_fields: Sequence[str] = (
"body",
"project_id",
"location",
"gcp_conn_id",
"api_version",
"impersonation_chain",
)
故障排除¶
如果在部署期间看到类似于以下内容的错误
“HttpError 403: 缺少对资源 [email protected] 的必要权限 iam.serviceAccounts.actAs。请授予 roles/iam.serviceAccountUser 角色。”
这意味着您的服务帐户没有正确的 Cloud IAM 权限。
为您的服务帐户分配 Cloud Functions Developer 角色。
向用户授予 Cloud Functions 运行时服务帐户的 Cloud IAM Service Account User 角色。
下面显示了使用 gcloud
分配 Cloud IAM 权限的典型方法。只需将 PROJECT_ID 替换为您的 Google Cloud 项目的 ID,将 SERVICE_ACCOUNT_EMAIL 替换为您的服务帐户的电子邮件 ID 即可。
gcloud iam service-accounts add-iam-policy-binding \
[email protected] \
--member="serviceAccount:[SERVICE_ACCOUNT_EMAIL]" \
--role="roles/iam.serviceAccountUser"
您也可以通过 Google Cloud Console 执行此操作。
有关详细信息,请参阅向运行时服务添加 IAM 服务代理用户角色。
如果您的函数的源代码在 Google Source Repository 中,请确保您的服务帐户具有 Source Repository Viewer 角色,以便在必要时可以下载源代码。