Programing

AWS Lambda 함수가 다른 함수를 호출 할 수 있습니까

lottogame 2020. 3. 28. 10:13
반응형

AWS 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


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": "*"
    }

이 질문이 제기 된 이후 Amazon은 Step Functions ( https://aws.amazon.com/step-functions/ )를 릴리스했습니다 .

AWS Lambda의 기본 원칙 중 하나는 비즈니스 로직에 더 집중할 수 있고이를 모두 결합하는 애플리케이션 로직에 집중할 수 없다는 것입니다. 단계 함수를 사용하면 코드를 작성하지 않고도 함수 간 복잡한 상호 작용을 조정할 수 있습니다.


Lambda 클라이언트 문서 (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

아마존은 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 함수를 사용하면 여러 람다 함수를 쉽게 작성하고 순서대로 또는 병렬로 실행할 수 있습니다. 여기 람다 단계 함수에 대한 자세한 정보를 얻을 수 있습니다 : 단계 기능을


blueskin에서 제공 한 답변으로 작업 했지만 InvocationType = 'Event'async 이므로 Payload 응답을 읽을 수 없으므로 InvocationType = 'RequestResponse'로 변경되어 이제는 모두 잘 작동합니다.


자바에서는 다음과 같이 할 수 있습니다.

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/


AWSLambdaClientAWS 블로그 게시물에 설명 된대로 람다 함수를 직접 (적어도 Java를 통해) 호출 할 수 있습니다 .


동일한 문제가 있지만 구현하는 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


다른 사람들은 SQS와 Step Functions를 사용한다고 지적했습니다. 그러나이 두 가지 솔루션 모두 추가 비용이 발생합니다. Step Function 상태 전이는 매우 비싸다.

AWS Lambda는 몇 가지 재시도 로직을 제공합니다. 3 번 시도하는 곳. API를 사용하여 트리거 할 때 여전히 유효한지 확실하지 않습니다.


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

반응형