본문 바로가기

Back/AWS_Back

[AWS][Lambda] Lambda 기본 이해...

프로젝트 준비하며 간단하게 정리합니다.

 


1. 람다란?

AWS Lambda는 이벤트에 대한 응답으로 코드를 실행하고 자동으로 기본 컴퓨팅 리소스를 관리하는 서버리스 컴퓨팅 서비스입니다. AWS Lambda를 사용하여 사용자 지정 로직을 통해 다른 AWS 서비스를 확장하거나, AWS 규모, 성능 및 보안으로 작동하는 자체 백엔드 서비스를 만들 수 있습니다. AWS Lambda는 Amazon API Gateway를 통한 HTTP 요청, Amazon S3 버킷에 있는 객체에 대한 변경 사항, Amazon DynamoDB의 테이블 업데이트 또는 AWS Step Functions의 상태 전환과 같은 다양한 이벤트에 대한 응답으로 코드를 자동 실행할 수 있습니다.

AWS 기준 설명. 간단하게 요약하면 서버리스로 작동하는 API 관리/실행 서비스이다. 

호출한 만큼만 돈을 내어 EC보다 저렴하게 간단한 서비스를 만들수 있다는 장점이 있지만, 조금이라도 무거운건 안돌아간다.

더불어 다른 AWS 기능과 잘 연결할 수 있다고 한다. 

간단한 예제로 설명할 것이며, 모든 예제는 파이썬으로 구성된다.

 

2. 콘솔페이지

aws 계정을 생성하고 람다로 들어오면 다음화면을 볼수 있다. 

오른쪽 상단 주황색 함수생성 버튼을 만들어 생성해보자.

 

2 - 1 함수생성

 

간단하게 함수이름과 런타임을 정해줄 수 있다. 또한 런타임, 실행환경을 정해주도록 하자.

권한을 따로 생성해서 할수도 있는데 일단 생성 해보자. 

오른쪽 아래 주황색 생성 버튼으로 함수를 생성한다.

함수 생성이후 화면이다. 

함수개요로 다른 AWS 서비스와 어떻게 연결되어 있는지 확인할 수 있고 

코드를 적용할 수 있으며

런타임 및 계층.. 레이어를 설정할 수 있다.

 

3 일단 눌러보자.

 

코드 소스에서 lambda_function.py를 누르면 안에 작성된 코드를 볼 수 있다.

3-1 TEST 구성

테스트를 누르면 테스트 이벤트를 구성할 수 있다. Json 형식으로 구성하며 이름에 아무렇게나 정하고 저장하자.

이후 테스트 버튼을 누르면 다음과 같은 창이 뜬다.

 

Response
{
  "statusCode": 200,
  "body": "\"Hello from Lambda!\""
}

리스폰를 통해 코드 끝단의 return이 돌아옴을 알 수있다.

Function Logs
START RequestId: e06c5e80-6c44-4a54-8e87-231b44d05614 Version: $LATEST
END RequestId: e06c5e80-6c44-4a54-8e87-231b44d05614
REPORT RequestId: e06c5e80-6c44-4a54-8e87-231b44d05614 Duration: 1.15 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 51 MB Init Duration: 115.77 ms

Request ID
e06c5e80-6c44-4a54-8e87-231b44d05614

다음 두칸은 콘솔창처럼 Print의 출력과 각종 값들을 보여주며 Request ID도 보여준다.

 

 

lambda handler 함수 안에 간단한 프린트 문을 넣고 Deploy를 누른뒤 다시 테스트한 결과이다. 

Function logs 안에 hello lambda가 잘 나오고 있다.

 

3-2 테스트 출력.

람다함수가 호출되면 모든 인자들은 event를 통해 들어오게 된다. 

event를 출력해보자

 

function logs를 통해 test에서 구성한 json을 확인 할 수있다. 

당연히 리턴은 건드리지 않아 hello from lambda가 나오고 있다.

 

4. 외부 접근 확인, API 게이트웨이 설정 

리턴의 json.dumps 안에 event를 넣고 Deploy 한다.

그리고 맨위로 올라가 함수개요에서 트리거 추가를 누른다. 

 

추가 트리거( 트리거 추가가 맞지 않을까?) 화면에서 REST API 를 선택하고 보안을 열기로 한다. 내부적으로 이용하는 람다, 혹은 보안이 필요한 내용이면 그에 맞는 보안정책을 사용하자. 추가를 눌러 넘어가자.

※HTTP API와 REST API 의 차이

docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/http-api-vs-rest.html

 

HTTP API와 REST API 중에서 선택 - Amazon API Gateway

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

aws 정책/기능별로 차이를 둔다.

 

다음화면이 나온다. 세부정보를 누르면 API 게이트웨이에 대한 정보가 나온다.

기본적으로 게이트 웨이는

게이트웨이 엔트포인트 + 설정한 리소스 주소 

이런 식으로 연결되며 각 메서드마다 어떻게 연결할지, 커스텀 리소스를 만들어 어떤 람다 함수랑 연결할지 정할 수 있다. 

API 엔드포인트 부분에 링크가 걸려있을건데 눌러보자.

json 데이터를 확인할수 있다. 

