关于 managed-airflow-migrations
帮助将 Managed Service for Apache Airflow 的 DAG 调整为兼容 Airflow 2.11.1 或 Airflow 3 的迁移技能,面向维护现有 Airflow 工作流的团队。它涵盖依赖项变化、代码扫描与修复,并将部署和验证限定在明确提出请求时。
主要功能
- 01梳理目标版本的依赖变化
- 02扫描 DAG 中的兼容性问题
- 03提供常见代码迁移建议
- 04支持 Airflow 3 迁移检查
- 05按请求执行部署与验证
适用场景
- 01升级 DAG 至 Airflow 2.11.1
- 02将 Airflow 2 工作流迁移至 Airflow 3
- 03部署前检查 DAG 兼容问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ google/ skills --skill managed-airflow-migrations安装后在 Claude Code 中输入/managed-airflow-migrations确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/airflow-3.mdattribution.mdenvironment-inspection.mdlocal-development-environment.md详细介绍
Managed Service for Apache Airflow(原名 Cloud Composer)迁移指南
本技能将指导你调整现有 Managed Service for Apache Airflow(原名 Cloud Composer)环境中的 DAG(或本地可用的 DAG),使其兼容 Airflow 2.11.1(MSAA Gen 2 或 3)或 Airflow 3(MSAA Gen 3)。
归属声明
必须阅读:执行任何 gcloud、REST API 或 MCP 命令之前,必须先阅读
使用归属声明。对于直接在终端中执行的命令(绝不用于生成的脚本、Terraform 或用户代码),请在 gcloud 前加上
CLOUDSDK_METRICS_REQUEST_ATTRIBUTION="agent-skills/1.0 (skill:managed-airflow-migrations)"
并在 User-Agent 标头中追加 agent-skills/1.0 (skill:managed-airflow-migrations)。
阶段 1:发现与下载
进行任何更改之前,仅在明确要求时下载现有 DAG 文件。仅在明确要求时检查源环境以确认源版本。有关环境检查和文件下载的详细说明,请参阅 references/environment-inspection.md。
阶段 2:目标版本与依赖映射
2.1 Airflow 2.11.1+ 依赖映射
如果要迁移到 Airflow 2.11.1(MSAA Gen 2)或 Airflow 3,请使用下方列表追踪关键依赖项的版本演进。该列表涵盖升级到 Airflow 2.11.1 所需的变更。从 Airflow 2(早于 2.11.1)迁移到 Airflow 3 时,请一并考虑这些变更。
Composer 2.10.0(Airflow 2.10.2)
- Google Provider:
10.26.0 - SSH Provider:
3.14.0 - HTTP Provider:
4.13.3 - 破坏性变更:有完整文档说明的最早源版本基线。
Composer 2.15.3(Airflow 2.10.5)
- Google Provider:
18.0.0 - SSH Provider:
4.1.4 - HTTP Provider:
5.3.4 - 破坏性变更:
- **SSH Provider 4.0.0:**移除了 Hook 的
timeout;get_conn()使用上下文管理器。 - HTTP Provider 5.0.0:
SimpleHttpOperator->HttpOperator。 - **Google Provider 11.0.0:**移除了
BigQueryExecuteQueryOperator。 - **Google Provider 12.0.0:**移除了旧版 Data Pipeline 运算符。
- **Google Provider 13.0.0:**移除了
AutoMLBatchPredictOperator。 - **Google Provider 17.0.0:**移除了
BigQueryCreateEmptyTableOperator和BigQueryCreateExternalTableOperator;移除了 Life Sciences 运算符。 - **Google Provider 18.0.0:**移除了旧版 DV360 运算符。
- **SSH Provider 4.0.0:**移除了 Hook 的
Composer 2.16.1(Airflow 2.10.5)
- Google Provider:
19.0.0 - SSH Provider:
4.1.6 - HTTP Provider:
5.5.0 - 破坏性变更:**Google Provider 19.0.0:**移除了 AutoML 运算符(改用 Vertex AI)。
Composer 2.17.0(目标 Airflow 2.11.1)
- Google Provider:
20.0.0 - SSH Provider:
5.0.0 - HTTP Provider:
6.0.2 - 破坏性变更:
- **SSH Provider 5.0.0:**移除了
sshtunnel(改用原生隧道)。 - **HTTP Provider 6.0.0:**JSON 序列化。
- **Google Provider 20.0.0:**ADLS Gen2 迁移。
- **SSH Provider 5.0.0:**移除了
2.2 Airflow 3 迁移
如果要迁移到 Airflow 3(MSAA Gen 3),请注意这属于主版本升级,会带来重大变更,包括:
- 解耦 Task SDK(导入路径从
airflow改为airflow.sdk)。 - 移除直接访问元数据数据库的方式。
- 将
Dataset重命名为Asset。 - 移除 SubDAG 和 SLA。
- 上下文变量的可用性发生变化。
请一并考虑 Airflow 2 中所有适用的变更(例如,从 Airflow 2.10.2 迁移时,先应用升级到 Airflow 2.11.1 所需的变更,再叠加 Airflow 3 迁移变更)。
阶段 3:分析与修复(扫描已下载的文件)
从本地工作区根目录运行扫描命令
(除非另有说明,否则为 ./migration_workspace)。
3.1 Airflow 2.11.1 核心与依赖项检查
如果要迁移到 Airflow 2.11.1+(迁移到 Airflow 3 的中间步骤),请使用这些扫描。
3.1.1 数据集调度(Airflow 2.11.0)
- 变更: 仅当 DAG 未暂停时发生事件,按数据集调度的 DAG 才会触发。
- 扫描命令:
grep -rn "Dataset(" ./dags - 修复: 必须记录这些 DAG 必须保持未暂停状态才能捕获事件,或计划通过手动触发来补跑。
3.1.2 描述中的 HTML(Airflow 2.11.0)
-
变更: DAG 文档 / 参数中的原始 HTML 默认会被转义。
-
扫描命令:
grep -rn -E "doc_md.*<|doc_md.*>|description.*<|description.*>" ./dags -
修复: 将 HTML 转换为 Markdown,或在目标环境中设置
AIRFLOW__WEBSERVER__ALLOW_RAW_HTML_DESCRIPTIONS=True。
3.1.3 拆除任务(Airflow 2.10.5)
- 变更: 将 DAG 标记为失败时,拆除任务始终会运行。
- 扫描命令:
grep -rn "as_teardown" ./dags - 修复: 确保拆除任务具备幂等性。
3.1.4 Pendulum 3 升级(Airflow 2.11.0)
-
变更:
Period已重命名为Interval,测试辅助工具已移除。 -
扫描命令(代码):
grep -rn -E "pendulum\.Period|pendulum\.period" ./dags -
扫描命令(测试):
grep -rn -E "\.test\(|set_test_now\(" ./tests 2>/dev/null || true -
修复: 将
Period替换为Interval,并将period(...)替换为interval(...)。
3.2 路径 A:Airflow 2.11.1 Provider 软件包扫描
3.2.1 SSH Provider(SSH 4.0.0 和 5.0.0)
- 扫描命令(超时):
grep -rn "SSHHook" ./dags | grep "timeout" - 扫描命令(上下文管理器):
grep -rn "with SSHHook" ./dags - 扫描命令(隧道属性):
grep -rn "\.get_tunnel" ./dags - 修复:
- 将
SSHHook中的timeout替换为conn_timeout。 - 将
with hook as conn:替换为with hook.get_conn() as conn:。 - 将
get_tunnel()用作上下文管理器:with hook.get_tunnel(...) as tunnel:。
- 将
3.2.2 HTTP Provider(HTTP 5.0.0 和 6.0.0)
- 扫描命令:
grep -rn "SimpleHttpOperator" ./dags - 修复: 将
SimpleHttpOperator替换为HttpOperator。
3.2.3 Google 提供商(v11 到 v20)
-
扫描命令(BigQuery 查询):
grep -rn "BigQueryExecuteQueryOperator" ./dags- 修复方法: 替换为
BigQueryInsertJobOperator(使用configuration字典)。
- 修复方法: 替换为
-
扫描命令(BigQuery 表):
grep -rn -E "BigQueryCreateEmptyTableOperator|BigQueryCreateExternalTableOperator" ./dags- 修复方法: 替换为
BigQueryCreateTableOperator(使用table_resource字典)。
- 修复方法: 替换为
-
扫描命令(AutoML):
grep -rn -E "AutoMLTrainModelOperator|AutoMLPredictOperator|AutoMLCreateDatasetOperator|AutoMLBatchPredictOperator" ./dags- 修复方法: 迁移到 Vertex AI 运算符。
-
扫描命令(Dataflow):
grep -rn -E "CreateDataPipelineOperator|RunDataPipelineOperator" ./dags- 修复方法: 替换为
DataflowCreatePipelineOperator/DataflowRunPipelineOperator。
- 修复方法: 替换为
-
扫描命令(Life Sciences):
grep -rn "LifeSciencesRunPipelineOperator" ./dags`- 修复方法: 迁移到 Google Cloud Batch 运算符
(
BatchCreateJobOperator)。
- 修复方法: 迁移到 Google Cloud Batch 运算符
(
-
扫描命令(ADLS 到 GCS):
grep -rn "ADLSToGCSOperator" ./dags- 修复方法: 确保提供了
file_system_name。
- 修复方法: 确保提供了
3.3 Airflow 3 迁移检查
迁移到 Airflow 3 时,请使用 references/airflow-3.md 中的说明。
阶段 4:部署与验证
仅在明确要求时执行部署和验证步骤。
4.1 静态验证(迁移到 Airflow 3 时)
应用 Airflow 3 的代码更改后,请验证语法是否正确。如果开发环境中有相应工具,请运行静态 lint 检查:
ruff check {target_dag_file} --select AIR30
在最终定稿前,解决所有报告的弃用警告。如果没有 ruff,建议安装一个。
4.2 部署到 MSAA
4.2.1 获取目标 GCS 存储桶路径(仅在请求时)
gcloud composer environments describe <TARGET_ENV> \
--location <TARGET_REGION> \
--format="value(config.dagGcsPrefix)"
预期输出: gs://<target-bucket-name>/dags
4.2 上传修改后的 DAG 和存储桶依赖项(仅在请求时)
仅在明确要求时执行此步骤。 将修改后的 DAG 和所有已备份的存储桶依赖项从本地工作区复制到目标 GCS 存储桶。如果跳过了检查步骤,请确保使用了正确的 <target-bucket-name>。
-
上传 DAG:
gcloud storage cp -r ./dags/* gs://<target-bucket-name>/dags/ -
上传其他存储桶依赖项(如适用):
gcloud storage cp -r ./migration_workspace/<dependency-folder> gs://<target-bucket-name>/<dependency-folder>
4.3 通过 Airflow CLI 验证 DAG
仅当明确要求将修改后的 DAG 上传到目标环境时,才执行此步骤(并在上传后执行)。
你可以使用 Airflow CLI 验证 DAG 是否已成功上传、解析并由目标环境中的 Airflow 调度器注册。
-
列出已注册的 DAG: 运行以下命令,列出目标环境中所有已注册的 DAG。确认迁移后的 DAG 出现在此列表中。
gcloud composer environments run <TARGET_ENV> \ --location <TARGET_REGION> \ dags list -
检查导入错误: 如果列表中缺少某些 DAG,或要确保没有解析问题,请检查导入错误:
gcloud composer environments run <TARGET_ENV> \ --location <TARGET_REGION> \ dags list-import-errors预期输出:
- 如果没有错误,命令将输出
No data found。 - 如果有错误,将列出文件路径和错误的回溯信息。
- 如果没有错误,命令将输出
注意:Airflow 调度器可能需要几分钟才能解析新文件,并让更改反映在这些命令的结果中。
4.4 在 Cloud Logging 中验证
仅当明确要求将修改后的 DAG 上传到目标环境时,才执行此步骤(并在上传后执行)。 监控目标环境的 Cloud Logging,以检测任何运行时错误或导入错误。
在 GCP Cloud Logging Console 中运行以下查询(或通过 gcloud logging read 运行):
resource.type="cloud_composer_environment"
resource.labels.environment_name="<TARGET_ENV>"
log_id("airflow-scheduler")
severity>=ERROR
附录:本地环境验证
如果你想在部署到目标环境之前在本地验证更改,可以使用 Composer Local Development CLI 工具
(composer-dev)。请参考
references/local-development-environment.md,
了解如何与本地开发环境交互。