본문 바로가기

AWS/Lambda

AWS Documents: Lambda 시작하기

이 문서의 내용

    AWS 람다(Lambda)란?

    AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스입니다.

    Lambda가 지원하는 언어를 사용하여 함수를 작성하고, 필요한만큼 이를 호출하여 실행합니다.

    함수가 실행되는 컴퓨팅 시간만큼 비용이 청구(AWS Lambda 요금표 참고)되며, 코드가 실행되지 않고 있을때는 요금이 부과되지 않습니다.

    AWS 콘솔에서 Lambda 시작하기

    Lambda를 시작하려면 Lambda 콘솔에서 함수를 생성합니다.

    이 예제에서는 lengthwidth라는 레이블이 붙은 2개의 정수 값을 포함하는 JSON 객체를 사용합니다.

    Lambda 함수는 이 값을 곱하여 면적을 계산하고 JSON 문자열로 반환합니다.

    1. Lambda 콘솔의 함수 페이지를 엽니다. 
    2. 함수 생성(Create function)을 선택합니다.
    3. 새로 작성을 선택합니다.
    4. 기본 정보 창의 함수 이름에 myLambdaFunction을 입력합니다.
    5. 런타임에서 Node.js 18.x 또는 Python 3.11을 선택합니다.
    6. 아키텍처를 x86_64로 설정된 상태로 두고 함수 생성을 선택합니다.

    Hello from Lambda!라는 메시지를 반환하는 함수를 생성합니다.

    Code(코드) 탭을 선택합니다.

    함수 생성 과정에서 선택한 언어에 따라서 코드를 입력합니다.

    Node.js 18.x를 선택한 경우 다음 코드 입력을 완료하고 배포(Deploy)를 선택합니다.

    export const handler = async (event, context) => {
      
      const length = event.length;
      const width = event.width;
      var area = calculateArea(length, width);
      console.log(`The area is ${area}`);
            
      console.log('CloudWatch log group: ', context.logGroupName);
      
      const data = {
        "area": area,
      };
        return JSON.stringify(data);
        
      function calculateArea(length, width) {
        return length * width;
      }
    };
    코드 설명
    Line 1 Lambda 핸들러 Lambda 함수에는 handler라는 Node.js 함수가 포함됩니다. 
    Node.js의 Lambda 함수에는 둘 이상의 Node.js 함수가 포함 될 수 있지만 handler 함수는 항상 코드의 진입점입니다.
    함수가 간접적으로 호출되면 Lambda가 이 메서드를 실행합니다.
    콘솔을 사용하여 hello world 함수를 생성하면 Lambda는 자동으로 함수에 대한 핸들러 메서드의 이름을 handler로 설정합니다.
    Line 1 Lambda 이벤트 객체 handler 함수는 event와 context 두 가지 인수를 사용합니다. 
    Lambda의 이벤트는 함수가 처리할 데이터가 포함된 JSON 형식의 문서입니다. 
    다른 AWS 서비스에서 함수를 간접적으로 호출하는 경우 이벤트 객체에는 간접 호출을 일으킨 이벤트에 대한 정보가 포함됩니다.
    (e.g. AWS S3 버킷이 함수를 간접적으로 호출하면 이벤트에 AWS S3 버킷 이름과 객체 키가 포함됩니다)
    Line 1 Lambda 컨텍스트 객체 함수가 사용하는 두 번째 인자는 context입니다. 
    Lambda는 컨텍스트 객체를 함수에 자동으로 전달합니다. 
    컨텍스트 객체에는 함수 간접 호출과 실행 환경에 대한 정보가 포함됩니다.
    (e.g. 예제에서는 logGroupName 파라미터를 사용하여 CloudWatch Logs 그룹의 이름을 출력합니다)
    Line 6:8 Lambda에서 로깅 Node.js를 사용하면 console.log 및 console.error와 같은 콘솔 메서드를 사용하여 함수의 로그 정보를 보낼 수 있습니다.
    (e.g. 예제 코드에서는 console.log 문을 사용하여 계산된 면적과 함수의 CloudWatch Logs 그룹의 이름을 출력합니다)

    Python 3.11을 선택한 경우 다음 코드 입력을 완료하고 배포(Deploy)를 선택합니다.

    import json
    import logging
    
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    def lambda_handler(event, context):
        
        # Get the length and width parameters from the event object. The 
        # runtime converts the event object to a Python dictionary
        length=event['length']
        width=event['width']
        
        area = calculate_area(length, width)
        print(f"The area is {area}")
            
        logger.info(f"CloudWatch logs group: {context.log_group_name}")
        
        # return the calculated area as a JSON string
        data = {"area": area}
        return json.dumps(data)
        
    def calculate_area(length, width):
        return length*width
    코드 설명
    Line 7 Lambda 핸들러 Lambda 함수에는 lambda_handler라는 Python 함수가 포함됩니다.
    handler 함수는 항상 코드의 진입점입니다.
    함수가 간접적으로 호출되면 Lambda가 handler를 실행합니다.
    Line 7 Lambda 이벤트 객체 lambda_handler 함수는 event와 context라는 두 가지 인수를 사용합니다.
    Lambda의 이벤트 함수가 처리할 데이터가 포함된 JSON 형식의 문서입니다.
    다른 AWS 서비스에서 함수를 간접적으로 호출하는 경우 이벤트 객체에는 간접 호출을 일으킨 이벤트에 대한 정보가 포함됩니다.
    (e.g. AWS S3 버킷이 함수를 간접적으로 호출하면 AWS S3 버킷 이름과 객체 키가 포함됩니다)
    Line 7 Lambda 컨텍스트 객체 함수가 사용하는 두 번째 인자는 context입니다. 
    Lambda는 컨텍스트 객체를 함수에 자동으로 전달합니다. 
    컨텍스트 객체에는 함수 간접 호출과 실행 환경에 대한 정보가 포함됩니다.
    (e.g. 예제에서는 logGroupName 파라미터를 사용하여 CloudWatch Logs 그룹의 이름을 출력합니다)
    Line 15:17 Lambda에서 로깅 Python을 사용하면 print 문이나 Python 로깅 라이브러리를 사용하여 로그를 보낼 수 있습니다.

    AWS 콘솔에서 Lambda 함수 직접 호출하고 호출 레코드 확인하기

    Lambda 콘솔을 사용하여 함수를 간접적으로 호출 할 수 있습니다.

    먼저 함수에 보낼 테스트 이벤트를 생성합니다.

    이벤트는 lengthwidth 키가 있는 2개의 키-값 페어를 포함하는 JSON입니다.

     

    1. 코드 소스 창에서 테스트를 선택합니다.
    2. 새 이벤트 생성을 선택합니다.
    3. 이벤트 이름에 myTestEvent를 입력합니다.
    4. 이벤트 JSON 패널에 다음을 붙여 넣어 기본값을 바꿉니다.

     

    {
      "length": 6,
      "width": 7
    }

    이제 함수를 테스트 할 준비가 되었습니다. 코드 소스 창에서 테스트를 선택합니다.

    함수 실행이 완료되면 실행 결과 탭에 응답 및 함수 로그가 표시됩니다.

    Node.js 18.x를 선택한 경우 다음과 같은 실행 결과를 나타냅니다.

    Test Event Name
    myTestEvent
    
    Response
    "{\"area\":42}"
    
    Function Logs
    START RequestId: 5c012b0a-18f7-4805-b2f6-40912935034a Version: $LATEST
    2023-08-31T23:39:45.313Z	5c012b0a-18f7-4805-b2f6-40912935034a	INFO	The area is 42
    2023-08-31T23:39:45.331Z	5c012b0a-18f7-4805-b2f6-40912935034a	INFO	CloudWatch log group:  /aws/lambda/myLambdaFunction
    END RequestId: 5c012b0a-18f7-4805-b2f6-40912935034a
    REPORT RequestId: 5c012b0a-18f7-4805-b2f6-40912935034a	Duration: 20.67 ms	Billed Duration: 21 ms	Memory Size: 128 MB	Max Memory Used: 66 MB	Init Duration: 163.87 ms
    
    Request ID
    5c012b0a-18f7-4805-b2f6-40912935034a

    Python 3.11을 선택한 경우 다음과 같은 실행 결과를 나타냅니다.

    Test Event Name
    myTestEvent
    
    Response
    "{\"area\": 42}"
    
    Function Logs
    START RequestId: f72aa1fc-39c6-46c0-820e-d221350ef68d Version: $LATEST
    The area is 42
    [INFO]	2023-10-16T06:48:11.301Z	f72aa1fc-39c6-46c0-820e-d221350ef68d	CloudWatch logs group: /aws/lambda/myLambdaFunction
    END RequestId: f72aa1fc-39c6-46c0-820e-d221350ef68d
    REPORT RequestId: f72aa1fc-39c6-46c0-820e-d221350ef68d	Duration: 9.26 ms	Billed Duration: 10 ms	Memory Size: 128 MB	Max Memory Used: 40 MB	Init Duration: 126.59 ms
    
    Request ID
    f72aa1fc-39c6-46c0-820e-d221350ef68d

    이 예제에서는 Lambda 콘솔의 테스트 기능을 사용하여 실행 결과를 직접 확인합니다.

    Lambda 함수가 Lambda 콘솔 외부에서 간접적으로 호출되는 경우 CloudWatch Logs를 사용해야 합니다.

    CloudWatch Logs에서 Lambda 함수 호출 레코드 확인하기

    CloudWatch 콘솔에서 로그 그룹을 엽니다. 자동으로 생성된 로그 그룹(/aws/lambda/myLambdaFunction)을 선택합니다.

    이는 Lambda 함수가 콘솔에 출력한 로그 그룹의 이름입니다.

    로그 스트림 탭에서 함수의 간접 호출에 대한 로그 스트림을 선택합니다.

    아래와 같이 함수 호출에 대한 레코드를 확인합니다(Python 3.11 기준).

    정리 및 복습

    예제로 작성한 Lambda 함수를 삭제하려면 Lambda 콘솔에서 함수를 엽니다.

    삭제하려는 함수를 선택하고 작업삭제를 선택합니다.

    CloudWatch Logs에서 함수 호출 레코드를 삭제합니다. CloudWatch 콘솔에서 로그 그룹을 엽니다.

    Lambda 함수 실행 결과로 생성된 로그 그룹(/aws/lambda/myLambdaFunction)을 선택합니다.

    작업로그 그룹 삭제를 선택합니다.

    AWS IAM(Identity and Access Management) 콘솔에서 실행 역할을 삭제합니다.

    IAM 콘솔에서 역할을 엽니다. 자동으로 생성된 실행 역할(e.g. myLambdaFunction-role-ep6ila04)를 선택합니다.

    삭제를 선택합니다.

    AWS CloudFormation 및 AWS Command Line Interface(AWS CLI)를 사용하여 함수, 로그 그룹 및 역할의 생성 및 정리를 자동화할 수 있습니다.

    AWS Lambda AWS CloudWatch Logs AWS IAM
    서버를 프로비저닝하지 않고 Lambda 함수를 작성하여 필요한 만큼 호출합니다.
    Lambda 콘솔을 사용하여 Lambda 함수를 직접 호출하고 호출 레코드를 확인 할 수 있습니다.
    Lambda 함수가 간접로 호출되는 경우 호출 레코드를 확인 및 관리 할 수 있습니다. Lambda 함수가 생성되면 IAM에서 실행 역할을 관리합니다.