아까 설정한 람다를 생각해보면 지금 화면에 나오는 정보가 람다에 보내지는 request임을 알 수 있다.

 

4-1, POST 설정.

게이트 웨이 옆 이름을 누르면 API GATEWAY 페이지로 넘어간다.

 

작업 -> 메소드 생성 -> POST -> 체크 클릭하면 다음 페이지가 나온다.

 

 

어떤 유형과 연결할지 정할수 있다. 람다함수 선택, lambda 프록시 통합 사용 체크

리전을 확인후 람다함수 칸에 함수 이름을 한글자만 입력해도 밑에 목록이 나온다. 방금전 만든 함수를 선택하고 저장.

4-2 외부앱 설정, Post request

POST Request를 구성해 보았다.

바디부분 json은 다음과 같이 구성되어 있다.

{"key1":"key1","key2":"key2","information":{"info1":"info1","info2":"info2"}}

Request를 보내면 당연히 응답이 오며 body 부분을 확인해 보자.

"body": "{\"key1\":\"key1\",\"key2\":\"key2\",\"information\":{\"info1\":\"info1\",\"info2\":\"info2\"}}"

raw text 로 보면 위과 같이 오게 된다. 

"" 안쪽 "에는 \가 붙어있는데 이는 json.dumps를 통해서 바디안의 json을 문자열 형태로 바꿔주었기 때문이다.

추측 > json 은 3단이상 넘어갈 경우 에러가 발생.(json.dumps 없이 실행해 볼것) 그러므로 그이상 수준의 데이터를 문자열 형태로 바꿔서 전송후 다시 복원하는것 아닐까?

 

5. 외부 라이브러리 import, 레이어 설정.

람다 안에 코드를 짜다 보면 다른 라이브러리를 사용해야할 경우가 생긴다.

 코드에 import를 추가해 보자.

import pandas as pd

deploy, test를 눌러보면.? 에러가 난다.

{
  "errorMessage": "Unable to import module 'lambda_function': No module named 'pandas'",
  "errorType": "Runtime.ImportModuleError"
}

판다스가 없다. 그런데 json은 됬다. 즉 람다에서 기본적으로 지원하는 라이브러리가 있다.

 

런타임 종속성이란 무엇인가요?
런타임 종속성이 있거나 없는 Lambda 함수를 생성하거나 업데이트하려면 배포 패키지가 필요합니다. 배포 패키지는 Lambda에서 함수의 코드 및 종속성(해당되는 경우)을 실행하는 소스 번들 역할을 합니다.
런타임 종속 항목은 함수 코드에 대한 Lambda 런타임 환경에 포함되지 않은 모든 패키지, 모듈 또는 기타 어셈블리 종속 항목이 될 수 있습니다.
다음 예제에서는 런타임 종속성이 없는 Lambda 함수를 설명합니다.
  • 함수의 코드가 Python 3.8 버전이고, 표준 Python 수학 및 로깅 라이브러리에만 의존하는 경우 .zip 파일에 라이브러리를 포함하지 않아도 됩니다. 이러한 라이브러리는 python3.8 런타임에 포함되어 있습니다.

  • 함수의 코드가 Python용 AWS SDK(Boto3)에만 의존하는 경우 .zip 파일에 boto3 라이브러리를 포함하지 않아도 됩니다. 이러한 라이브러리는 python3.8 런타임에 포함되어 있습니다.

AWS SDK의 전체 목록은 AWS에서 빌드할 도구를 참조하세요.

 

공식에 따르면 수학및 로깅 라이브러리, boto3만 들어있고 나머지는 직접 넣어야 한다는 것이다. 

 

기본적으로 코드 옆 에서 업로드를 눌러 zip 파일로 압축된 라이브러리와 파일들을 넣을 수 있다. 

 

람다로 만들어야할 기능이 많다면 매번 pandas든 numpy든 올려야 하며

버전 관리도 힘들고 전체 용량이 어느정도 넘어가면 코드를 읽어서 수정하기도 어렵다.

 

그런단점을 보완하고자 나온것이 레이어, 계층이다.

계층은 공통적으로 관리하는 라이브러리들이라 생각하면 되고 람다 밑에 깔아주기만 하면 여러 람다에서 사용가능하고 버전 관리도 된다. 

와! 정말 대단해!! 

  레이어 직접 넣기
장점  버전관리 편안
다양한 람다에 적용가능
라이브러리 수정가능
어떤 라이브러리 있는지
눈으로 확인 가능
단점 라이브러리 수정 불가능 매번 라이브러리 삽입해줘야됨
공통 단점 용량제한은 별차이 없음
람다는 아마존 리눅스 기반이라 윈도우에서
zip파일 준비하면 에러가능성 있음

 

주의사항) 레이어는 최상위 폴더가 python으로 설정된 zip파일로 압축되야 한다. 

이런식으로,

라이브러리를 한폴더(python)에 다운받아  압축하면 최상단에 python폴더가 안올라오는 경우도 많으니 주의

 

6. 마무리

람다의 구조를 보면 알겠지만.. 플라스크랑 구조가 많이 비슷하다.

zappa라는 라이브러리를 이용하여 로컬에서 동작하는 플라스크앱을 그대로 올릴수 있다.