私は2つのLambda関数を持っています - 一つは見積もりを生成するもので、もう一つは見積もりを注文に変えるものです。信頼できないクライアントから見積もりを受け取るのではなく、Order lambda関数で見積もり関数を呼び出して見積もりを再生成したいのです。
私は私が考えることができるどこでも見ました - しかし、私がどのように連鎖するか、または機能を呼び出すことになるかについて見ることができません…確かにこれは存在します!
私は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
あなたはあなたのLambda functions
をSNS
を介してチェーンするべきです。このアプローチは、最小限の労力で優れたパフォーマンス、待ち時間、およびスケーラビリティを提供します。
あなたの最初のLambda
はあなたのSNS Topic
にメッセージをパブリッシュし、2番目のLambda
はこのトピックを購読しています。メッセージがトピックに到着するとすぐに、2番目のLambda
がそのメッセージを入力パラメーターとして実行されます。
Amazon 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": "*"
}
この質問を受けて以来、AmazonはStep Functions( https://aws.Amazon.com/step-functions/ )をリリースしました。
AWS Lambdaの背後にある中心的な原則の1つは、ビジネスロジックに重点を置くことができ、それをすべて結び付けるアプリケーションロジックに重点を置くことができないということです。ステップ関数を使用すると、コードを記述しなくても、関数間の複雑な相互作用を調整できます。
Lambda client docs(Java版)でこれを見るまで、SNSを切り取ることを検討していました :
AWS Lambdaにアクセスするためのクライアント。このクライアントを使用して行われたすべてのサービス呼び出しはブロックされており、サービス呼び出しが完了するまで戻りません。
つまりSNSには明らかな利点があります。それは非同期です。あなたのラムダは次のラムダが完了するのを待ちません。
この解決策は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
blueskin によって提供された回答を処理していましたが、 InvocationType = 'Event' が async であるためペイロードレスポンスを読み取ることができませんでした。すべてうまくいきます。
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関数を使用すると、複数のラムダ関数を記述して順番に実行することも並列に実行することも非常に簡単になります。あなたはここでラムダステップ関数についてのより多くの情報を得ることができます: ステップ関数
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に渡す必要があります。
Async.jsのWaterfall機能を利用できるかもしれません。例として、この文書のステップ3のビッグコードチャンクの下部を参照してください。
https://aws.Amazon.com/blogs/compute/better-together-Amazon-ecs-and-aws-lambda/ /
ラウンドアバウト解決策のようなものですが、私はそれらをチェーニングする必要があるとき私のラムダ関数のために 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
AWSのブログ post に記載されているようにAWSLambdaClient
を使用することで、ラムダ関数を直接(少なくともJava経由で)呼び出すことができます。
私は同じ問題を抱えていますが、私が実装する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/ /
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();