如何从跨项目Cloud Run服务认证调用Cloud Composer Airflow REST API
跨项目Cloud Run调用Cloud Composer Airflow API触发DAG(无库实现)
一、前置权限配置
- 给Cloud Run的服务账号绑定roles/airflow.admin(或更细粒度的权限,比如仅允许触发DAG的自定义权限),在Composer所在项目中添加该服务账号为成员。
- 在IAP控制台中,找到Composer Airflow UI对应的资源(URL为你的Composer Airflow地址),将Cloud Run的服务账号添加为成员,授予IAP-secured Web App User角色。
二、获取认证令牌(Cloud Run环境专属,无需本地凭证)
在Cloud Run容器内,直接向GCP元数据服务器请求针对IAP受众的ID Token:
GET http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=<IAP_CLIENT_ID> Host: metadata.google.internal Metadata-Flavor: Google
- 替换
<IAP_CLIENT_ID>为你的Composer Airflow对应的IAP客户端ID,可通过gcloud composer environments describe <ENV_NAME> --location <REGION>命令查看,或在Composer环境详情页的「Airflow UI」板块找到。 - 请求返回的ID Token有效期为1小时,可直接用于后续API认证。
三、构造触发DAG的HTTP请求
Airflow API触发DAG的端点格式:https://<COMPOSER_AIRFLOW_URL>/api/v1/dags/<DAG_ID>/dagRuns
- 替换
<COMPOSER_AIRFLOW_URL>为你的Composer Airflow UI地址(去掉末尾的/admin后缀),<DAG_ID>为目标DAG的ID。
请求参数
- 方法:POST
- 请求头:
Authorization: Bearer <ID_TOKEN>(填入第二步获取的ID Token)Content-Type: application/json
- 请求体(JSON格式,可选传递DAG运行参数):
{ "conf": { "custom_param1": "value1", "custom_param2": "value2" } }
完整请求示例
POST https://example-composer-abcdef.cloud.google.com/api/v1/dags/my_test_dag/dagRuns Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ij... Content-Type: application/json { "conf": { "batch_id": "20240520_001" } }
四、非Cloud Run环境无库生成令牌(本地/第三方环境)
如果需要在非GCP环境手动构造认证流程,步骤如下:
- 从GCP控制台下载服务账号JSON密钥,提取
private_key、client_email、token_uri(默认值为https://oauth2.googleapis.com/token)。 - 构造JWT:
- Header:
{"alg": "RS256", "typ": "JWT"} - Payload:
{ "iss": "<CLIENT_EMAIL>", "aud": "<TOKEN_URI>", "target_audience": "<IAP_CLIENT_ID>", "exp": <当前时间戳+3600>, "iat": <当前时间戳> }
- Header:
- 用RS256算法,使用服务账号私钥对JWT进行签名。
- 向
token_uri发送POST请求换取ID Token:
返回结果中的POST https://oauth2.googleapis.com/token Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=<签名后的JWT>id_token即为IAP认证令牌,后续步骤同第三步。
五、注意事项
- 跨项目权限需双向配置:Composer所在项目要允许Cloud Run服务账号访问,IAP访问控制列表必须包含该服务账号。
- 若无需传递参数,请求体可简化为
{}。 - 确认Composer环境的Airflow版本支持v1 API(Airflow 2.x默认兼容)。
内容的提问来源于stack exchange,提问作者Alexandre Schaffner
相关产品推荐
相关产品推荐

