2 개의 Lambda 함수가 있습니다-하나는 견적을 생성하고 하나는 견적을 주문으로 바꿉니다. Order lambda 함수가 신뢰할 수없는 클라이언트로부터 견적을받는 것이 아니라 견적 함수를 호출하여 견적을 재생성하고 싶습니다.
나는 내가 생각할 수있는 모든 곳을 보았지만 함수를 연결하거나 호출하는 방법을 볼 수는 없습니다 ... 확실히 이것이 존재합니다!
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
InvocationType: 'Event'
매개 변수 덕분 에이 작업을 수행 할 수있었습니다 ( FunctionName
및 뒤에 추가하십시오 Payload
). 문서에서 : "선택적으로 Event를 InvocationType으로 지정하여 비동기 실행을 요청할 수 있습니다." 비동기 실행을 사용하면 콜백 함수가 안정적으로 호출되지만 호출 된 람다는 실행이 끝날 때까지 기다릴 필요가 없습니다.
AWSLambdaRole
합니다. 또는 역할의 기존 정책에 다음 명령문 오브젝트를 추가 할 수 있습니다. '{ "Effect": "Allow", "Action": [ "lambda : InvokeFunction"], "Resource": [ "*"]}`
Lambda functions
를 통해 체인을 연결해야합니다 SNS
. 이 접근 방식은 최소한의 노력으로 우수한 성능, 대기 시간 및 확장 성을 제공합니다.
첫 번째 는 Lambda
귀하에게 메시지를 게시 SNS Topic
하고 두 번째 Lambda
는이 주제를 구독합니다. 메시지가 주제에 도착하자마자 두 번째 Lambda
는 메시지를 입력 매개 변수로 사용하여 실행됩니다.
Amazon SNS 알림을 사용하여 Lambda 함수 호출을 참조하십시오 .
이 접근 방식을 사용 하여 SNS를 통해 교차 계정 Lambda 함수를 호출 할 수도 있습니다 .
다음은 파이썬 샘플 코드입니다.
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)
Btw, 람다 역할에 이와 같은 정책을 추가해야합니다.
{
"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의 기본 원칙 중 하나는 비즈니스 로직에 더 집중할 수 있고이를 모두 결합하는 애플리케이션 로직에 집중할 수 없다는 것입니다. 단계 함수를 사용하면 코드를 작성하지 않고도 함수 간 복잡한 상호 작용을 조정할 수 있습니다.
이 솔루션은 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는 분명한 장점이 있습니다. 그것은 비동기 적입니다. 람다는 후속 람다가 완료되기를 기다리지 않습니다.
아마존은 2016 년에 AWS 람다에 단계 함수를 도입했습니다. 이제는 단계 함수를 사용하는 것이 매우 편리하므로 단계 함수를 사용하는 것이 더 편리하다고 생각합니다. 다음과 같이 두 개의 람다 함수를 사용하여 상태 머신을 빌드 할 수 있습니다.
아래와 같이 쉽게 할 수 있습니다.
여기에서 견적을 생성하는 첫 번째 상태와 순서로 변환 할 다른 상태를 가질 수 있습니다.
{
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 함수를 사용하면 여러 람다 함수를 쉽게 작성하고 순서대로 또는 병렬로 실행할 수 있습니다. 여기 람다 단계 함수에 대한 자세한 정보를 얻을 수 있습니다 : 단계 기능을
자바에서는 다음과 같이 할 수 있습니다.
AWSLambdaAsync awsLambdaAsync = AWSLambdaAsyncClientBuilder.standard().withRegion("us-east-1").build();
InvokeRequest invokeRequest = new InvokeRequest();
invokeRequest.withFunctionName("youLambdaFunctionNameToCall").withPayload(payload);
InvokeResult invokeResult = awsLambdaAsync.invoke(invokeRequest);
여기에서 페이로드는 람다 호출에서 호출 된 람다에 대한 정보를 전달 해야하는 경우를 대비하여 Json 객체로 다른 람다에 전달 해야하는 문자열 화 된 Java 객체입니다.
Async.js Waterfall 기능을 사용할 수 있습니다. 예를 보려면이 문서의 3 단계에서 큰 코드 청크의 맨 아래 부분을 참조하십시오.
https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-lambda/
동일한 문제가 있지만 구현하는 Lambda 함수가 DynamoDB에 항목을 삽입하므로 솔루션에서 DynamoDB 트리거를 사용합니다.
DB가 테이블의 모든 삽입 / 업데이트에 대해 Lambda 함수를 호출하게하므로 두 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 요청을 설정하지 않으려는 경우 이벤트 전달을 쉽게하기 위해 쿼리 문자열 매개 변수를 몇 개 또는 전혀 사용하지 않고 간단한 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
다음은 다른 람다 함수를 호출하고 응답을 얻는 파이썬 예제입니다. 'RequestResponse' 및 'Event'의 두 가지 호출 유형이 있습니다 . 람다 함수의 응답을 얻으려면 'RequestResponse'를 사용하고 'Event'를 사용하여 람다 함수를 비동기 적으로 호출하십시오. 따라서 비동기 및 동기 방식을 모두 사용할 수 있습니다.
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)