AWS Lambda에서 다른 Lambda 실행

Invoke API

AWS Lambda의 invoke api로 lambda function 실행 중에 다른 lambda function을 실행하는 것이 가능하다. Python 기준으로 시험해보았다. 거기서 거기지만, 데이터를 JSON으로 주고받기 때문에 Node.js에서 조금 더 쉬워 보인다. 문서 한글화가 아직 이라 간단히 정리해보았다.

참조 공식 문서

API Request Parameters

  • FunctionName : 실행하려는 함수의 이름. 이름만 써도 되고 ARN을 써도 된다.
  • InvocationType : 실행 타입 지정. 현재 3가지 설정이 있다.
    • RequestResponse : 기본값. 동기적으로 실행한다.
    • Event : 비동기적으로 실행한다.
    • DryRun : 실행 권한과 입력값에 대해 검증만 하고 실제로 실행하지는 않는다.
  • LogType : 실행 후 반환되는 로그값에 대한 설정
    • None : 미설정
    • Tail : 로그의 마지막 4kb 부분만 반환받는다.
  • Qualifier : 실행할 Lambda function의 version이나 alias를 지정할 수 있다.
  • Payload : JSON 포맷의 문자열. 데이터 전달을 위해 사용하며, 실행할 Lambda function의 event인자로 전달된다.

API Response Parameters

  • StatusCode : HTTP status code
  • FunctionError : 에러 발생 시 에러 타입을 반환
  • LogResult : RequestResponse로 요청하고, 로그 설정을 지정했을 때 반환한다. Base64로 인코딩돼있다.
  • Payload : 실행한 Lambda function의 반환 값

Policy 설정

다른 Lambda function을 실행하는 Lambda function은 invoke에 대한 권한을 가진 Role이 설정돼있어야 한다. ‘lambda:InvokeFunction’을 Role에 추가하면 된다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "lambda:InvokeFunction"
      ],
      "Resource": "*"
    }
  ]
}

간단한 코드 예시

데이터와 함께 다른 Lambda function을 실행하는 간단한 코드다.

  • 다른 Lambda를 실행하는 Lambda

    # caller
    import json
    import boto3
    
    client = boto3.client('lambda')
    
    def lambda_handler(event, context):
        payload = {
            'message': "Hello from Caller"
        }
        response = client.invoke(
            FunctionName="callee",
            Payload=json.dumps(payload)
        )
    
  • 실행되는 Lambda

    # callee
    import json
    
    def lambda_handler(event, context):
        print("event => " + json.dumps(event))
        return "Hello from callee"
    

위와 같이 ‘caller’와 ‘callee’ 두 Lambda function을 만들고, ‘caller’를 실행하면 CloudWatch Log를 통해 ‘callee’의 실행 로그를 확인할 수 있다.

callee's log