AWS 노트

AWS Lambda Python 실행기 (1)

Jonchann 2020. 4. 3. 19:38

코드를 쓰기까지

  • 콘솔에 로그인
  • Lambda 선택
  • 함수
    • 함수 생성
  • 새로 작성
    • 함수 이름: hello_lambda
    • 런타임: Python 3.x
    • 권한: 기본 Lambda 권한을 가진 새 역할 생성
      • "Lambda 이름이 [myFunctionName]-role-[some_number_and_alphabet]이고 Amazon CloudWatch Logs에 로그를 업로드할 수 있는 권한이 포함된 실행 역할을 생성합니다."
  • 함수 생성

hello_lambda

  • Code entry type: 코드 인라인 편집
  • 런타임: Python 3.x
  • 핸들러: lambda_function.lambda_handler
  • 오른쪽 위 '테스트' 버튼: 테스트 이벤트
    • evend: HelloKeys

함수 핸들러(handler)

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
  • 일반적인 구문
    def handler_name(event, context): 
      ...
      return some_value
  • event
    • event 데이터를 핸들러에게 전달
    • dict, list, str, int, float, NoneType만 가능
    • 함수 호출 시 이벤트의 내용과 구조 결정
    • Amazon Kinesis, Amazon DynamoDB, Amazon Simple Queue Service의 event만 읽을 수 있음
      • 다른 서비스: 다른 서비스에 권한 부여 후 이 서비스가 이벤트를 생성하고 함수를 직접 호출하도록 구성
      • Lambda 함수를 동기적으로 호출하는 서비스
        • Elastic Load Balancing(Application Load Balancer)
        • Amazon Cognito
        • Amazon Lex
        • Amazon Alexa
        • Amazon API Gateway
        • Amazon CloudFromt
        • Amazon Kinesis Data Firehose
        • AWS Step Functions
        • Amazon Simple Storage Service 배치
      • 비동기적으로 호출하는 서비스: Lambda는 이벤트를 함수에 전달하기 전에 대기열에 추가하고 다른 서비스는 이벤트가 대기열에 추가되는 즉시 성공 결과를 받지만 그 후의 일은 모름. 오류 발생시에는 Lambda가 재시도하고 배달 못한 편지 대기열에 시패 이벤트를 보냄
        • Amazon Simple Storage Service
        • Amazon Simple Notification Service
        • Amazon Simple Email Service
        • AWS CloudFormation
        • Amazon CloudWatch Logs
        • Amazon CloudWatch Events
        • AWS CodeCommit
        • AWS Config
        • AWS IoT
        • AWS IoT Events
        • AWS CodePipeline
  • context
    • 런타임 정보를 핸들러에게 제공하기 위함
    • 호출, 함수, 실행 환경 등에 대한 정보를 제공하는 메서드, 속성을 제공

print HelloKeys

  • HelloKeys: test event

    {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
    }
  • lambda_handdler method: 동작 확인을 위해 대충 내용을 바꿔줌

    import json
    def lambda_handler(event, context):
      # TODO implement
      print(f"event => {event}")
      print(f"type(event) => {type(event)}")
      print(f"context => {context}")
      print(f"tyoe(context) => {type(context)}")
      return event, context
  • 저장 버튼

  • 테스트 버튼

Response:
{
  "errorMessage": "Unable to marshal response: <bootstrap.LambdaContext object at [position]> is not JSON serializable",
  "errorType": "Runtime.MarshalError"
}

Request ID:
"[Requested_ID]"

Function Logs:
START RequestId: [Requested_ID] Version: $LATEST
event => {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
type(event) => <class 'dict'>
context => <bootstrap.LambdaContext object at 0x7f4bc2446ed0>

Error

  • to be continue...