Amazon Web Services ブログ
Amazon MWAA Serverless で PythonOperator と BashOperator が利用可能に
本記事は 2026 年 8 月 25 日 に公開された「PythonOperator and BashOperator Now Available on Amazon Managed Workflows for Apache Airflow (Amazon MWAA) Serverless」を翻訳したものです。翻訳はクラウドサポートエンジニアの山本が担当しました。
Amazon MWAA Serverless で Apache Airflow ワークフローを実行している場合、PythonOperator と BashOperator を使ってカスタムコードをサーバーレスランタイム上で直接実行できるようになりました。これまで Amazon Managed Workflows for Apache Airflow (Amazon MWAA) Serverless では、オペレーター経由で AWS サービスをオーケストレーションし、タスクのスケジューリング、依存関係の管理、リトライ処理を行うことしかできず、独自の Python 関数やシェルスクリプトをネイティブに実行できませんでした。カスタムの Python ロジックやシェルコマンドが必要な場合は、コードを AWS Lambda 関数にラップしたり、Amazon Elastic Container Service (Amazon ECS) タスクを起動したり、ほかの AWS コンピューティングサービスを使う必要がありました。こうした代替手段では、オーケストレーションパイプラインの複雑さ、コスト、レイテンシーが増えます。
今回の機能追加により、インフラストラクチャを追加せずに、サーバーレスタスクランタイム内でカスタムの Python 関数やシェルスクリプトを直接実行できます。つまり、多くのデータエンジニアリングチームが ETL パイプラインやデータ品質チェックで利用している PythonOperator と BashOperator を、コンピューティングリソースを追加でプロビジョニングせずに使えます。
本記事では、新機能の仕組みを解説し、実践的な例を示します。PythonOperator で CSV ファイルを JSON 形式に変換し、BashOperator で出力を検証するサーバーレスパイプラインを構築します。読み終えると、次のことができるようになります。
- 依存関係を含む Python モジュールをパッケージ化し、コードバンドルとして Amazon Simple Storage Service (Amazon S3) バケットにアップロードする
- dag-factory 互換の YAML で複数タスクのワークフローを定義する
- AWS Command Line Interface (AWS CLI) でワークフローを作成して実行する
- パイプラインが期待どおりの出力を生成したことを検証する
仕組み
MWAA Serverless では、カスタムコードをパッケージ化して Amazon S3 バケットにアップロードし、ワークフロー作成時に参照します。サービスはワークフロー作成時点のコードをスナップショットとして取得し、以降は同じワークフローバージョンのすべての実行でそのスナップショットを使います。
コードバンドル
コードバンドルは、カスタムロジックを含むパッケージです。Python モジュールやシェルスクリプトをパッケージ化して Amazon S3 バケットにアップロードします。コードバンドルの形式は次のいずれかです。
- 単一の .py ファイルまたは .sh の bash スクリプト (Amazon S3 バケットにアップロード)
- 複数のシェルスクリプト、Python モジュール、依存関係を含む ZIP アーカイブ (最大 250 MB)
実行モデル
ワークフローを作成または更新すると、MWAA Serverless は指定した Amazon S3 バケットからコードバンドルのスナップショットを取得し、サービス側に保存します。タスク実行時には、Amazon S3 バケットに現在置かれているオブジェクトではなく、このスナップショットを使って隔離されたランタイム環境でコードを実行します。
Python タスクと Bash タスクはインターネットにアクセスできません。到達できるのは、ランタイムの動作に必要な Amazon S3、Amazon Elastic Container Registry (Amazon ECR)、Amazon CloudWatch だけです。インターネットアクセスが必要な場合は、ワークフローに Amazon VPC を設定して、その VPC 経由で通信させてください。
サポートされるオペレーター
MWAA Serverless で利用できるようになった 2 つのオペレーターは次のとおりです。
| オペレーター | 説明 |
| PythonOperator | コードバンドル内の Python の呼び出し可能オブジェクト (関数) を実行します |
| BashOperator | シェルコマンドやスクリプトを実行します |
セキュリティ
コードバンドルは AWS Key Management Service (AWS KMS) で保存時に暗号化されます。ワークフローを作成、更新、トリガーできるユーザーは IAM ポリシーで制御します。実行時にコードがアクセスできる AWS リソースの範囲は実行ロールで決まります。
前提条件
始める前に、次のリソースとツールが AWS アカウントで設定されていることを確認してください。
- Amazon MWAA Serverless にアクセスできる AWS アカウント
- AWS CLI v2 (最新バージョン) のインストールと設定。インストールまたは更新の方法は AWS CLI の最新バージョンのインストールまたは更新を参照してください。
- DAG 定義とコードバンドルを保存する Amazon S3 バケット
- MWAA Serverless が引き受けられる IAM ロール (実行ロールの設定は後述します)
ウォークスルー: サーバーレスの CSV → JSON パイプラインを構築する
※以降の Amazon S3 バケット名 amzn-s3-demo-mwaa-data はサンプルです。ご利用の Amazon S3 バケット名に変更してください。
このウォークスルーでは、CSV ファイルを JSON 形式に変換するパイプラインを構築します。JSON を扱う下流の API や分析システムに向けた、よくあるデータ変換です。変換ロジックには PythonOperator を、出力の検証には BashOperator を使います。パイプラインの処理内容は次のとおりです。
- Amazon S3 バケットから CSV ファイルを読み込む
- 列の型を推論しながら JSON 形式に変換する
- JSON ファイルを Amazon S3 バケットに書き戻す
- 変換元と出力でレコード件数が一致することを検証する
ステップ 1: 実行ロールを作成する
ワークフローが実行時に引き受ける IAM ロールを作成します。信頼ポリシーでは airflow-serverless.amazonaws.com サービスがロールを引き受けられるようにする必要があります。
ロールを作成し、S3 バケットへの最小権限アクセスを許可するインラインポリシーをアタッチします。
ステップ 2: Python モジュールを作成する
変換ロジックを記述した csv_to_json.py というファイルを作成します。
この関数は boto3 (MWAA Serverless の実行環境にプリインストール済み) と Python 標準ライブラリの csv および json モジュールを使います。CSV を読み込んで数値型を推論し、JSON Lines ファイルを S3 バケットに書き戻します。
ステップ 3: 検証スクリプトを作成する
verify_output.sh というファイルを作成します。このスクリプトは、変換元 CSV と出力 JSON ファイルのレコード件数を比較してパイプラインの出力を検証します。件数が一致しない場合、タスクは 0 以外の終了コードで失敗し、ワークフローの実行も失敗します。
検証スクリプトは AWS CLI を実行します。AWS CLI はコードパッケージに依存関係としてバンドルされています。s3 cp はファイルの内容をディスクに書き出さずに stdout へストリーミングするため、wc -l や tail といった標準的なシェルツールで処理できます。実行ロールの認証情報は実行環境で自動的に利用できるので、追加の設定なしに CLI から S3 にアクセスできます。
ステップ 4: コードをパッケージ化して Amazon S3 にアップロードする
検証スクリプトが AWS CLI を使うため、Python モジュールとシェルスクリプトに加えて、AWS CLI も依存関係として ZIP アーカイブにバンドルします。
テスト用のサンプル CSV ファイルをアップロードします。
ステップ 5: DAG を定義する (YAML)
MWAA Serverless は DAG 定義に宣言的な YAML 形式を使います。conversion_dag.yaml というファイルを作成します。
この DAG は 2 つのタスクを定義しています。
convert_to_json– Python モジュールの convert 関数を実行し、CSV を JSON Lines に変換します。verify_output– シェルスクリプトを実行し、変換元と出力のレコード件数を比較してパイプラインの出力を検証します。一致しない場合はタスクを失敗させます。
DAG 定義を S3 にアップロードします。なお、シェルスクリプトを使わずにインラインの Bash コマンドを直接実行することもできます。
ステップ 6: ワークフローを作成する
DAG 定義とコードバンドルを参照して MWAA Serverless ワークフローを作成します。
レスポンスには、実行をトリガーする際に使う WorkflowArn が含まれます。
ステップ 7: ワークフローを実行する
ワークフローの実行をトリガーします。
レスポンスで実行が開始されたことを確認できます。
ステップ 8: 実行を監視する
実行のステータスを確認します。
実行が成功すると次のように返ります。
ステップ 9: 出力を検証する
JSON ファイルが S3 バケットに書き込まれたことを確認します。
次のように JSON ファイルが表示されます。
タスク単位の出力は Amazon CloudWatch Logs でも確認できます。ワークフローのロググループを開き、convert_to_json タスクのログストリームを探してください。
考慮事項と制限
PythonOperator と BashOperator を使うワークロードを MWAA Serverless で計画する際は、次の点に注意してください。
- コードバンドルのサイズ – ZIP アーカイブは 1 バンドルあたり 250 MB 未満にする必要があります。
- ネットワークアクセス – Python タスクと Bash タスクはインターネットにアクセスできません。ランタイムの動作に必要な限られた AWS サービス (Amazon S3、Amazon ECR、Amazon CloudWatch) には到達できますが、ほかの AWS サービスや外部エンドポイントは呼び出せません。ワークフローで外部 API の呼び出しが必要な場合は、事前にデータを処理して Amazon S3 バケットに保存し、そのうえでワークフローを実行してください。
- ランタイムの依存関係 – boto3 と Python 標準ライブラリはプリインストール済みです。pandas や requests などの追加パッケージは、Amazon MWAA Serverless のパッケージングガイドラインに従って ZIP アーカイブにバンドルしてください。
- 実行タイムアウト – タスクはワークフローに設定されたタイムアウト制限に従います。
- Python のバージョン – 現在サポートされている Python ランタイムのバージョンは Amazon MWAA Serverless のドキュメントで確認してください。
- DAG の形式 – MWAA Serverless は従来の Python の DAG ファイルではなく、YAML ベースの DAG 定義を使います。MWAA Provisioned から移行する場合は、DAG を YAML 形式に変換する必要があります。
- サポートされないオペレーター – Airflow コミュニティのオペレーターやカスタムプラグインの一部は Serverless ランタイムでは利用できません。互換性の一覧はドキュメントを参照してください。
クリーンアップ
継続的な課金を避けるため、本記事のウォークスルーで作成したリソースを削除します。ワークフロー、S3 オブジェクト、IAM ロールは次のコマンドで削除できます。
注: $WORKFLOW_ARN はステップ 7 で定義しています。
注: $BUCKET はステップ 4 でエクスポートしています。必要に応じてバケットも削除してください。
まとめ
PythonOperator と BashOperator がネイティブにサポートされたことで、多くのデータエンジニアリングチームが日常的に使っているカスタムコードの実行パターンを、MWAA Serverless で直接使えます。データ変換、形式変換、検証、シェルスクリプトを、コンピューティングリソースの追加プロビジョニングやコンテナの管理なしにサーバーレスランタイムで実行できます。
MWAA Provisioned やセルフマネージドのインフラストラクチャで Airflow ワークロードを実行している場合、既存の PythonOperator と BashOperator のロジックはほとんど変更せずに使えます。Python の DAG ファイルを YAML 形式に変換し、コードをバンドルとしてパッケージ化すれば、MWAA Serverless で実行できます。
まずは Amazon MWAA Serverless のドキュメントを参照し、本記事のウォークスルーを自分のデータで試してください。料金の詳細は Amazon MWAA の料金ページを参照してください。フィードバックをお待ちしています。