スケジュールワークフロー(例:毎日午前 1 時に実行)とは異なり、トリガーワークフロー はオンデマンドでイベント駆動型のデータ処理モデルです。ファイルのアップロード、メッセージの到着、API 呼び出し、手動クリックなどの外部信号によりリアルタイムで実行がトリガーされ、データ処理において優れたリアルタイム応答性と柔軟性を提供します。
機能 | スケジュールワークフロー | トリガーワークフロー |
トリガー方式 | 固定スケジュール(cron 式) | 外部信号(イベント、API、手動) |
実行モデル | スケジュール通りで予測可能 | 反応的かつオンデマンド |
ユースケース | T+1 バッチデータウェアハウス、スケジュールレポート | ファイル到着時の処理、業務システムとの連携、手動によるデータ修復 |
主なメリット | 信頼性と予測可能なスケジューリング | リアルタイム応答性と柔軟性 |
サポートされるトリガー方式
トリガーワークフローでは、以下の 3 種類のトリガー方式をサポートしています。シナリオに応じて適切な方式を選択してください。
トリガー方式 | 開始者 | 主要な利用シーン | ポイント |
イベントトリガー | 外部イベントソース(OSS や ApsaraMQ for Kafka など) | イベント駆動型 ETL:ファイル到着時に処理を実行する、またはメッセージからリアルタイム計算をトリガーする。 | 事前にトリガーを作成し、ワークフローに関連付ける必要があります。これは本番環境でのみ有効です。 |
手動トリガー | ユーザー(開発者/運用エンジニア) | アドホックタスク:一回限りのデータ処理や分析。 | 開発環境および本番環境の両方でワークフローを手動で実行できます。これは手動ワークフローの代わりとして推奨されます。 |
API トリガー | 外部システム(OpenAPI 経由) | システム連携:CRM や ERP などの業務システムからのコールバックによってデータ処理をトリガーする。 | OpenAPI オペレーションを呼び出し、必要な権限を保有している必要があります。 |
クイックスタート:手動トリガーワークフローの作成
このセクションでは、シンプルなトリガーワークフローを作成し、手動で実行することで、エンドツーエンドのプロセスをすぐに体験できます。
ステップ 1:トリガーワークフローの作成
-
DataWorks コンソールのワークスペースページに移動します。上部ナビゲーションバーで目的のリージョンを選択し、目的のワークスペースを見つけ、操作列でを選択します。
左側のナビゲーションウィンドウで、
をクリックし、次に プロジェクトディレクトリ の右側にある をクリックして、ワークフローの作成 ページに移動します。表示されたダイアログボックスのワークフローの作成ページで、スケジューリングタイプをトリガースケジューリングに設定します。ワークフローの名前を入力し、確認をクリックしてワークフローを作成します。
ステップ 2:ワークフローのオーケストレーションとノードの開発
ツールバーの+ ノードの追加をクリックしてノードリストを開きます。左側のノードタイプリストからShellノードをキャンバス上にドラッグし、名前を入力して作成を完了します。
Shell ノードをダブルクリックしてコード編集ページに移動し、以下のコードを入力します。
echo "Hello, Trigger Workflow! Current time is ${bizdate}"ツールバーの保存ボタンをクリックします。
ステップ 3:デバッグと実行(開発環境)
ワークフローキャンバスに戻り、上部ツールバーの
アイコンをクリックします。表示されたダイアログボックスで、ワークフローの今回の実行値を入力します(例:本日が 20260310 の場合、
bizdateは20260309に置き換えられます)。しばらくすると、下部の実行ログにノードの実行状況と
echoコマンドの出力が表示されます。
ステップ 4:デプロイと実行(本番環境)
ワークフローキャンバスでデプロイ
ボタンをクリックし、指示に従ってデプロイプロセスを完了します。デプロイが成功したら、オペレーションセンター > ワンタイムタスクの運用保守 > ワンタイムタスク > トリガー式ワークフローに移動します。
先ほどデプロイしたワークフローを見つけ、操作列の実行をクリックします。
表示されたダイアログボックスで再度実行をクリックして、本番環境でワークフローのインスタンスをトリガーします。この実行の詳細は手動インスタンスページで確認できます。
これで、トリガーワークフローの基本的な使い方を習得しました。次に、より強力なイベントトリガー機能について説明します。
高度な例:イベントトリガーワークフローの作成
シナリオ 1:OSS に新しいファイルが到着し、自動的にデータ処理をトリガー
目標:OSS の指定ディレクトリに新しい CSV ファイルがアップロードされた際に、ファイルパスを出力するワークフローを自動的にトリガーします。
ステップ 1:OSS トリガーの作成
オペレーションセンター > スケジュール設定 > トリガー管理に移動します。
トリガーの作成をクリックし、以下のように設定します。
説明パラメーターの詳細については、「OSS トリガー」をご参照ください。
トリガー名:
oss_new_file_triggerなどの任意の名前を入力します。適用ワークスペース:ワークフローが存在する対象のワークスペースを選択します。
トリガーイベントタイプ:
Object Storage Service (OSS)を選択します。イベントタイプ:
oss:ObjectCreated:PutObject(または他のアップロードイベント)を選択します。バケット名:ご利用の OSS バケットを選択します。
ファイル名:監視するファイルパスとフォーマットを指定します。ワイルドカードがサポートされています。たとえば、
input/ディレクトリ内のすべての.csvファイルを監視するには、input/*.csvと入力します。ロール構成:初めて使用する場合は、ワンクリック認可を実行し、
DataWorks-EventBridge-OSS-MNS-Role-*************という名前のロールを選択します。*************は、一意性を確保するためにランダムに生成された 13 桁の ID 番号を表します。
確認をクリックしてトリガーの作成を完了します。
ステップ 2:ワークフローの作成と関連付け
クイックスタート:手動トリガーワークフローの作成の手順に従って、
process_oss_file_workflowという名前の新しいトリガーワークフローを作成します。ワークフローキャンバスの右側パネルで、スケジューリング設定 > スケジューリングポリシーに移動します。
[トリガー]ドロップダウンリストで、作成したばかりの
oss_new_file_triggerトリガーを選択します。トリガーを選択すると、内部タスクで
${workflow.triggerMessage}を使用してメッセージ本文全体を取得するか、${workflow.triggerMessage.xxx}を使用してメッセージ本文内の特定のフィールドの値を取得できます。
ステップ 3:ノードの開発とイベントパラメーターの解析
ツールバーの+ ノードの追加をクリックしてノードリストを開きます。左側のノードタイプリストからShellノードをキャンバス上にドラッグし、名前を入力して作成を完了します。
ノードをダブルクリックし、トリガーイベントからファイルパスを取得して出力するコードを記述します。
# トリガーがワークフローを起動すると、イベント情報は組み込み変数 workflow.triggerMessage を介して渡されます # アップロードされたファイルの完全なパスは ${workflow.triggerMessage.data.oss.object.key} で取得できます echo "========= Start Processing OSS File =========" message="${workflow.triggerMessage}" echo "Raw Value: ${message}" # イベントメッセージからファイル名を抽出 FILE_PATH="${workflow.triggerMessage.data.oss.object.key}" echo "A new file has arrived: ${FILE_PATH}" # ここに具体的な処理ロジックを追加 echo "========= Finish Processing OSS File ========="説明${workflow.triggerMessage}:JSON 形式で完全なイベントメッセージ本文を取得します。OSS の具体的なメッセージフォーマットは、EventBridge > EventBridge >
DATAWORKS_TRIGGER_FOR_BUCKET_<OSS_Bucket_Name>> イベントトレーシング > イベント詳細から取得できます。
ステップ 4:デバッグと公開
デバッグ:
ワークフローキャンバスに戻り、実行
ボタンをクリックします。トリガーメッセージ本文入力ボックスに、シミュレートされた OSS イベント JSON を貼り付けます。トリガー設定ページの「メッセージフォーマットサンプル」から
key値をコピーして修正できます。以下は簡単な例です。{ "data": { "oss":{ "object": { "key": "input/test_file_20260310.csv" } } } }実行をクリックし、ログに
input/test_file_20260310.csvが正しく出力されているかを確認します。
公開:デバッグが成功したら、公開ボタンをクリックしてワークフローを本番環境にデプロイします。イベントトリガーは本番環境でのみ有効になります。
ステップ 5:本番環境での検証
OSS コンソールまたはクライアントツールを使用して、トリガーで設定したバケットおよびパス(例:
input/ディレクトリ)に CSV ファイルをアップロードします。DataWorks オペレーションセンター > ワンタイムタスクの運用保守 > ワンタイムタスク > トリガー式ワークフローに移動します。正常に公開された
process_oss_file_workflowが表示されます。しばらく待ってから、DataWorks オペレーションセンター > ワンタイムタスクの運用保守 > トリガー式ワークフローのインスタンスに移動します。新しいワークフローインスタンスが自動的にトリガーされています。クリックしてログを確認し、ファイルパスが正しく処理されていることを検証します。
===== Start Processing 0SS File ===== Raw Value: {"datacontenttype":"application/json;charset=utf-8","aliyunaccountid":"1162423445433459","data":{"eventVersion":"1.0","responseElements":{"requestId":"69B1083F7A439F343040ABCD"}, "eventSource":"acs:oss","eventTime":"2026-03-11T06:14:23.000Z","requestParameters":{"sourceIPAddress":"140.205.11.13"},"eventName":"0bjectCreated:Post0bject","userIdentity":{"principalId":"1162423445433459"}, "region":"cn-hangzhou","oss":{"bucket":{"name":"dwoss1024","arn":"acs:oss:cn-hangzhou:1162423445433459:dwoss1024","virtualBucket":"","ownerIdentity":"1162423445433459"},"ossSchemaVersion":"1.0","object":{"size":59537,"objectMeta": {"mimeType":"text/csv"},"deltaSize":0,"eTag":"63B4BA5A45AEFC679B9A917E8DDF0D32","key":"input/2013-2020-global-PS4-game-sales.csv"}}},"subject":"acs:oss:cn-hangzhou:1162423445433459:dwoss1024/input/2013-2020-global-PS4-game-sales.csv","aliyunoriginalaccountid":"1162423445433459","source":"acs.oss","type":"oss:0bjectCreated:Post0bject","aliyunpublishtime":"2026-03-11T06:14:23.959Z","specversion":"1.0","aliyuneventbusname":"DATAW0RKS_TRIGGER_F0R_BUCKET_dwoss1024","id":"69B1083F7A439F343040ABCD","time":"2026-03-11T06:14:23.000Z","aliyunregionid":"cn-hangzhou"}A new file has arrived: input/2013-2020-global-PS4-game-sales.csv ====== Finish Processing 0SS File =========
ベストプラクティス:べき等性設計
ネットワークの不安定などの要因により、OSS イベントが複数回配信される可能性があります。重複データ処理を回避するため、ビジネスロジック内でべき等性を実装することを推奨します。一般的なアプローチとして、ファイル処理前にレコードテーブル(MaxCompute テーブルなど)をチェックし、ファイルのETagまたは一意のパスを識別子として使用し、すでに処理済みの場合はスキップします。
シナリオ 2:Kafka メッセージ到着によるリアルタイム計算の駆動
目的:Kafka のユーザービヘイビアログを監視し、新しいメッセージが到着した際にワークフローをトリガーして解析し、内容に基づいて異なるロジックを実行します。
ステップ 1:Kafka トリガーの作成
オペレーションセンター > スケジュール設定 > トリガー管理に移動し、トリガーの作成をクリックします。
以下の設定を行います。
トリガー名:
kafka_user_action_trigger。トリガーイベントタイプ:ApsaraMQ for Kafka を選択します。
Kafka インスタンスおよびトピック:監視したいインスタンスとトピックを選択します。
ConsumerGroupId:クイック作成を選択することを推奨します。システムがコンフリクトを回避するためにコンシューマーグループ ID を自動生成します。
キー(オプション):メッセージキーを指定できます。指定された値と完全に一致するキーを持つメッセージのみがワークフローをトリガーします。
OKをクリックします。
ステップ 2:ワークフローの作成と関連付け
クイックスタート:手動トリガーワークフローの作成の手順に従って、
handle_user_action_workflowという名前のトリガーワークフローを作成します。ワークフローキャンバスの右側パネルで、スケジューリング設定 > スケジューリングポリシーを選択します。
トリガードロップダウンリストで、先ほど作成した
kafka_user_action_triggerトリガーを選択します。トリガーを選択すると、内部ノード内で
${workflow.triggerMessage}を使用して完全なメッセージ本文を取得したり、${workflow.triggerMessage.xxx}を使用してメッセージ本文内の特定フィールドの値を取得したりできます。(重要)メッセージが高頻度で到着する可能性があるため、
100などの値で内部タスクの最大並列インスタンス数を設定し、メッセージの急増によってスケジューリングリソースが圧迫されるのを防ぐことを推奨します。
ステップ 3:ノードの開発とネストされた JSON の解析
Kafka メッセージのvalueフィールドが以下の形式の JSON 文字列であると仮定します:{"user_id": "1001", "action_type": "login", "timestamp": 1688888888}。
ツールバーの+ ノードの追加をクリックしてノードリストを開きます。左側のノードタイプリストからPythonノードをキャンバス上にドラッグします。
メッセージを解析するコードを記述します。
valueフィールド自体が文字列であるため、コード内で二次的な JSON 解析を行う必要があります。import json # 1. 組み込み変数を使用して Kafka メッセージの value フィールド(JSON 文字列)を取得 message_value_str = '${workflow.triggerMessage.value}' print(f'Received raw message value string: ${message_value_str}') try: # 2. この文字列を Python の JSON オブジェクト(辞書)に解析 message_data = json.loads(message_value_str) user_id = message_data.get("user_id") action_type = message_data.get("action_type") print(f"Successfully parsed message. User ID: ${user_id}, Action: ${action_type}") # 3. action_type に基づいて異なるビジネスロジックを実行 if action_type == 'login': # o.run_sql(f"INSERT OVERWRITE TABLE user_login_record PARTITION(ds='{bizdate}') VALUES ('{user_id}');") print("Processing login action...") elif action_type == 'purchase': print("Processing purchase action...") else: print("Unknown action type.") except json.JSONDecodeError as e: print(f"Error decoding JSON: {e}") # 例外処理ロジック(例:エラーメッセージを専用のログテーブルに書き込む) raise e # トラブルシューティングを容易にするためにノードを失敗させるよう例外を送出
ステップ 4:デバッグと公開
デバッグ:
ワークフローキャンバスに戻り、実行
ボタンをクリックします。トリガーメッセージ本文に、シミュレートされた Kafka イベントを貼り付けます。
valueフィールドがエスケープされた JSON 文字列であることに注意してください。{ "topic": "user-behavior-topic", "key": "some-key", "value": "{\"user_id\": \"1001\", \"action_type\": \"login\", \"timestamp\": 1688888888}" }ワークフローを実行し、ログを確認してPythonノードが
user_idおよびaction_typeを正しく解析できているかを検証します。
公開:デバッグが成功したら、ワークフローを本番環境に公開します。
ステップ 5:本番環境での検証
設定した Kafka トピックに、適切な形式のメッセージを送信します。
トピック詳細ページで、クイックエクスペリエンス メッセージ送受信 をクリックし、コンソール 送信方法を選択します。メッセージキー に
some-keyを入力し、メッセージコンテンツ に{"user_id": "1001", "action_type": "login", "timestamp": 1688888888}を入力し、指定されたパーティションに送信 を いいえ に設定して、送信をクリックします。ページに メッセージは正常に送信されました が表示された場合、検証は成功です。DataWorks オペレーションセンター > ワンタイムタスクの運用保守 > ワンタイムタスク > トリガー式ワークフローに移動します。正常に公開された
handle_user_action_workflowが表示されます。オペレーションセンター > ワンタイムタスクの運用保守 > ワンタイムインスタンス > トリガー式ワークフローのインスタンスで、新しいワークフローインスタンスがトリガーされているかを確認し、実行ログをレビューします。
2026-xxx 14:55:40 INFO ======================================================================== Received raw message value string: ${"user_id": "1001", "action_type": "login", "timestamp": 1688888888} Successfully parsed message. User ID: $1001, Action: $login Processing login action... 2026-xxx 14:55:40 INFO ========================================================================
ベストプラクティス:同時実行と順序保証
同時実行制御:メッセージの急増に対応できるよう、適切な最大並列インスタンス数を設定してください。
順序保証:DataWorks スケジューリングでは、メッセージの厳密な順序処理は保証されません。同一ユーザー(またはパーティション)のメッセージを順序通りに処理する必要がある場合は、ビジネスコード内で分散ロック(Redis や MaxCompute に基づくなど)を実装するか、パーティション単位の順序消費を保証するコンピュートエンジン(Flink など)に処理ロジックを委譲してください。
コア設計と構成
ワークフローのオーケストレーション
トリガーワークフローのコアオーケストレーションプロセスは、スケジュールワークフローと同様です。詳細については、「ノード/ワークフローのオーケストレーション」をご参照ください。
スケジューリングパラメーター
ワークフローキャンバスの右側にあるスケジューリング設定パネルで、ワークフローのグローバルパラメーターを設定できます。ワークフロー内のすべてのノードがこれらのパラメーターを参照できます。
参照方法:ノードコード内で、
${workflow.parameter_name}の形式でワークフローパラメーターを参照します。パラメーター優先度:DataWorks のパラメーターは階層的なオーバーライドルールに従います。優先度の順序は次のとおりです:ノードパラメーター > ワークフローパラメーター。
パラメーターの詳細については、「パラメーター設計とフロー」をご参照ください。
スケジューリングポリシー
複数のワークフローやタスクが同時にトリガーされ、システムリソースがボトルネックになる場合、優先度および重み付け戦略を使用してインテリジェントなリソーススケジューリングを実現し、最も重要なタスクが最初に実行されるようにします。
コアビジネスの保護:コアビジネスワークフローに高い優先度を設定することで、他の非コアワークフローよりも常に先に実行されるようにします。
クリティカルパスの持続時間短縮:同一ワークフローインスタンス内では、優先度加重ポリシーを使用してノードの実行順序に影響を与えます。たとえば、ダウンストリーム重み付け戦略では、より多くの上流依存関係を持つノードがより高い動的重みを受け取り、先に実行されることで、全体のワークフロー実行時間を効果的に短縮できます。
設定項目
説明
優先度
スケジューリングキュー内のワークフローインスタンスの絶対優先度レベルを定義します。利用可能なレベルは 1、3、5、7、8 です(数値が大きいほど優先度が高い)。優先度の高いタスクまたはワークフローは、常に優先度の低いものよりも先にスケジューリングリソースを取得します。
優先度加重ポリシー
同一優先度レベル内での各ノード(タスク)の動的重みの計算方法を定義します。重みの高いノードが先に実行されます。
重み付けなし:すべてのノードが同じ固定ベースライン重みを持ちます。
ダウンストリーム重み付け:ノードの重みが動的に調整されます。上流依存関係が多いノードほど重みが高くなります。この戦略により、DAG(有向非循環グラフ)のクリティカルパス上のノードが先に実行されます。重みは次のように計算されます:
初期重み値 + すべての上流ノードの優先度の合計。
内部タスクの最大並列インスタンス数
このワークフローが同時に実行できるインスタンスの最大数を制御します。これは同時実行制御およびリソース保護に使用されます。実行中のインスタンス数が上限に達すると、その後にトリガーされた新しいインスタンスは待機状態になります。制限なしに設定するか、カスタムの最大値(最大 100,000)を指定できます。
説明上限値がリソースグループの最大容量を超えるように設定した場合、実際の同時実行数のボトルネックはリソースグループの物理的制限によって決まります。
DataWorks の優先度システムは階層的なオーバーライドルールに従います:実行時指定 > ノードレベル構成 > ワークフローレベル構成。
ワークフローレベル構成(ベースライン):スケジューリングポリシーでワークフローに設定され、すべてのノードのデフォルト設定として機能します。
ノードレベル構成(ローカル):ワークフロー内の個々のノードのスケジューリング設定 > スケジューリングポリシーで、特定のノードにワークフローレベル設定よりも高い優先度を設定でき、ワークフローレベル設定をオーバーライドします。
実行時指定(一時的):オペレーションセンターで手動トリガー実行時にランタイムリセットの優先度トグルを通じて指定します。この構成は最高優先度を持ち、現在の実行に対してのみ有効で、永続的な構成は変更しません。
運用保守と管理
インスタンス監視:トリガーまたは手動で実行されたすべてのインスタンスは、オペレーションセンター > 手動トリガータスク運用 > 手動インスタンスページで表示、再実行、終了、トラブルシューティングが可能です。
ワークフローのクローン:プロジェクトディレクトリでワークフローを右クリックし、クローンを選択すると、すべてのノードと依存関係を含むコピーを迅速に作成できます。詳細については、スケジュールワークフローの「ワークフローのクローン」をご参照ください。
バージョン管理:ワークフローキャンバスの右側にあるバージョンパネルで、ワークフローの履歴バージョンを表示、比較、復元できます。詳細については、スケジュールワークフローの「バージョン管理」をご参照ください。
制限事項と注意点
有効な環境:イベントトリガーメカニズムは、ワークフローが本番環境(オペレーションセンター)にデプロイされた後でのみ有効になります。
ノード数:単一のワークフローは最大 400 ノードをサポートします。メンテナンスを簡素化するため、100 ノード以内に抑えることを推奨します。
リソースグループ制限:トリガーワークフローで作成されたノードは、サーバーレスリソースグループのみを使用できます。
同時実行制限:最大並列インスタンス数は 100,000 ですが、実際の同時実行数は購入したスケジューリングリソースグループの仕様によって制限されます。
ノードレベルスケジューリング:ノードレベルでスケジューリングを構成する場合、優先度のみがサポートされます。優先度重み付けポリシーはサポートされていません。
サポートされていないノードタイプ:EMR Spark Streaming、Flink SQL Streaming、Flink JAR Streaming、Flink Python Streaming、依存関係チェックノードはトリガーワークフローで使用できません。これらのノードタイプはスタンドアロンノードとしてのみ開発および実行できます。