AWS 람다 함수가 다른 함수를 호출할 수 있습니까?
두 개의 람다 함수가 있습니다. 하나는 견적을 생성하는 함수이고 다른 하나는 견적을 주문으로 변환하는 함수입니다.저는 Order lambda 함수가 단순히 신뢰할 수 없는 클라이언트로부터 받는 것이 아니라 Quote 함수를 호출하여 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 에서 찾을 수 있습니다.
은 당신의 인체연합을 사슬을 묶어야 .Lambda functions경유로SNS이 접근 방식은 최소한의 노력으로 우수한 성능, 대기 시간 및 확장성을 제공합니다.
의 첫번째 당의첫번째신.Lambda를 메지게에 합니다.SNS Topic 두 그고두번째리▁and째.Lambda이 항목에 가입되어 있습니다. 번째,가 도착하자마자, 두 번째, 두에메가도마자자하착, 번째주지시제.Lambda메시지를 입력 매개 변수로 사용하여 실행됩니다.
Amazon SNS 알림을 사용하여 람다 함수 호출을 참조하십시오.
이 방법을 사용하여 SNS를 통해 교차 계정 람다 함수를 호출할 수도 있습니다.
여기 파이썬의 샘플 코드가 있습니다.
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().isoformat()}
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": "*"
}
이 질문이 있은 이후 아마존은 Step Functions(https://aws.amazon.com/step-functions/) 를 출시했습니다.
AWS Lambda의 핵심 원칙 중 하나는 비즈니스 로직에 더 집중할 수 있고 이를 모두 연결하는 애플리케이션 로직에 더 집중할 수 있다는 것입니다.단계 함수를 사용하면 코드를 작성하지 않고도 함수 간의 복잡한 상호 작용을 조정할 수 있습니다.
이 솔루션은 boto3 및 Python을 사용하여 수행됩니다.
import boto3
import json
lambda_client = boto3.client('lambda', region_name='eu-west-1')
def lambda_handler(event, context):
lambda_client.invoke(FunctionName = 'function_name', InvocationType = 'RequestResponse', Payload = json.dumps(event))
return True
람다 클라이언트 문서(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
}
}
}
스텝 함수를 사용하면 여러 람다 함수를 쉽게 작성하고 순차 또는 병렬로 실행할 수 있습니다.람다 단계 함수에 대한 자세한 내용은 여기에서 확인할 수 있습니다. 단계 함수
많은 답변이 있지만 다른 람다 함수를 호출하는 것이 동기식 호출에 권장되는 솔루션이 아니며 실제로 사용해야 하는 것은 단계 함수입니다.
권장 솔루션이 아닌 이유:
- 두 기능이 서로를 기다리고 있을 때 두 기능에 대한 비용을 지불하는 것입니다.
- 코드가 검색을 담당합니다.
병렬 단계 및 캐치 실패와 같은 매우 복잡한 논리에도 사용할 수 있습니다.또한 모든 실행이 로그아웃되어 디버깅이 훨씬 간편해집니다.
자바에서는 다음과 같이 할 수 있습니다.
AWSLambdaAsync awsLambdaAsync = AWSLambdaAsyncClientBuilder.standard().withRegion("us-east-1").build();
InvokeRequest invokeRequest = new InvokeRequest();
invokeRequest.withFunctionName("youLambdaFunctionNameToCall").withPayload(payload);
InvokeResult invokeResult = awsLambdaAsync.invoke(invokeRequest);
여기서 payload는 호출 람다에서 호출된 람다로 일부 정보를 전달해야 하는 경우 다른 람다로 Json 개체로 전달해야 하는 문자열화된 Java 개체입니다.
블루스킨에서 제공한 답변으로 작업하고 있었지만 호출 때문에 페이로드 응답을 읽을 수 없었습니다.Type= 'Event'가 비동기식이어서 호출로 변경했습니다.='RequestResponse'를 입력하면 모두 정상적으로 작동합니다.
Async.js Waterfall 기능을 사용할 수도 있습니다. 예는 이 문서의 3단계에서 빅코드 청크의 하단 부분을 참조하십시오.
https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-lambda/
다른 사람들은 SQS와 단계 기능을 사용해야 한다고 지적했습니다.그러나 이 두 가지 솔루션은 모두 추가 비용을 발생시킵니다.Step Function 상태 전환에는 많은 비용이 소요됩니다.
AWS 람다는 몇 가지 재시도 로직을 제공합니다.3번 시도하는 곳.당신이 API를 사용하여 트리거할 때 그것이 여전히 유효한지 모르겠습니다.
다음은 다른 람다 함수를 호출하여 응답을 얻는 파이썬 예제입니다.호출 유형은 '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)
다음을 사용하여 (적어도 Java를 통해) 직접 람다 함수를 호출할 수 있습니다.AWSLambdaClientAWS의 블로그 게시물에 설명된 바와 같이.
저도 같은 문제를 겪고 있지만 제가 구현한 람다 함수는 DynamoDB에 항목을 삽입할 것이므로 제 솔루션은 DynamoDB Trigger를 사용합니다.
테이블의 모든 삽입/업데이트에 대해 DB가 람다 함수를 호출하도록 하여 두 람다 함수의 구현을 분리합니다.
설명서는 다음과 같습니다. 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
완전한 aws-sdk 패키지를 설치하지 않고 Javascript/typescript로 할 수 있는 방법은 다음과 같습니다.
import { InvokeCommand, LambdaClient, LogType } from "@aws-sdk/client-lambda";
const client = new LambdaClient({
region: "US-EAST-1"
});
const payload = JSON.stringify({
data: "your input"
})
const command = new InvokeCommand({
FunctionName: "your function name",
Payload: payload,
LogType: LogType.Tail,
});
const { Payload } = await client.send(command);
const response: any = Payload;
const result = Buffer.from(response).toString();
return result;
다른 람다 함수에서 직접 람다 함수를 비동기식으로 트리거할 수 있습니다.
https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#invocation-async-destinations
AWS 람다 함수가 다른 단순 C# 코드를 호출할 수 있습니까?
InvokeRequest RebookingLambdalambda = new InvokeRequest
{
FunctionName = "Name"
InvocationType = InvocationType.RequestResponse,
Payload = "Json Data"
};
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();
언급URL : https://stackoverflow.com/questions/31714788/can-an-aws-lambda-function-call-another
'programing' 카테고리의 다른 글
| MongoDB 캐시 시스템 이해 (0) | 2023.05.14 |
|---|---|
| "ViewController라는 클래스에 대한 정보를 찾을 수 없습니다." (0) | 2023.05.14 |
| 내부의.SQL Azure의 Net Framework 데이터 공급자 오류 6 (0) | 2023.05.14 |
| 페이지를 나가기 전에 저장하지 않은 변경 사항에 대해 사용자에게 경고 (0) | 2023.05.09 |
| 생성자와 ngOnInit의 차이점 (0) | 2023.05.09 |