[アップデート] Amazon AppFlow で実行中のフローをキャンセル出来るようになりました

2023.05.03

いわさです。

今朝 AppFlow に次の新しい API が追加されました。
どうやら AppFlow でフローの実行中にキャンセルが出来るようになったようです。

What's New でのアナウンスはまだありませんが、AppFlow 公式ドキュメントも更新されていました。(4 月 27 日付)

Amazon AppFlow now supports flow cancellation. You can cancel any flow while it's running. For more information, see Managing Amazon AppFlow flows.

Document history for user guide - Amazon AppFlow

以前 AppFlow で SharePoint と接続した際に、コネクターの構成ミスで大量のドキュメントコピーをオンデマンド実行したことがあり「キャンセルしたいなぁ」と思っていたのを思い出しました。重めのフローを実行する人には中々ありがたいアップデートかもしれないです。

確認したところマネジメントコンソール(東京リージョン)でも機能が実装済みでした。
今回は実際に試してみたので紹介します。

キャンセル操作の猶予のありそうなフローを用意する

データ数多めで S3 (CSV) → S3 (JSON) の変換フローを行ってみます。
外部サービスだとちょっと検証が面倒なので...。

次のような CSV ファイルを用意します。
データは適当で良いですが CSV として正しい形式のものを用意します。

% cat hoge.csv
id,first_name,last_name,email,age
1,John,Doe,john.doe@example.com,28
2,Jane,Doe,jane.doe@example.com,32
3,Jim,Smith,jim.smith@example.com,45
4,Mary,Johnson,mary.johnson@example.com,37
5,Michael,Brown,michael.brown@example.com,29
6,Emily,Garcia,emily.garcia@example.com,25

% for i in $(seq 1 100); do cp hoge.csv "hoge_$i.csv"; done

それを 100 個複製して S3 バケットにアップロードしました。

ではフローを実行してみましょう。

実行すると上部にフローの進行状況を示すバナーが表示されます。
バナー自体は前から表示されていましたが、その中に「Cancel this flow run」というキャンセルボタンが追加されていますね。

これを押します。

そうすると次のようにキャンセルが試行されます。

ただし、今回はフローが正常終了してしまいました。

フローの送信先バケットを確認してみると、101 個の CSV ファイルが JSON ファイルに変換されて送信されていますね。
うまくキャンセル出来なかったようです。

数分以上かかりそうなフローを用意する

いくつか検証してみたのですが、どうやらフローの実行時間が短すぎる場合はキャンセル開始から終了までの間にフローが完了してしまい、正常終了扱いとなるようです。
そこで、先程は約 100 個のファイルでしたが、これを 1000 個に増やしましょう。10倍だ!

普通にオンデマンド実行すると 2 ~ 3 分かかります。

フローを実行し、キャンセルしてみます。

先程はキャンセル操作をしてもフローの実行ステータスが「成功」になってしまいましたが、今度は実行ステータスが「Canceled」となりました。
転送サイズが発生しており、1314 件のレコードが処理されています。
1 つのファイルで 6 件のレコードだったので、200 ファイルくらいは処理された形でしょうか。

送信先のバケットに途中までのファイルが書き込まれているのかと予想したのですが、バケットには何も書き込まれていませんでした。
これも何度か検証してわかったのですが、ここの処理というのは書き込み処理を行った情報ではなく読み込みや変換などの前処理を含んで「処理」と呼んでいるようです。

タイミングによっては途中までの状態で書き込まれるケースも発生します。

途中まで書き込みされるケース

公式ドキュメントによるとこのキャンセル処理では途中まで送信先に書き込み操作をしたものは取り消しなどはされずにそのまま途中までで書き込まれると記述されています。
また、AppFlow は処理されたデータ量に依存した従量課金ですが、キャンセルをした場合でも途中までの処理データは課金対象となります。

先程の 1 ファイル 6 件のレコードを 1000 ファイル処理するとだいたい 6000 レコードの処理が必要です。
今回は次のように実行履歴画面で 6000 件処理されたタイミングでキャンセル操作をしてみました。

実行ステータスが Canceled になりました。
6000 件まで処理されたら成功になってしまうのかと思ったのですがそうではないようです。

送信先 S3 バケットを確認してみると、600 ファイル弱が書き込まれていました。
ドキュメントのとおりキャンセルしても途中までは書き込まれるという動きを再現することが出来ましたね。

今回使用したフローでは送信元の全てのレコードを処理した後に、送信先に書き込みを行う流れになっていて、書き込みのフェーズでうまくキャンセルを割り込ませることが出来たようです。

履歴からもキャンセル操作可能

ここまで実行履歴画面を見ていて気がついた方もいるかと思いますが、フロー詳細の実行履歴画面にもキャンセルボタンが追加されています。

こちらでは複数の実行中のフローを選択して、一括でキャンセル操作を行うことが出来ます。
スケジュールなどで複数同時実行している場合やバナーが表示されていない場合などはこちらの履歴画面からキャンセルするのが良さそうです。

さいごに

本日は Amazon AppFlow で実行中のフローをキャンセル出来るようになったので使ってみました。

途中まで書き込みが発生し、書き込みされた分の消し込みなど必要であれば手動で対応が必要になるので気軽にキャンセル出来るものではありませんが、長時間実行されてしまうフローなどに緊急的に割り込む方法がひとつ提供されました。
ただし、キャンセルに成功したとしても途中まで書き込みされている可能性がある点と、処理した分の料金は発生するという点は覚えておきましょう。

API で提供されているので、外部で何か検知したタイミングで実行中フローをキャンセルさせるという使い道もありそうな気がします。
例えば、Step Functions で AppFlow を含むオーケストレーションタスクを並列実行していて、一部のタスクに起因して AppFlow 側もキャンセルしたい場合とかですかね。