私には2つのLambda関数があります。1つは見積もりを生成する関数で、もう1つは見積もりを注文に変換する関数です。Order lambda関数で、信頼されていないクライアントから単に受け取るのではなく、Quote関数を呼び出して、見積もりを再生成したいと思います。
私は考えられるあらゆるところを見てきましたが、関数のチェーンや呼び出しをどのように行うのかわかりません...これは確かに存在します!
私には2つのLambda関数があります。1つは見積もりを生成する関数で、もう1つは見積もりを注文に変換する関数です。Order lambda関数で、信頼されていないクライアントから単に受け取るのではなく、Quote関数を呼び出して、見積もりを再生成したいと思います。
私は考えられるあらゆるところを見てきましたが、関数のチェーンや呼び出しをどのように行うのかわかりません...これは確かに存在します!
回答:
を使用する方法を見つけました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
InvocationType: 'Event'
パラメータのおかげでこれを機能させることができました(FunctionName
andの後に追加してくださいPayload
)。ドキュメントから:「必要に応じて、InvocationTypeとしてEventを指定することにより、非同期実行をリクエストできます。」非同期実行では、コールバック関数は確実に呼び出されますが、呼び出されたラムダの実行が完了するのを待つ必要はありません。
AWSLambdaRole
。または、次のステートメントオブジェクトをロールの既存のポリシーに追加できます: '{"Effect": "Allow"、 "Action":["lambda:InvokeFunction"]、 "Resource":["*"]} `
Lambda functions
via をチェーンする必要がありますSNS
。このアプローチは、最小限の労力で優れたパフォーマンス、遅延、およびスケーラビリティを提供します。
最初のLambda
ユーザーは自分にメッセージを公開SNS Topic
し、2番目のLambda
ユーザーはこのトピックにサブスクライブしています。メッセージがトピックに到着するとすぐにLambda
、そのメッセージを入力パラメーターとして、second が実行されます。
Amazon SNS通知を使用したLambda関数の呼び出しを参照してください。
このアプローチを使用して、SNS経由でクロスアカウントLambda関数を呼び出すこともできます。
これが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": "*"
}
datetime.now()
文字列に変換する(または何らかの方法で処理する)必要があります。そうでない場合、エラーが発生しますdatetime.datetime(2017, 9, 11, 14, 40, 53, 23834) is not JSON serializable
InvocationType
次のようになりますRequestResponse
。呼び出そうとしているラムダから応答を取得する。
この質問があったため、AmazonはStep Functions(https://aws.amazon.com/step-functions/)をリリースしました。
AWS Lambdaの背後にある主要な原則の1つは、ビジネスロジックに集中でき、それをすべて結び付けるアプリケーションロジックに集中できないということです。ステップ関数を使用すると、コードを記述しなくても、関数間の複雑な相互作用を調整できます。
このソリューションは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
Lambdaクライアントのドキュメント(Javaバージョン)でこれが見られるまで、私はSNSの切り取りを検討していました。
AWS Lambdaにアクセスするためのクライアント。このクライアントを使用して行われたすべてのサービス呼び出しはブロックされており、サービス呼び出しが完了するまで戻りません。
したがって、SNSには明らかな利点があります。それは非同期です。ラムダは、後続のラムダが完了するのを待ちません。
Amazonは2016年にAWS lambdaにステップ関数を導入しました。今では、ステップ関数を本当に簡単に使用できるので、ステップ関数を使用する方が便利です。次の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
}
}
}
ステップ関数を使用すると、複数のラムダ関数を簡単に作成して、シーケンスまたは並列で実行できます。ラムダステップ関数の詳細については、こちらをご覧ください: ステップ関数
Javaでは、次のようにできます。
AWSLambdaAsync awsLambdaAsync = AWSLambdaAsyncClientBuilder.standard().withRegion("us-east-1").build();
InvokeRequest invokeRequest = new InvokeRequest();
invokeRequest.withFunctionName("youLambdaFunctionNameToCall").withPayload(payload);
InvokeResult invokeResult = awsLambdaAsync.invoke(invokeRequest);
ここで、payloadは文字列化された javaオブジェクトであり、ラムダの呼び出しからラムダの呼び出しに情報を渡す必要がある場合に備えて、Jsonオブジェクトとして別のラムダに渡す必要があります。
Async.jsウォーターフォール機能を利用できる場合があります。例については、このドキュメントのステップ3のビッグコードチャンクの下部を参照してください。
https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-lambda/
同じ問題がありますが、実装するLambda関数がDynamoDBにエントリを挿入するため、私のソリューションではDynamoDBトリガーを使用します。
テーブル内のすべての挿入/更新に対して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/
一種のラウンドアバウトソリューションですが、ラムダ関数をチェーンする必要があるときは、ラムダ関数のAPIエンドポイントを呼び出すだけです。これにより、コーディング中に非同期にするかどうかを決定できます。
POSTリクエストを設定したくない場合は、イベントを簡単に渡すために、クエリ文字列パラメーターを2つまたはまったく使用しない単純な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
これは、別のラムダ関数を呼び出してその応答を取得するPythonの例です。2つの呼び出しタイプ'RequestResponse'と'Event'があります。ラムダ関数の応答を取得する場合は「RequestResponse」を使用し、ラムダ関数を非同期に呼び出すには「イベント」を使用します。したがって、非同期と同期の両方の方法が利用できます。
lambda_response = lambda_client.invoke(
FunctionName = lambda_name,
InvocationType = 'RequestResponse',
Payload = json.dumps(input)
)
resp_str = lambda_response['Payload'].read()
response = json.loads(resp_str)