Amazon MWAA Serverlessのセンサーと課金の挙動を検証してみた
こんにちは。サービス開発室の武田です。
2025年11月に Amazon MWAA Serverless (Amazon Managed Workflows for Apache Airflow Serverless)が発表されました。Apache Airflowのワークフローをサーバーレスで実行できるサービスです。インフラ管理が不要で、タスク実行時間に応じた従量課金が魅力です。
このMWAA Serverlessで、SqsSensorを例に挙動を確認する機会がありましたので、検証した結果をまとめます。今回のreschedule modeと課金のしくみについてはセンサー全般に言えるものとなります。
そもそもなぜ検証したのか
MWAA Serverlessの課金モデル
MWAA Serverlessでは、タスク実行時間に対して最低1分の課金が発生します。たとえ数秒で完了するタスクでも1分ぶんの料金がかかります。
Airflowセンサーの2つのモード
Airflowのセンサー(外部条件の成立を待つタスク)には2つの動作モードがあります。
| モード | 動作 | 従来のMWAAでの特徴 |
|---|---|---|
| poke | ワーカースロットを占有し続け、poke_interval毎にチェック |
シンプルだがワーカーリソースを占有 |
| reschedule | 条件未達の場合ワーカースロットを解放し、あとで再スケジュール | ワーカーリソースの効率的利用に有効 |
従来のMWAAでは、長時間の待機が必要な場合にreschedule modeが推奨されていました。ワーカースロットを解放することで、他のタスクの実行を妨げないためです。
知りたかったこと
MWAA Serverlessでreschedule modeを使った場合、課金はどうなるのか?
- poke毎にコンテナが新たに起動し、最低1分 × poke回数の課金になるのか
- それとも合計実行時間で課金されるのか
この疑問を解決するため、SqsSensorを使って実環境で検証しました。
検証環境の構成
リソース構成

