[AWS]Lambda (비서야 알아서 처리해줄래?)

차보경·2022년 11월 6일
1

AWS

목록 보기
6/13
post-thumbnail

AWS Lambda

  • Serverless의 주축을 담당
    • Serverless : 기존은 서버를 만들고 돌리면서 문제점 생기면 해결 했어야했으나, 이건 클라우드가 직접 서버를 돌려주고 생성하며 소스들을 서버 사용량에 따라 할당해줌 -> 문제점도 낮음(사람의 역할도 적음)
  • Events를 통하여 Lambda를 실행시킴
    • Event : 주어 + 동사에서 동사가 이벤트임 (Ex.~를 삭제했다, ~가 올라갔다)
  • NodeJS, Python, Java, GO등 다양한 언어 지원
  • Lambda Function
    • Lambda -> Event 발생시 코드실행 가능, 다른 서비스 호출도 가능
    • AWS 아키텍쳐 짤 때 중간중간 넣어줌
  • Cloud Watch랑 비슷한 느낌

AWS Lambda - 비용

  • Lambda Function이 실행될때만 돈 지불
  • 매달 1.000.000 함수 호출 시 무료 (그 후로는 유료)

AWS Lambda - 기타

  • 최대 300초(5분) 런타임 시간 허용 (대용량 데이터 처리시 타임아웃 걸릴 수 있음_주의! -> 이상 늘리는 것도 안됨)
  • 512MB의 일시적인 디스크 공간 제공 (/tmp/)
  • 최대 50MB Deployment Package 허용
    : AWS콘솔에서 코드를 짤수도 있지만, 다수의 코드 파일을 업로드해서 Deployment에서 쓸 수 있음(50MB 넘으면 S3에 넣고 Lambda에 지정해주면됨)

사용 예1

S3 -> Lambda -> DB

  • S3 : PutObject발생 -> Lambda 실행
  • Lambda : 필요에 의한 데이터 변환, 불필요한 데이터 삭제 후 깨끗한 데이터 DB에 올림

사용 예2

IoT -> Lambda -> SNS

  • IoT : 실시간 데이터 입력 -> Topic(이걸로 이상상황 관리) -> Lambda 실행
  • Lambda : 형대 변환/데이터 변환 후 -> SNS로 실시간 알람 발생

실습

  • 예약되지 않은 계정 동시성 -> Concurrency (얼마나 많은 함수를 동시에 돌릴 수 있는지)
  • 블루프린트 사용 : 샘플 코드 및 구축 Lambda 애플리케이션을 위한 구성 사전 설정을 일반적인 사용 사례를 살펴봅니다. (여러 상황을 AWS가 세팅해놓은것)

  • Lambda가 이름이 Chabbo_lambdafunction-role-e41xhheh이고 Amazon CloudWatch Logs에 로그를 업로드할 수 있는 권한이 포함된 실행 역할을 생성합니다. -> cloud watch 연동 가능하다는 것!

    기본으로 이렇게 Key1을 print해주는 간단 코드를 줍니다.

import json

print('Loading function')

def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    print("value1 = " + event['key1'])
    print("value2 = " + event['key2'])
    print("value3 = " + event['key3'])
    return event['key1']  # Echo back the first key value
    #raise Exception('Something went wrong')

한번 테스트 이벤트를 발생시켜 테스트해봅니다.

저는 키값을 바꿔서 어떻게 뜨는지 확인해볼겁니당


실행결과 성공이고, key1인 "차"를 출력해줬습니다! 또한 얼마나 시간이 걸렸고 메모리, 리소스가 얼마나 사용됐는지 보여주네요
여기를 클릭해보면
CloudWatch에서 로그가 실행된게 보이고 어떤 함수가 언제 발생됐는지도 다 확인할 수 있습니다! 캬

그리고 이번엔 코드에 에러를 발생시켜볼게욤

import json

print('Loading function')

def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    print("value1 = " + event['key1'])
    print("value2 = " + event['key2'])
    print("value3 = " + event['key3'])
    return event['key4']  # 이렇게 없는 값을 넣어줘봅니다
    #raise Exception('Something went wrong')


배경부터 빨갛게 실패를 띄워주네요 KeyError 입니다. 맞죵

  • 아까 람다 역할이 생긴걸 봤는데 이건 어떻게 생겼는지 확인해볼까요?

    IAM의 역할에 가면 람다가 있는 것을 볼 수 있습니다.

    자세히 보면 로그 스트림을 만들고, 이벤트를 발생시키는 역할을 부여한게 보입니다. 나중에 뭔가 추가적인 것을 하고싶다면 여기에 더 역할을 부여해줄 수 있겠네야

Lambda에 S3 연결시켜 파이프라인 만들어보기


-S3에 PutObject가 발생하면 Lambda를 실행시켜보자.
Temperature 데이터 입력되는데, 해당 온도가 넘으면 경고 울려주기

  1. S3에 접근할 수 있는 람다 만들기

  2. S3가서 PUT 이벤트 만들기

  • 접미사 : 해당 파일 형태에 대한 것만 처리함

    람다 함수를 지정해서 저장시킴
  1. 람다 가서 연결 됐는지 확인

  2. S3에 이상 데이터 넣어서 람다 확인

    -> 클라우드 워치 로그에 코드가 실행된 것을 볼 수 있습니다! 와우
    저는 궁금해서 Event를 print시켜봤는데여

{'Records': [{'eventVersion': '2.1', 
			'eventSource': 'aws:s3', 
            'awsRegion': 'ap-northeast-2', 
            'eventTime': '2022-11-06T12:41:08.786Z',
            'eventName': 'ObjectCreated:Put', 
            'userIdentity': 
            	{'principalId': 'A2FZT8T1FFNM16'}, 
            'requestParameters': 
            	{'sourceIPAddress': '220.82.40.31'},
            'responseElements': 
            	{'x-amz-request-id': 'Y02G7FQ3VDF25AZH', 
                'x-amz-id-2': 'Q1WslfdYezK8eCByKteSmKx2OrgCa2iLR74bzoYwLy5idwlZOYjohrdEUwEUXdBo+lrUxjb1T66TTpS27xMN24AnLsDhgS+9zw+3vVX8VNw='}, 
            's3': 
            	{'s3SchemaVersion': '1.0', 
                'configurationId': 'chabo_lambda_event',
                'bucket': 
                	{'name': 'cha-lambdatrig',
                    'ownerIdentity': 
                    	{'principalId': 'A2FZT8T1FFNM16'},
                    'arn': 'arn:aws:s3:::cha-lambdatrig'}, 
               'object': 
               		{'key': 'ex1.json', 
                    'size': 21, 
                    'eTag': '680b7998a0cfc13644db9d8a2c058ecf', 
                    'sequencer': '006367AB64C08D4F8A'
                    }
                 }
              }]}

이벤트 상황에대한 다양한 정보가 JSON형태로 들어있는 것을 볼 수 있습니다. 나중에 코드에서 상황을 불러올 때 해당 변수로 타고 들어가서 보면 될 것 같네요!

  1. 다른 상황의 파일 넣어보기

    로그에 좋다는 내용이 뜨네요

다양한 람다를 활용해봤는데, 상황에 맞춰서 코드를 짜는게 중요하다는 생각이 든ㄷㅏ!

profile
차보의 Data Engineer 도전기♥ (근데 기록을 곁들인)

0개의 댓글