web-dev-qa-db-ja.com

API Gatewayに応答を送信した後でもAWS Lambdaがバックグラウンドで実行される

私はネット全体を検索しましたが、この機能を成功させる方法の解決策は見つかりませんでした。助けが必要です。

私の要件は:node.jsで記述されたawsラムダ関数をトリガーし、aws-serverless-expressモジュールを使用する場合、APIゲートウェイに応答を迅速に送信する必要がありますが、それでも終了せず、バックエンドで実行する必要があります。クラウドウォッチログを見ることができました。非同期でなければなりません。

コードスニペットは次のとおりです。

    app.get('/check', function(req, res){
     method.invoke(req)
     res.status(200).send('success')
   })

私はこのようにして確認しましたが、ラムダ関数が停止し、APIゲートウェイに応答を返します。バックエンドでmethod.invoke()関数を実行していません。

私が理解している、または間違っていることを訂正してください。私はこのリンクで確認しました: AWS Lambdaを呼び出してAPI Gatewayに非同期で応答を返します

これがこの問題を解決する唯一の方法ですか? 2つのラムダ関数を作成します。

18
learner

これは、API Gatewayに接続された AWS Lambda Step functions を使用して、2つのラムダ関数を使用してブランチを並列実行することで実現できます。

6
Ashan

Step Functionsのほかに、Lambda環境に組み込まれたSDKを使用して、別のLambda関数を呼び出すことができます。

私はExpressやNodeJSの専門家ではありませんが、HTTP応答を返送してコード実行を継続する方法があるはずだとも思います。

3
Jack Kohn - AWS

ここではステップ関数が最良の解決策のようです。 @Ashanの返信を参照してください。それとは別に、lambda nodejs sdkで新しいinvokeメソッドを使用できます。 invokeAsyncは非推奨になりました。 InvocationTypeをEventに設定できます。以下の例を参照してください。これは here から取得されます

var params = {
  ClientContext: "MyApp", 
  FunctionName: "MyFunction", 
  InvocationType: "Event", 
  LogType: "Tail", 
  Payload: <Binary String>, 
  Qualifier: "1"
 };
 lambda.invoke(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
   /*
   data = {
    FunctionError: "", 
    LogResult: "", 
    Payload: <Binary String>, 
    StatusCode: 123
   }
   */
 }); 

使用例の1つは、最初の関数が即時応答を返し、タスクを実行して最終的にWebhookを呼び出す別のラムダ関数をトリガーすることです。

0
dilantha111

AWSのドキュメントへのリンクが見つかりませんが、通常、Lambda関数が応答を返した後、処理を続行することはできません。 利用可能なランタイム (さまざまなプログラミング言語用)が構築される方法はこれだけではありません。

個別の非同期プロセスを呼び出す(たとえば、他のLambda関数リクエスト、または作業をキューに入れる)か、または AWS Step functions を使用する方法は、ここで述べたように、3つ目の方法があります。 カスタムランタイム このニーズに対応するAWS Lambda関数用。

標準ランタイムの横に、AWS Lambda関数に使用する カスタムランタイムを作成して指定 できます。標準ランタイムでは、ハンドラーの応答はLambda実行コンテキストにポストされます。その後、ハンドラーが終了している(または少なくとも:一時停止している)ため、ハンドラーでアクティビティは実行できません。

したがって、応答を送信した後に追加の処理を可能にするトリックは、bootstrapスクリプト...そして、すでに応答を送信した後、Lambda関数ハンドラで処理を続行します。カスタムランタイムを使用すると、Lambda関数での処理は、カスタムランタイムの構築方法ではないため、応答の送信後に終了しません。

LambdaのオペレーティングコンテキストとLambda関数ハンドラーの間の責任を台無しにするため、アーキテクチャ的に最適なソリューションではありませんが、応答を送信した後、Lambda関数ハンドラーで処理を行うことができます。