ワークフロー定義(YAML)
MWAA Serverlessではdag-factoryフォーマットに基づいたYAML形式でワークフローを定義します。
test_poke_30s:
dag_id: test_poke_30s
schedule: null
default_args:
owner: airflow
start_date: "2024-01-01"
tasks:
wait_for_message:
operator: airflow.providers.amazon.aws.sensors.sqs.SqsSensor
task_id: wait_for_message
sqs_queue: https://sqs.us-east-1.amazonaws.com/123456789012/my-queue
mode: poke # または reschedule
poke_interval: 30
timeout: 900
wait_time_seconds: 5
max_messages: 1
delete_message_on_reception: true
検証シナリオ
| # | シナリオ | mode | poke_interval | メッセージ送信タイミング |
|---|---|---|---|---|
| 1 | poke mode(3分待機) | poke | 30s | 3分後 |
| 2 | reschedule mode(3分待機) | reschedule | 30s | 3分後 |
| 3 | poke mode(10分待機) | poke | 30s | 10分後 |
検証してみた
reschedule modeがMWAA Serverlessで動かない
まずこれが一番大きな発見でした。reschedule modeのセンサーは、最初のpokeで条件を満たさないと即座にFAILEDとなります。SqsSensorだけでなくS3KeySensorでも同様だったので、センサー固有ではなくプラットフォームレベルの挙動です。
SqsSensor(reschedule mode × メッセージなし)→ 即FAILED
Status: FAILED
DurationInSeconds: 2
StartedAt: 2026-02-15T08:23:15Z
EndedAt: 2026-02-15T08:23:17Z
AttemptNumber: 1
S3KeySensor(reschedule mode × 存在しないキー)→ 即FAILED
Status: FAILED
DurationInSeconds: 1
StartedAt: 2026-02-15T11:42:08Z
EndedAt: 2026-02-15T11:42:09Z
AttemptNumber: 1
いずれも1〜2秒で失敗しています。最初のpokeで条件を満たさなかった時点で、再スケジュールされずにタスクが失敗しました。
メッセージを事前投入した場合はどうなるか
メッセージを事前にキューへ投入した状態でreschedule modeのSqsSensorを実行してみました。
Status: SUCCESS
DurationInSeconds: 3
StartedAt: 2026-02-15T08:30:42Z
EndedAt: 2026-02-15T08:30:45Z
AttemptNumber: 1
最初のpokeで即座にメッセージを検知し、成功しました。つまり「再スケジュール」が発生しない場合に限りreschedule modeでも動作します。逆に言えば、reschedule modeとして意味のある使い方はできません。
なぜ動かないのか
通常のAirflowでは、reschedule modeのセンサーが条件未達の場合、次のように動作します(Airflowソースコードより)。
BaseSensorOperator.executeがAirflowRescheduleExceptionを発生させるTaskInstanceの実行ロジックがこの例外をキャッチし、タスクの状態をUP_FOR_RESCHEDULEに変更する- スケジューラが
UP_FOR_RESCHEDULE状態のタスクを検知し、poke_interval後に再度キューイングする
MWAA Serverlessではこの一連の流れが機能しません。条件未達時、タスクは即座にFAILEDとなります。
この挙動は2026年3月時点で 公式ドキュメントに明記されていない です。YAMLのmodeパラメーター自体は受け付けられるため、設定時はエラーにならず、実行してはじめて失敗に気付きます。注意しましょう。
poke modeの待機時間はすべて課金対象
poke modeは正常に動作します。poke_interval毎にSQSをポーリングし、メッセージが到着するまで待機を続けます。
| シナリオ | 待機時間 | DurationInSeconds | タスクインスタンス数 |
|---|---|---|---|
| 3分待機 | 約3分 | 144秒 | 1 |
| 10分待機 | 約10分 | 563秒 | 1 |
DurationInSecondsの値は、タスクのStartedAtからEndedAtまでの実際の経過時間と一致しています。
つまり、poke modeではポーリング間のsleep時間も含めた全待機時間が課金対象です。10分待機すれば約10分ぶんの課金が発生します。
「最低1分課金」はタスク単位か合計か?
MWAA Serverlessでは「タスク実行時間に対して最低1分の課金」とされていますが、これがタスクインスタンス毎に1分最低なのか、合計秒数に対して1分最低なのかで、課金額が大きく変わります。
これを判別するため、SqsPublishOperator(SQSへのメッセージ送信)を5つ順次実行するワークフローを作成しました。各タスクは2〜3秒で完了します。
test_multi_publish:
dag_id: test_multi_publish
schedule: null
default_args:
owner: airflow
start_date: "2024-01-01"
tasks:
publish_1:
operator: airflow.providers.amazon.aws.operators.sqs.SqsPublishOperator
task_id: publish_1
sqs_queue: https://sqs.us-east-1.amazonaws.com/123456789012/my-queue
message_content: '{"task": "publish_1"}'
publish_2:
operator: airflow.providers.amazon.aws.operators.sqs.SqsPublishOperator
task_id: publish_2
sqs_queue: https://sqs.us-east-1.amazonaws.com/123456789012/my-queue
message_content: '{"task": "publish_2"}'
dependencies:
- publish_1
# publish_3〜5 も同様(省略)
実行結果
| タスク | DurationInSeconds |
|---|---|
| publish_1 | 2秒 |
| publish_2 | 3秒 |
| publish_3 | 3秒 |
| publish_4 | 2秒 |
| publish_5 | 2秒 |
| 合計 | 12秒 |
Cost Explorerで確認してみた
| 課金モデル | このテストの課金時間 |
|---|---|
| モデルA: 合計秒数で課金 | 12秒(0.2分) |
| モデルB: タスク毎に最低1分 | 300秒(5分) |
25倍の差があるため、請求額からどちらのモデルかを判別できます。
請求データの結果
実際の請求データを確認しました。
USD 0.08 per Hour for MWAA Serverless AWS Managed task
0.33 Hrs
USD 0.03
0.33 Hrs = 1,188秒です。検証当日に実行した全タスクの課金時間を両モデルで計算するとこうなります。
| タスク | 実Duration | モデルA(実秒数) | モデルB(1分最低) |
|---|---|---|---|
| basic(Phase 2) | 38秒 | 38秒 | 60秒 |
| poke-30s | 144秒 | 144秒 | 144秒 |
| reschedule(失敗) | 2秒 | 2秒 | 60秒 |
| reschedule(事前投入) | 3秒 | 3秒 | 60秒 |
| poke-long | 563秒 | 563秒 | 563秒 |
| multi-publish ×5 | 各2〜3秒 | 12秒 | 60秒 × 5 = 300秒 |
| 合計 | 762秒 | 762秒(0.21 Hrs) | 1,187秒(0.33 Hrs) |
モデルBの1,187秒(0.33 Hrs)が請求データと一致しました。
課金は 「タスクインスタンス毎に最低1分」 でした。1分未満で完了するタスクも1分ぶん課金されます。multi-publishテストの5タスク(実行時間合計12秒)に対して300秒(5分)ぶんの課金が発生していることが、これを裏付けています。
センサーを使う際に気をつけること
poke modeを使う
reschedule modeは機能しないため、poke modeを使いましょう。modeパラメーターを省略した場合のデフォルトはpoke modeですので、明示的に指定しなくても大丈夫です。
timeoutを適切に設定する
poke modeでは待機時間がそのまま課金に直結します。想定外の長時間待機を防ぐため、timeoutを短めに設定しておきましょう。
wait_for_message:
operator: airflow.providers.amazon.aws.sensors.sqs.SqsSensor
task_id: wait_for_message
sqs_queue: https://sqs.us-east-1.amazonaws.com/123456789012/my-queue
mode: poke
poke_interval: 30
timeout: 300 # 5分でタイムアウト
soft_fail: true # タイムアウト時にFAILEDではなくSKIPPEDにする
長時間待機が必要な場合はセンサー以外の手段を検討する
数十分〜数時間の待機が必要な場合、poke modeのセンサーだとコストがかさみます。センサーで待機する代わりに、メッセージ到着をトリガーにワークフローを起動する構成が有効です。
MWAA Serverlessでは、スケジュール実行(EventBridge Scheduler)とオンデマンド実行(StartWorkflowRun API)がサポートされています。「SQSにメッセージが来たら処理を開始する」ケースでは、SQSメッセージをトリガーにLambdaからStartWorkflowRun APIを呼び出す構成にすれば、待機中の課金を回避できます。
検証結果まとめ
| 検証項目 | 結果 |
|---|---|
| SqsSensor(poke mode) | 正常動作 |
| SqsSensor(reschedule mode) | 再スケジュール不可(即FAILED) |
| S3KeySensor(reschedule mode) | 再スケジュール不可(即FAILED) |
| DurationInSecondsの意味 | タスクの実際の実行時間(待機含む) |
| 最低1分課金の適用単位 | タスクインスタンス毎に最低1分(請求データで確認済み) |
| poke_interval | 正常に機能 |
まとめ
MWAA Serverlessは、DAGのYAML定義やタスク単位の従量課金など、従来のMWAAとは大きく異なるアーキテクチャです。従来のスケジューラに依存していた機能(今回のreschedule modeなど)は動作しないケースがあります。
今回の検証でわかったポイントは2つです。
1つ目は、reschedule modeが設定エラーにならず受け付けられるのに、実行時に失敗するということ。既存のDAGをMWAA Serverlessに移行する際は、センサーのmodeパラメーターを思い出してあげてください。
2つ目は、課金がタスクインスタンス毎に最低1分ということ。短時間タスクを多数実行するワークフロー設計はコスト増に直結します。タスクの粒度設計が従来のMWAA以上に大切です。
2026年3月時点では poke mode一択 です。






