関数の非同期呼び出しにおいて、リクエスト処理に「タスクモード」を有効化できます。このモードでは、各呼び出しステージのステータス遷移を追跡・保存でき、制御性および可観測性が向上します。本トピックでは、非同期タスクの背景情報、制限事項、および特徴について説明します。
背景情報
非同期タスクを有効化すると、以下のような操作が可能になります。
各関数呼び出しについて、「キューイング済み(Enqueued)」「成功(Succeeded)」「失敗(Failed)」など、詳細なステータス遷移を記録できます。
関数リクエストのライフサイクルを管理でき、実行中の非同期タスクを終了することも可能です。
非同期タスクは状態情報を保存するため、関数呼び出しおよび実行回数にごくわずかな遅延が生じます。この遅延については課金されません。Function Compute の課金について詳しくは、「課金概要」をご参照ください。
制限事項
ユースケースにおける制限
非同期タスクは機能が豊富ですが、システムオーバーヘッドも発生します。以下のシナリオでは、タスクモードを無効化することを推奨します。
アプリケーションがエンドツーエンドのリクエストレイテンシーに極めて敏感であり、平均レイテンシーが 100 ms 未満である必要があります。
1 秒あたり数千 RPS(Requests Per Second)以上の頻度で非同期呼び出しを行う必要があります。
リージョンにおける制限
非同期タスクは、以下のリージョンでサポートされています:中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (ウランチャブ)、中国 (深セン)、中国 (成都)、中国 (香港)、シンガポール、イギリス (ロンドン)、米国 (シリコンバレー)、米国 (バージニア)、ドイツ (フランクフルト)、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、タイ (バンコク)、日本 (東京)、韓国 (ソウル)。
保持期間
過去 7 日間に作成されたタスクのステータスを照会できます。
Kubernetes ジョブとの比較
非同期タスクを実行するには、Function Compute の非同期タスク機能または Kubernetes ジョブを使用できます。Function Compute は、非同期タスクを実行するための即時利用可能なサーバーレス プラットフォームを提供しており、より効率的で、制御可能、かつ可観測性が高いです。以下の表では、この 2 つの方法を比較しています。
特徴 | Function Compute のタスク | Kubernetes ジョブ |
適用範囲 | 数十ミリ秒のリアルタイムタスクから数十時間のオフラインタスクまで、幅広く対応可能です。 | ワークロードが固定されており、提出速度やリアルタイム性能に対する要求が低いオフラインタスク向けです。 |
タスクの可観測性 | 対応しています。ログ、キューイング済みタスク数、タスクパスの処理時間、タスクステータス照会などの包括的な監視機能を提供します。 | オープンソースソフトウェアを手動で統合する必要があります。 |
タスクインスタンスの自動スケーリング | 対応しています。キューイング済みタスク数およびリソース使用率に基づき、インスタンスを自動的にスケーリングします。 | タスクキューを用いたスケーリングおよび負荷分散を手動で実装する必要があり、複雑さが増します。 |
インスタンスのスケーリング速度 | ミリ秒レベルです。 | 分レベルです。 |
インスタンスのリソース使用率 | 適切なインスタンスタイプを選択するだけで済み、インスタンスは自動的にスケーリングされ、実際のタスク処理時間に基づいて課金されるため、リソース使用率が高くなります。 | ジョブを送信する際に、インスタンスタイプおよび台数を指定する必要があります。自動スケーリングおよび負荷分散の実装は困難であり、リソース使用率が低くなります。 |
タスク送信スループット | 単一ユーザーによる送信が、1 秒あたり数万タスクに達します。 | クラスターによる起動が、1 秒あたり数百ジョブが上限です。 |
予約送信または遅延送信 | 対応しています。 | スケジュール実行は対応していますが、遅延実行は対応していません。 |
タスクの重複排除 | 対応しています。 | 対応していません。 |
タスク実行の一時停止/再開 | 対応しています。 | Kubernetes 1.21 以降でのみ対応しています。 |
特定タスクの終了 | 対応しています。 | 限定的な対応です。タスクインスタンスを停止することで間接的にタスクを終了します。 |
タスクの速度制限 | 対応しています。ユーザー単位や関数単位など、異なる粒度で速度制限を設定できます。 | 対応していません。 |
自動結果コールバック | 対応しています。 | 対応していません。 |
開発および運用コスト | タスク処理ロジックのみを実装すればよいです。 | Kubernetes クラスターの維持管理が必要です。 |
タスク管理
非同期タスクのステータス
各タスクの呼び出しについて、Function Compute は状態遷移を記録し、リアルタイムのステータス照会を可能にします。SDK または Function Compute コンソール を使用して、タスクの特定のステータスを表示できます。タスクは、以下のステータスのいずれかになります:
ステータス | 説明 |
Enqueued | 非同期メッセージがキューに登録され、処理待ちの状態です。 |
Processed | 非同期メッセージがキューから取り出され、呼び出し待ちの状態です。 |
Running | タスクがインスタンス上で実行中です。 |
Succeeded | タスクが正常に完了しました。 |
Failed | タスクが失敗しました。 |
Stopped | タスクが手動で停止されました。 |
Stopping | システムがタスク停止の手動リクエストを処理中です。 |
Expired | メッセージの生存時間(TTL)が経過したため、処理前に破棄されました。 |
Invalid | 関数またはサービスが削除されるなど、何らかの理由によりタスクを実行できず、無効な状態になっています。 |
Retrying | 実行エラーにより非同期呼び出しがリトライ中です。リトライが開始されると、ステータスは Running に変更されます。 |
タスク実行の詳細を取得するには、GetAsyncTask API オペレーションを呼び出します。また、ステータスでタスクをフィルターするには、ListAsyncTasks API オペレーションを呼び出します。
タスクの管理
コンソール
関数作成時にタスクを有効化
まず、Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーでリージョンを選択します。関数 ページで、関数を作成 をクリックします。
ポップアップダイアログボックスで、タスク関数 を選択し、{title} の作成 をクリックします。{title} の作成 ページで関数名を設定し、作成 をクリックします。
構成パラメーターの詳細については、「タスク関数の作成」をご参照ください。
関数が作成された後、関数の詳細ページに移動し、タスク タブをクリックします。タスクモードはデフォルトで有効化されています。
既存の関数に対してタスクを有効化
まず関数を作成してください。詳細については、「関数の作成」をご参照ください。
まず、Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーでリージョンを選択します。関数 ページで、対象の関数をクリックします。
関数の詳細ページで、タスク タブをクリックし、タスクモード の横にある 変更 をクリックします。
タスクモード パネルで、タスクモード を 無効化 に設定し、デプロイ をクリックします。
タスクの開始または停止
まず、Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーでリージョンを選択します。関数 ページで、対象の関数をクリックします。
関数の詳細ページで、タスク タブをクリックし、タスクの送信 をクリックします。表示されるダイアログボックスで、タスク ID の生成方法を選択し、タスク実行時間を指定して、OK をクリックします。
また、タスクの送信 の横にある矢印アイコン
をクリックし、ドロップダウンリストから テストパラメーターの設定 を選択することもできます。 イベント関数の場合、パラメーターは event ペイロードとして渡されます。 HTTP 関数の場合、タスクの送信をシミュレートするために、パラメーターは HTTP パラメーターとして渡されます。下部のタスク一覧では、タスクのステータス、タスク ID、インスタンス ID を確認できます。また、インスタンスへのログインも可能です。
API
タスクモードの構成
タスクモードを有効化するには、PutFunctionAsyncInvokeConfig API オペレーションを呼び出し、asyncTask パラメーターを true に設定します。その後、その関数に対するすべての非同期呼び出しはタスクモードで実行されます。
{
"asyncTask": true
}タスクモードを有効化しても、関数を同期的に呼び出すことは引き続き可能です。タスクモードは非同期呼び出しにのみ適用されます。
関数の非同期呼び出しのトリガー
非同期タスクをトリガーするには、InvokeFunction API オペレーションを呼び出し、x-fc-invocation-type ヘッダーを Async に設定します。カスタムタスク ID を割り当てる場合は、リクエストに HTTP ヘッダー x-fc-async-task-id を含めます。詳細については、「タスクの重複排除」をご参照ください。
タスクの表示
タスクを送信した後、GetAsyncTask API オペレーションを呼び出して、そのステータスまたは実行記録を照会できます。
特定のキーワードや条件に一致するタスクを検索する必要がある場合は、ListAsyncTasks API オペレーションを呼び出します。
タスクの停止
実行中のタスクを停止するには、その TaskID を指定して StopAsyncTask API オペレーションを呼び出します。指定したカスタム TaskID を使用するか、ListAsyncTasks API オペレーションを呼び出して取得した ID を使用できます。
イベントトリガー
非同期タスクは、非同期呼び出しをサポートするトリガーを作成することで起動できます。以下のトリガーがこの機能をサポートしています。
EventBridge と統合されたトリガーには、以下が含まれます。
重要HTTP トリガーおよび EventBridge と統合されたトリガーの呼び出しメソッドが非同期呼び出しに設定されていることを確認してください。
タスクの重複排除
重複実行を防ぐために、Function Compute では、各タスクにグローバルに一意な ID を割り当てることができます。たとえばタイムアウトなどの理由でタスクの送信が失敗した場合でも、同じタスク ID を使用してリクエストを安全にリトライできます。リトライ動作の詳細については、「リトライポリシー」をご参照ください。
Function Compute は、重複排除のためにグローバルに一意の TaskID を使用します。すべてのタスク送信で TaskID を指定し、タイムアウトやその他の障害が発生した場合の再試行に使用することを推奨します。Function Compute は、重複した TaskID を含む後続の送信を 409 エラーで拒否します。
Function Compute は、RequestID という概念も提供しています。 RequestID を設定し、TaskID を設定しない場合、システムは自動的に TaskID を RequestID に設定します。 非同期タスクを使用する場合、RequestID を設定せずに TaskID を設定することをお勧めします。
TaskID の設定
タスクは、Function Computeコンソール、Serverless Devs、または API オペレーションを呼び出すことで送信できます。TaskID を設定するには、呼び出しリクエストに x-fc-async-task-id ヘッダーを指定します。
タスクをトリガーする際に TaskID を設定するサンプルコードについては、「」「サンプルコード(国際サイト)」をご参照ください。
タスクのモニタリング
Function Compute の監視メトリクスを使用すると、非同期タスクのステータスをリアルタイムで取得し、エラー、タイムアウト、その他の例外を速やかに検出できます。
前提条件
関数が作成されました。詳細については、「関数の作成」をご参照ください。
操作手順
まず、Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーでリージョンを選択します。関数 ページで、対象の関数をクリックします。
関数の詳細ページで、モニタリング タブをクリックし、非同期呼び出しおよび非同期タスクインスタンスのリソース使用量に関連するメトリクスを確認します。監視メトリクスの詳細については、「監視メトリクス」をご参照ください。
関数のメトリクス タブをクリックして、非同期呼び出しに関連するメトリクス(例:非同期呼び出しの処理事例、非同期呼び出し処理の遅延 (ミリ秒)、非同期呼び出しトリガーイベント、非同期リクエストのバックログ)を確認します。
インスタンスのメトリクス タブをクリックして、非同期タスクのインスタンスレベルのリソース使用量を確認します。
説明インスタンスレベルのメトリクスを確認するには、まずログ機能を有効化する必要があります。詳細については、「ログの構成」をご参照ください。
メトリクスに対するアラートルールを設定します。
メモリ使用量や vCPU 使用量などのメトリクスをモニタリングするには、メトリクスチャートの右上隅にあるベルアイコン
をクリックします。これにより、「メトリクスベースのアラートルールの作成」パネルにリダイレクトされます。指示に従ってアラート条件およびしきい値を設定し、OK をクリックします。以下の図は、アラートルールの設定例を示しています。この例では、ある関数のバックログ中の非同期呼び出し件数が 5 以上になると、DingTalk、メール、電話、Webhook を通じて、指定された連絡先に 24 時間年中無休で中程度の重要度のアラートが送信されます。

