web-dev-qa-db-ja.com

AWS Lambda関数は別の関数を呼び出すことができます

私は2つのLambda関数を持っています - 一つは見積もりを生成するもので、もう一つは見積もりを注文に変えるものです。信頼できないクライアントから見積もりを受け取るのではなく、Order lambda関数で見積もり関数を呼び出して見積もりを再生成したいのです。

私は私が考えることができるどこでも見ました - しかし、私がどのように連鎖するか、または機能を呼び出すことになるかについて見ることができません…確かにこれは存在します!

229
Silver

私はaws-sdkを使う方法を見つけました。

var aws = require('aws-sdk');
var lambda = new aws.Lambda({
  region: 'us-west-2' //change to your region
});

lambda.invoke({
  FunctionName: 'name_of_your_lambda_function',
  Payload: JSON.stringify(event, null, 2) // pass params
}, function(error, data) {
  if (error) {
    context.done('error', error);
  }
  if(data.Payload){
   context.succeed(data.Payload)
  }
});

あなたはここでドキュメントを見つけることができます: http://docs.aws.Amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

277
Nicolas Grenié

あなたはあなたのLambda functionsSNSを介してチェーンするべきです。このアプローチは、最小限の労力で優れたパフォーマンス、待ち時間、およびスケーラビリティを提供します。

あなたの最初のLambdaはあなたのSNS Topicにメッセージをパブリッシュし、2番目のLambdaはこのトピックを購読しています。メッセージがトピックに到着するとすぐに、2番目のLambdaがそのメッセージを入力パラメーターとして実行されます。

Amazon SNS通知を使用したLambda関数の呼び出し を参照してください。

SNS経由でクロスアカウントLambda関数を呼び出すためにこのアプローチを使うこともできます

86
kixorz

これがpythonのサンプルコードです。

from boto3 import client as boto3_client
from datetime import datetime
import json

lambda_client = boto3_client('lambda')

def lambda_handler(event, context):
    msg = {"key":"new_invocation", "at": datetime.now()}
    invoke_response = lambda_client.invoke(FunctionName="another_lambda_",
                                           InvocationType='Event',
                                           Payload=json.dumps(msg))
    print(invoke_response)

ところで、あなたは同様にあなたのラムダ役割にこのような方針を加える必要があるでしょう

   {
        "Sid": "Stmt1234567890",
        "Effect": "Allow",
        "Action": [
            "lambda:InvokeFunction"
        ],
        "Resource": "*"
    }
50
blueskin

この質問を受けて以来、AmazonはStep Functions( https://aws.Amazon.com/step-functions/ )をリリースしました。

AWS Lambdaの背後にある中心的な原則の1つは、ビジネスロジックに重点を置くことができ、それをすべて結び付けるアプリケーションロジックに重点を置くことができないということです。ステップ関数を使用すると、コードを記述しなくても、関数間の複雑な相互作用を調整できます。

22
dustinnoe

Lambda client docs(Java版)でこれを見るまで、SNSを切り取ることを検討していました

AWS Lambdaにアクセスするためのクライアント。このクライアントを使用して行われたすべてのサービス呼び出しはブロックされており、サービス呼び出しが完了するまで戻りません。

つまりSNSには明らかな利点があります。それは非同期です。あなたのラムダは次のラムダが完了するのを待ちません。

9
Ben Iggulden

この解決策はboto3とPythonを使って行われます。

import boto3
import json

invokeLambda = boto3.client('lambda', region_name='eu-west-1')

def lambda_handler(event, context):
    invokeLambda.invoke(FunctionName = 'function_name', InvocationType = 'RequestResponse', Payload = json.dumps(event))

    return True
5

blueskin によって提供された回答を処理していましたが、 InvocationType = 'Event' async であるためペイロードレスポンスを読み取ることができませんでした。すべてうまくいきます。

4
antonio

Amazonは2016年にAWS lambdaにstep関数を導入しました。本当に使いやすいので、steps関数を使う方が便利だと思います。次のように2つのラムダ関数を使ってステートマシンを構築できます。

  • 見積もりを作成する
  • 見積もりを注文に変える

あなたは以下のように簡単にそれをすることができます:

ここでは最初の状態で見積もりを生成し、別の状態で順序を変えることができます

{
  Comment: "Produce a quote and turns into an order",
  StartAt: "ProduceQuote",
  States: {
    ProduceQuote: {
      "Type": Task,
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:ProduceQuote",
      "next": TurnsToOrder
    }
    TurnsToOrder: {
      Type: Task,
      Resource: "arn:aws:lambda:us-east-1:123456789012:function:ProduceQuote",
      end: true
    }
  }
}

Steps関数を使用すると、複数のラムダ関数を記述して順番に実行することも並列に実行することも非常に簡単になります。あなたはここでラムダステップ関数についてのより多くの情報を得ることができます: ステップ関数

3
Sunil Kapil

Javaでは、次のようにします。

AWSLambdaAsync awsLambdaAsync = AWSLambdaAsyncClientBuilder.standard().withRegion("us-east-1").build();

InvokeRequest invokeRequest = new InvokeRequest();
invokeRequest.withFunctionName("youLambdaFunctionNameToCall").withPayload(payload);

InvokeResult invokeResult = awsLambdaAsync.invoke(invokeRequest); 

ここで、ペイロードはあなたの stringified Javaオブジェクトであり、あなたがlambdaを呼び出すことからlambdaを呼び出すことまで何らかの情報を渡す必要がある場合にはJsonオブジェクトとして他のlambdaに渡す必要があります。

2
Suyash

Async.jsのWaterfall機能を利用できるかもしれません。例として、この文書のステップ3のビッグコードチャンクの下部を参照してください。

https://aws.Amazon.com/blogs/compute/better-together-Amazon-ecs-and-aws-lambda/ /

2
Mike

ラウンドアバウト解決策のようなものですが、私はそれらをチェーニングする必要があるとき私のラムダ関数のために APIエンドポイント を呼び出すだけです。これにより、コーディング中にそれらを非同期にするかどうかを決定できます。

POSTリクエストを設定したくない場合は、単純なGETリクエストをカップルで設定するか、またはまったく文字列パラメータを設定しないで簡単にイベントを渡すことができます。

- 編集 -

参照してください: https://docs.aws.Amazon.com/apigateway/api-reference/making-http-requests/

そして: http://docs.aws.Amazon.com/lambda/latest/dg/with-on-demand-https-example.html

1
Anselm

AWSのブログ post に記載されているようにAWSLambdaClientを使用することで、ラムダ関数を直接(少なくともJava経由で)呼び出すことができます。

1
Neil

私は同じ問題を抱えていますが、私が実装するLambda関数はDynamoDBにエントリを挿入するので、私のソリューションではDynamoDB Triggersを使用します。

テーブル内のすべての挿入/更新に対してDBにLambda関数を呼び出させるようにします。したがって、これは2つのLambda関数の実装を分離します。

ドキュメントはこちらです: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html

ここでガイド付きのチュートリアルです: https://aws.Amazon.com/blogs/aws/dynamodb-update-triggers-streams-lambda-cross-region-replication-app/ /

1
Lewen

AWS_REGION環境を設定できます。

assert(process.env.AWS_REGION, 'Missing AWS_REGION env (eg. ap-northeast-1)');
const aws = require('aws-sdk');
const lambda = new aws.Lambda();
0
hojin