関数を非同期に呼び出すと、Function Compute はリクエストをキューに入れ、すぐに応答を返します。関数の実行完了を待つ必要はありません。最大リトライ回数を超えて失敗したリクエストのレコードを保持する場合や、結果をダウンストリームサービスに通知する場合は、送信先を設定できます。送信先を設定すると、Function Compute は呼び出し結果の詳細を指定されたサービスに自動的に送信します。
仕組み
次の図は、送信先の仕組みを示しています。
ユースケース
さらなる処理のために破棄されたイベントを保持する
非同期呼び出しで、ポリシーに基づくすべてのリトライが失敗した場合、Function Compute がイベントを破棄します。失敗時の送信先を設定することで、Function Compute が失敗した呼び出しのコンテキストを、ApsaraMQ for RocketMQ などのメッセージサービスに自動的に送信し、さらなる分析または処理を行うことができます。また、別の関数を送信先として設定することもできます。Function Compute は、失敗したリクエストのコンテキストをその関数に自動的に送信して、カスタムエラー処理ロジックを実行します。
呼び出し結果をダウンストリームサービスに通知する
成功した呼び出しの送信先を設定すると、リクエストの実行後、Function Compute システムは成功したリクエストのコンテキストを送信先に自動的に送信します。 たとえば、Function Compute を使用して OSS にアップロードされた ZIP ファイルを自動的に解凍し、完了時に通知を受け取りたい場合は、関数の非同期呼び出しの送信先を設定できます。
非同期呼び出しでサポートされる送信先
関数の非同期呼び出しに対して送信先を設定すると、呼び出し結果が条件を満たした場合に、 Function Compute はリクエストコンテキストとデータを指定されたサービスに送信します。 関数、バージョン、およびエイリアスごとに異なる送信先を設定できます。 非同期呼び出しの送信先として、次のサービスがサポートされています。
Simple Message Queue (旧称:MNS)
Function Compute
EventBridge
ApsaraMQ for RocketMQ
送信先として設定できるのは、Function Compute のイベント関数のみです。HTTP 関数を送信先として設定することはできません。イベント関数と HTTP 関数の詳細については、「関数タイプを選択する」をご参照ください。
送信先の構成に関する以下の詳細を確認してください。
送信先へのイベントコンテンツ
以下のコードは、送信先が Simple Message Queue (旧称:MNS)、Function Compute、または ApsaraMQ for RocketMQ の場合に送信されるサンプルイベントです。
{ "timestamp": 1660120276975, "requestContext": { "requestId": "xxx", "functionArn": "acs:fc:::services/{serviceName}/functions/{functionName}", "condition": "FunctionResourceExhausted", "approximateInvokeCount": 3 }, "requestPayload": "", "responseContext": { "statusCode": 200, "functionError": "" }, "responsePayload": "" }表 1. パラメーターの説明
パラメーター
説明
timestamp
呼び出しのタイムスタンプ。
requestContext
リクエストのコンテキスト。
requestContext.requestId
非同期呼び出しのリクエストID。
requestContext.functionArn
非同期実行の関数ARN。
requestContext.condition
呼び出しエラーコード。
requestContext.approximateInvokeCount
非同期呼び出しの実行回数です。この値が1より大きい場合、関数計算がお客様の関数を再試行したことを示します。
requestPayload
リクエスト関数の元のペイロード。
responseContext
コンテキストに戻る。
responseContext.statusCode
呼び出し関数のレスポンスコード (システム)。このレスポンスコードが200でない場合、システムエラーが発生したことを示します。
responseContext.functionError
呼び出しエラー情報。
responsePayload
実行関数が返す元のペイロード。
以下の例では、非同期呼び出しのターゲットとして EventBridge が使用されるイベントを示します。詳細については、「イベントの概要」をご参照ください。
{ "datacontenttype": "application/json", "aliyunaccountid": "143xxxx", "data": { "requestContext": { "condition": "", "approximateInvokeCount": 1, "requestId": "0fcb7f0c-xxxx", "functionArn": "acs:fc:::services/xxxx.LATEST/functions/xxxx" }, "requestPayload": "", "responsePayload": "", "responseContext": { "functionError": "", "statusCode": 200 }, "timestamp": 1660120276975 }, "subject": "acs:fc:::services/xxxx.LATEST/functions/xxxx", "source": "acs:fc", "type": "fc:AsyncInvoke:succeeded", "aliyunpublishtime": "2021-01-03T09:44:31.233Asia/Shanghai", "specversion": "1.0", "aliyuneventbusname": "xxxxxxx", "id": "ecc4865xxxxxx", "time": "2021-01-03T01:44:31Z", "aliyunregionid": "cn-shanghai-vpc", "aliyunpublishaddr": "199.99.xxx.xxx" }ペイロード制限
非同期呼び出しにおける送信先サービスの最大ペイロード制限は以下のとおりです。
Simple Message Queue (旧称:MNS): 64 KB
Function Compute: 128 KB
EventBridge: 64 KB
ApsaraMQ for RocketMQ: 4 MB
循環呼び出しの回避
非同期実行の送信先を構成する場合、循環呼び出しの作成を避けてください。たとえば、関数Aの成功した呼び出しの送信先として関数Bを構成し、関数Bの成功した呼び出しの送信先として関数Aを構成した場合、関数Aを非同期で呼び出して正常に実行されると、関数Bがトリガーされます。その後、関数Bが再び関数Aをトリガーし、ループが作成されます。
非同期呼び出しの送信先を構成する
非同期呼び出しの送信先を構成する前に、「関数を作成」し、関数が使用するロールに、クラウドサービスにアクセスするための必要な権限があることを確認してください。詳細については、「Function Compute が他のクラウドサービスにアクセスするための権限を付与する」をご参照ください。
Simple Message Queue (旧称:MNS): mns:SendMessage または mns:PublishMessage。
Function Compute: fc:InvokeFunction.
EventBridge: eventbridge:PutEvents。
ApsaraMQ for RocketMQ: mq:PUB.
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、[サービスと関数] をクリックします。
トップナビゲーションバーで、リージョンを選択します。 「[サービス]」ページで、目的のサービスをクリックします。
「関数の管理」ページで、送信先関数の名前をクリックします。次に、関数の詳細ページで、「非同期モードの設定」タブをクリックします。
非同期モードの設定 タブで、必要に応じてパラメーターを設定します。
成功時の送信先を構成する
「成功した呼び出しの送信先」セクションで、変更をクリックします。
[失敗した呼び出しの送信先の変更] パネルで、[成功時に他のサービスを呼び出す] を [有効化] に設定します。次に、リクエストが正常に実行された後に結果が送信される送信先クラウドサービスを設定します。次の表はパラメーターについて説明しています。
パラメーター
説明
送信先サービス
Function Compute。 送信先サービス を Function Compute に設定した場合、以下のパラメーターを設定します:
サービス名 : 送信先サービスの名前を指定します。
バージョンまたはエイリアス: サービスのエイリアスまたはバージョンを指定します。
関数名:送信先関数の名前を指定します。
説明Function Compute のイベント関数のみを送信先として設定できます。HTTP関数を送信先として設定することはできません。
Simple Message Queue (旧称:MNS)。 送信先サービス を Simple Message Queue (旧称:MNS) に設定した場合は、以下のパラメーターを設定します:
ターゲットタイプ: 必要に応じて送信先タイプを選択します。有効な値:
キュー:
トピック:
キュー: Simple Message Queue (旧称:MNS) キューの名前です。送信先の種類をキューに設定した場合は、このパラメーターを指定する必要があります。
トピック: Simple Message Queue (旧称:MNS) のトピック名です。Destination Type を [トピック] に設定した場合は、このパラメーターを指定する必要があります。
ApsaraMQ for RocketMQ。 送信先サービス を ApsaraMQ for RocketMQ に設定した場合、次のパラメーターを設定します。
インスタンス: 宛先インスタンスを選択します。
[トピック]: 送信先トピックを選択します。
EventBridge。[送信先サービス] を EventBridge に設定した場合、カスタムイベントバス を指定します。
OK をクリックします。
失敗時の送信先を構成する
「失敗した呼び出しの送信先」セクションで、変更をクリックします。
「成功した呼び出しの送信先の変更」パネルで、「失敗時に他のサービスを呼び出す」を「有効化」に設定します。その後、リクエストが失敗した後に結果が送信される送信先のクラウドサービスを設定します。
失敗した呼び出しの送信先を構成するためのパラメーターの詳細については、「成功時の送信先を構成する」をご参照ください。
[OK] をクリックします。
関数がトリガーされた後、関数の実行が成功または失敗した場合に、構成された送信先サービスから以下のコンテンツを読み取ることができます。
{ "timestamp": 1660120276975, "requestContext": { "requestId": "xxx", "functionArn": "acs:fc:::services/{serviceName}/functions/{functionName}", "condition": "FunctionResourceExhausted", "approximateInvokeCount": 3 }, "requestPayload": "", "responseContext": { "statusCode": 200, "functionError": "" }, "responsePayload": "" }
コールバック失敗の処理
Destination Service へのコールバックは、サービスロールにアクセス権限が不足している場合や、Destination Service が利用できない場合に失敗することがあります。Function Compute は、これらの障害を処理するための関連するメトリックとログを提供します。次の表では、一般的なエラーおよびシステムの動作について説明しています。
エラーコード | 原因 | システム動作 |
5xx | スロットリング、コンテンツエラー、またはその他の問題。 | Function Compute は指数バックオフで自動的にリトライします。初期リトライ間隔は 500 ms、最大リトライ持続時間は 30 分です。 |
4xx | 権限不足、送信先サービス内の削除されたリソースなどの不正なリクエストパラメーター、または送信先サービスの制限を超えるリクエストメッセージボディ。 | エラーが返され、エラーメッセージが記録されます。 |
結果コールバックメトリック
コールバックが Destination Service に失敗した場合、Function Compute は関連するメトリックを記録し、コンソールに表示します。Function Computeコンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。次に、サービス名 リストで、送信先サービスの名前をクリックして、そのメトリックを表示します。次の表では、送信先機能のメトリックについて説明します。
メトリック名 | 説明 |
送信先呼び出しエラー (FunctionDestinationErrors) | 関数実行中に送信先を呼び出す失敗したリクエストの数。このメトリックは、非同期呼び出しの送信先が構成されている場合に適用されます。値は1分または1時間の粒度で合計されます。 |
送信先呼び出し成功 (FunctionDestinationSucceed) | 関数実行中に送信先を呼び出す成功したリクエストの数。このメトリックは、非同期呼び出しの送信先が構成されている場合に適用されます。値は1分または1時間の粒度で合計されます。 |
監視メトリクスの詳細については、「監視メトリクス」をご参照ください。
詳細情報
API または Serverless Devs ツールを使用して、非同期呼び出しの送信先サービスを構成することもできます。詳細については、「APIリファレンス」および「一般的なServerless Devsコマンド」をご参照ください。
HTTP関数は送信先関数としてサポートされていませんが、同期および非同期呼び出しはサポートしています。詳細については、「HTTP呼び出しメソッド」をご参照ください。
非同期呼び出しの結果コールバック機能を構成する際に、非同期タスクモードを有効にすることもできます。詳細については、「非同期タスク」をご参照ください。