migrating-airflow-2-to-3
Apache Airflow 2.x のプロジェクトを Airflow 3.x へ移行するためのガイドスキルです。ユーザーが Airflow 3 への移行・アップグレード・互換性の問題・破壊的変更に言及した場合、またはコードベースのモダナイズを希望する場合に使用してください。Airflow 2.x のコードを検出した際はユーザーに確認を促し、アップグレードのサポートを申し出ること。移行に関するリクエストでは、必ず最初のステップとしてこのスキルを読み込んでください。
description の原文を見る
Guide for migrating Apache Airflow 2.x projects to Airflow 3.x. Use when the user mentions Airflow 3 migration, upgrade, compatibility issues, breaking changes, or wants to modernize their Airflow codebase. If you detect Airflow 2.x code that needs migration, prompt the user and ask if they want you to help upgrade. Always load this skill as the first step for any migration-related request.
SKILL.md 本文
Airflow 2 to 3 移行
このスキルは、Airflow 2.x DAG コードをAirflow 3.xに移行するのに役立ちます。インポート、オペレータ、フック、コンテキスト、API 使用方法などのコード変更に焦点を当てています。
重要: Airflow 3 への移行前に、まず Airflow 2.11 にアップグレードしてから、少なくとも Airflow 3.0.11 へ(理想的には直接 3.1 へ)アップグレードすることを強く推奨します。他のアップグレード経路ではロールバックが不可能になります。参照: https://www.astronomer.io/docs/astro/airflow3/upgrade-af3#upgrade-your-airflow-2-deployment-to-airflow-3。加えて、3.0 の初期バージョンには多くのバグがあります。3.1 の方がはるかに優れた体験が得られます。
移行の概要
- Ruff の Airflow 移行ルールを実行して、検出可能な問題を自動修正します(AIR30/AIR301/AIR302/AIR31/AIR311/AIR312)。
ruff check --preview --select AIR --fix --unsafe-fixes .
reference/migration-checklist.mdの手動検索チェックリストを使用して、残りの問題をスキャンします。- 重点項目: メタデータ DB への直接アクセス、レガシーインポート、スケジューリング/コンテキストキー、XCom pickle、データセット→アセット、REST API/認証、プラグイン、ファイルパス。
- 動作/設定に関する注意点を明示的に確認:
- Cron スケジューリングセマンティクス: Airflow 2 スタイルの cron データ間隔が必要な場合は
AIRFLOW__SCHEDULER__CREATE_CRON_DATA_INTERVAL=Trueの使用を検討してください。 .airflowignoreの構文が正規表現から glob に変更されました。正規表現の動作を維持する必要がある場合はAIRFLOW__CORE__DAG_IGNORE_FILE_SYNTAX=regexpを設定してください。- OAuth コールバック URL は
/auth/プレフィックスが追加されます(例:/auth/oauth-authorized/google)。 - 共有ユーティリティインポート:
dags/common/からのimport commonのようなベアインポートは Astro 上では動作しなくなりました。完全修飾インポートを使用してください:import dags.common。
- Cron スケジューリングセマンティクス: Airflow 2 スタイルの cron データ間隔が必要な場合は
- ファイルおよび問題の種類ごとに変更を計画します:
- インポートの修正 - オペレータ/フック/プロバイダーの更新 - メタデータアクセスのリファクタリング(直接アクセスから Airflow クライアント使用へ) - 古いコンテキスト変数の使用を修正 - スケジューリングロジックの修正。
- 変更を段階的に実装し、重大な変更ごとに Ruff と コード検索を再実行します。
- 変更をユーザーに説明し、リファクタリングされたメタデータ、スケジューリングロジック、Airflow コンテキストの使用など、更新されたロジックをテストするよう注意してください。
アーキテクチャ & メタデータ DB アクセス
Airflow 3 はコンポーネントがメタデータベースと通信する方法を変更します:
- ワーカーはメタデータ DB に直接接続しなくなりました。
- タスクコードは API サーバーが公開するタスク実行 API経由で実行されます。
- DAG プロセッサはスケジューラから独立したプロセスとして実行されます。
- Triggerer はインプロセス API サーバー経由でタスク実行メカニズムを使用します。
Trigger 実装の注意点: トリガーが asyncio イベントループ内でフックを同期的に呼び出す場合、失敗またはブロックする可能性があります。sync_to_async(...) 経由でフックを呼び出すことを優先してください(またはフック呼び出しが非同期安全であることを確認してください)。
主要なコード影響: タスクコードは引き続き ORM セッション/モデルをインポートできますが、メタデータ DB と通信するためにそれらを使用しようとしると失敗します:
RuntimeError: Direct database access via the ORM is not allowed in Airflow 3.x
検索パターン
DAG、カスタムオペレータ、および @task 関数をスキャンするときは、以下を探します:
- セッションヘルパー:
provide_session、create_session、@provide_session - 設定からのセッション:
from airflow.settings import Session - エンジンアクセス:
from airflow.settings import engine - モデルでの ORM 使用:
session.query(DagModel)...、session.query(DagRun)...
置換: Airflow Python クライアント
豊富なメタデータアクセスパターン向けに推奨されます。requirements.txt に追加:
apache-airflow-client==<your-airflow-runtime-version>
使用例:
import os
from airflow.sdk import BaseOperator
import airflow_client.client
from airflow_client.client.api.dag_api import DAGApi
_HOST = os.getenv("AIRFLOW__API__BASE_URL", "https://<your-org>.astronomer.run/<deployment>/")
_TOKEN = os.getenv("DEPLOYMENT_API_TOKEN")
class ListDagsOperator(BaseOperator):
def execute(self, context):
config = airflow_client.client.Configuration(host=_HOST, access_token=_TOKEN)
with airflow_client.client.ApiClient(config) as api_client:
dag_api = DAGApi(api_client)
dags = dag_api.get_dags(limit=10)
self.log.info("Found %d DAGs", len(dags.dags))
置換: 直接 REST API 呼び出し
単純なケースの場合は、requests を使用して REST API を直接呼び出します:
from airflow.sdk import task
import os
import requests
_HOST = os.getenv("AIRFLOW__API__BASE_URL", "https://<your-org>.astronomer.run/<deployment>/")
_TOKEN = os.getenv("DEPLOYMENT_API_TOKEN")
@task
def list_dags_via_api() -> None:
response = requests.get(
f"{_HOST}/api/v2/dags",
headers={"Accept": "application/json", "Authorization": f"Bearer {_TOKEN}"},
params={"limit": 10}
)
response.raise_for_status()
print(response.json())
Ruff Airflow 移行ルール
Ruff の Airflow ルールを使用して、多くの破壊的変更を自動的に検出および修正します。
- AIR30 / AIR301 / AIR302: Airflow 3 で削除されたコードおよびインポート - 必ず修正してください。
- AIR31 / AIR311 / AIR312: 非推奨のコードおよびインポート - まだ動作しますが、将来のバージョンで削除されます。修正すべきです。
プロジェクトルートに対して実行するコマンド(uv 経由):
# 検出可能なすべての Airflow 問題を自動修正(安全 + 不安全)
ruff check --preview --select AIR --fix --unsafe-fixes .
# 修正せずに残りの Airflow 問題をチェック
ruff check --preview --select AIR .
リファレンスファイル
詳細なコード例と移行パターンについては、以下を参照してください:
reference/config-changes.md-airflow.cfgセクションの移動、名前変更、削除reference/migration-patterns.md- インポート、スケジューリング、XCom、アセット、DAG バンドル、ランタイム動作変更のコード例reference/removed-methods.md- 削除されたモデルメソッドと SDK/API 移行パスreference/migration-checklist.md- Ruff がキャッチしない問題の検索パターンと修正
クイックリファレンステーブル
主要なインポート変更
| Airflow 2.x | Airflow 3 |
|---|---|
airflow.operators.dummy_operator.DummyOperator | airflow.providers.standard.operators.empty.EmptyOperator |
airflow.operators.bash.BashOperator | airflow.providers.standard.operators.bash.BashOperator |
airflow.operators.python.PythonOperator | airflow.providers.standard.operators.python.PythonOperator |
airflow.decorators.dag | airflow.sdk.dag |
airflow.decorators.task | airflow.sdk.task |
airflow.datasets.Dataset | airflow.sdk.Asset |
コンテキストキーの変更
| 削除されたキー | 置換 |
|---|---|
execution_date | context["dag_run"].logical_date |
tomorrow_ds / yesterday_ds | ds と日付計算を使用: macros.ds_add(ds, 1) / macros.ds_add(ds, -1) |
prev_ds / next_ds | prev_start_date_success またはタイムテーブル API |
triggering_dataset_events | triggering_asset_events |
templates_dict | context["params"] |
アセットトリガーされた実行: logical_date は None である可能性があります。context["dag_run"].logical_date を防御的に使用してください。
将来の logical_date でトリガーできない: logical_date=None を使用し、代わりに run_id に依存してください。
Cron 注記: cron を使用したスケジュール実行の場合、CronTriggerTimetable の下では logical_date セマンティクスが異なります(logical_date を run_after に配置)。Airflow 2 スタイルの cron データ間隔が必要な場合は、AIRFLOW__SCHEDULER__CREATE_CRON_DATA_INTERVAL=True の使用を検討してください。
デフォルト動作の変更
| 設定 | Airflow 2 デフォルト | Airflow 3 デフォルト |
|---|---|---|
schedule | timedelta(days=1) | None |
catchup | True | False |
コールバック動作の変更
on_success_callbackはスキップ時に実行されなくなりました。スキップ時が必要な場合はon_skipped_callbackを使用してください。TriggerRule.ALWAYSを持つ@teardownは許可されていません。テアダウンは DAG 実行が早期に終了した場合でも実行されます。
リソース
関連スキル
- testing-dags: 移行後の DAG テスト用
- debugging-dags: 移行問題のトラブルシューティング用
- deploying-airflow: 移行された DAG の本番環境へのデプロイ用
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- astronomer
- リポジトリ
- astronomer/agents
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/astronomer/agents / ライセンス: Apache-2.0
関連スキル
agent-browser
AI エージェント向けのブラウザ自動化 CLI です。ウェブサイトとの対話が必要な場合に使用します。ページ遷移、フォーム入力、ボタンクリック、スクリーンショット取得、データ抽出、ウェブアプリのテスト、ブラウザ操作の自動化など、あらゆるブラウザタスクに対応できます。「ウェブサイトを開く」「フォームに記入する」「ボタンをクリックする」「スクリーンショットを取得する」「ページからデータを抽出する」「このウェブアプリをテストする」「サイトにログインする」「ブラウザ操作を自動化する」といった要求や、プログラマティックなウェブ操作が必要なタスクで起動します。
anyskill
AnySkill — あなたのプライベート・スキルクラウド。GitHubを基盤としたリポジトリからエージェントスキルを管理、同期、動的にロードできます。自然言語でクラウドスキルを検索し、オンデマンドでプロンプトを自動ロード、カスタムスキルのアップロードと共有、スキルバンドルの一括インストールが可能です。OpenClaw、Antigravity、Claude Code、Cursorに対応しています。
engram
AIエージェント向けの永続的なメモリシステムです。バグ修正、意思決定、発見、設定変更の後はmem_saveを使用してください。ユーザーが「覚えている」「記憶している」と言及した場合、または以前のセッションと重複する作業を開始する際はmem_searchを使用します。セッション終了前にmem_session_summaryを使用して、コンテキストを保持してください。
skyvern
AI駆動のブラウザ自動化により、任意のウェブサイトを自動化できます。フォーム入力、データ抽出、ファイルダウンロード、ログイン、複数ステップのワークフロー実行など、ユーザーがウェブサイトと連携する必要があるときに使用します。Skyvernは、LLMとコンピュータビジョンを活用して、未知のサイトも自動操作可能です。Python SDK、TypeScript SDK、REST API、MCPサーバー、またはCLIを通じて統合できます。
pinchbench
PinchBenchベンチマークを実行して、OpenClawエージェントの実世界タスクにおけるパフォーマンスを評価できます。モデルの機能テスト、モデル間の比較、ベンチマーク結果のリーダーボード提出、またはOpenClawのセットアップがカレンダー、メール、リサーチ、コーディング、複数ステップのワークフローにどの程度対応しているかを確認する際に使用します。
openui
OpenUIとOpenUI Langを使用してジェネレーティブUIアプリを構築できます。これらはLLM生成インターフェースのためのトークン効率的なオープン標準です。OpenUI、@openuidev、ジェネレーティブUI、LLMからのストリーミングUI、AI向けコンポーネントライブラリ、またはjson-render/A2UIの置き換えについて述べる際に使用します。スキャフォルディング、defineComponent、システムプロンプト、Renderer、およびOpenUI Lang出力のデバッグに対応しています。