タスクのオーケストレーション
CloudFlow と統合して、大規模で複雑なタスクワークフローで非同期関数呼び出しを使用できます。Pass、Map、Parallel などのステートを使用して、Function Compute 非同期タスクをオーケストレーションできます。CloudFlow は、事前定義されたステップに従って実行を確実に調整し、各タスクの状態遷移を追跡し、必要に応じてリトライロジックを適用して、ワークフローが正常に完了することを保証します。詳細については、「Function Compute との統合」をご参照ください。
前提条件
非同期タスクを作成します。詳細については、「タスク管理」をご参照ください。
CloudFlow が Function Compute にアクセスできる権限を付与します。 詳細については、「関数ロールを用いた、Function Compute による他クラウドサービスへのアクセス権限の付与」をご参照ください。
操作手順
CloudFlow コンソール にログインします。上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションウィンドウで、ワークフロー をクリックします。ワークフロー ページで、ワークフローの作成 をクリックします。
ワークフローの作成 ダイアログボックスで、ワークフローの作成方法およびモードを選択します。
CloudFlow では、標準(Standard)および高速(Express)の 2 種類のワークフローモードをサポートしています。各モードの詳細については、「標準ワークフローと高速ワークフロー」をご参照ください。ワークフローの作成方法については、「空白キャンバスからのワークフロー作成」をご参照ください。
先ほど作成したワークフローを編集します。
フローを定義します。
CloudFlow Studio エディターまたは YAML エディターのいずれかを使用できます。本例では YAML エディターを使用します。
フロー詳細ページの右上隅にある YAML をクリックします。左側のコードエディターにフロー定義言語を入力し、保存 をクリックします。
以下に例を示します。
Type: StateMachine Name: MyFlow SpecVersion: v1 StartAt: InvokeFunction States: - Type: Task Name: InvokeFunction Action: FC:InvokeFunction TaskMode: RequestComplete Parameters: invocationType: Async resourceArn: acs:fc:us-west-1:103435468****:functions/func-i1****/LATEST End: true実行ロールを構成します。
フロー詳細ページの右上隅にある ワークフローの設定 をクリックします。実行ロール を選択し、保存 をクリックします。
説明ワークフローに構成するロールには、AliyunFCInvocationAccess ポリシーがアタッチされていることを確認してください。
フロー詳細ページで、右上隅の 実行する をクリックして、ワークフローのテストを行います。