본문 바로가기
AWS

[AWS] Lambda 따라하기 (python) #3 container 사용

by bryan.oh 2023. 1. 13.
반응형

AWS Lambda
Docker Container 사용하여
Python 실행하기

 

이제 세번째 포스트 입니다. Docker Container 를 사용하여 Lambda 함수를 생성할 차례네요.

기본적인 내용은 #1, #2 에서 했으니, 필요한 부분만 작성하도록 하겠습니다.

AWS 에 로그인하시고, Lambda 서비스 홈으로 갑니다.

"함수 생성"을 누릅니다.

 

세번째 옵션인 "컨테이너 이미지"를 선택합니다.

아직 컨테이너 이미지가 없죠..ㅎㅎ

dockerfile 을 이용하여 이미지를 생성하고 ECR에 이미지를 push하고나서 다시 해야겠습니다.

 

Base Image

AWS에서 lambda 를 사용할 수 있게 base 이미지를 제공합니다. 런타임 인터페이스 클라이언트가 포함되어있습니다.

python 이미지는 여기에서 확인할 수 있습니다. 버전별로 image 주소를 확인하여 복사하면 됩니다.

(아래 #따라하기 에서 Dockerfile 을 복사하면 됩니다~)

저는 python 3.9 을 사용했습니다.
public.ecr.aws/lambda/python:3.9

 

# 따라하기

우선 python 가상 환경을 생성 합니다. 

꼭 가상환경을 사용하지 않아도 됩니다. 그냥 새폴더를 새로 만들어서 해도 됩니다.

hello-lambda-image  라는 폴더를 생성했습니다.

위 폴더에서 Dockerfile 을 생성합니다.

그리고 아래 내용을 입력합니다.

FROM public.ecr.aws/lambda/python:3.8

# Copy function code
COPY app.py ${LAMBDA_TASK_ROOT}

# Install the function's dependencies using file requirements.txt
# from your project folder.

COPY requirements.txt  .
RUN  pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.handler" ]

app.py 라는 python 파일을 생성하고 코딩을 하면 됩니다.

그리고 requirements.txt 에 필요한 3rd party lib 들을 정의해 두면 됩니다.

그럼 필요한 파일들은 아래와 같습니다.

여기서 app.py 외에 다른 python file 이나 package 들이 더 있다면, 파일들을 생성 하시고
Dockerfile 의
COPY app.py ${LAMBDA_TASK_ROOT} 
위 라인을 다음과 같이 변경 합니다.
COPY . ${LAMBDA_TASK_ROOT} 
현재 폴더의 모든 파일을 ${LAMBDA_TASK_ROOT} 로 복사한다는 의미입니다.

 

따라하기 #2 에서 사용했던 코드를 그대로 쓰겠습니다.

app.py

import json

import requests


def handler(event, context):
    url = 'https://jsonplaceholder.typicode.com/albums'
    response = requests.get(url)
    status_code = response.status_code
    body = response.reason
    if status_code == 200:

        album_list = json.loads(response.content)
        body = f'album count = {len(album_list)}'

        if 'album_id' in event:
            album = next(filter(lambda x: x['id'] == event['album_id'], album_list), None)
            body = album if album else f'not found album id : {event["album_id"]}'

    return {
        'statusCode': status_code,
        'body': json.dumps(body)
    }

 

여기서도 requests 라이브러리를 사용했기때문에

requirements.txt 에 다음과 같이 작성하면 됩니다.

requests==2.27.1

 

ECR

여기까지 하고, 도커 이미지를 생성 후에 올려야 할 곳인 ECR(Elastic Container Registry)에 먼저 가봅니다.

"리포지토리 생성" 을 누릅니다.

private 으로 생성합니다.

리포지토리가 생성되면 해당 리포지토리로 들어가서 "푸시 명령 보기" 버튼을 클릭합니다.

아래와 같이 친절하게 명령어를 다 알려줍니다.

1번부터 4번까지 터미널(또는 CMD)에서 복사하여 명령어를 날립니다.

혹시 aws cli 와 docker 가 설치되어있지 않다면 여기에서 확인해주세요.

위 명령어를 복붙, 실행한 결과입니다.

 

push 가 완료되었으니, ECR 로 가보면 이미지가 생겼겠죠

 

그리고 다시 AWS Lambda 에서 "함수생성" 을 클릭합니다.

"이미지 찾아보기"를 누르면 ECR 이미지 리포지토리에서 이미지를 선택할 수 있게 표시가 됩니다.

이미지를 선택해줍니다.

그리고 x86_64, arm64가 있는데, 맥북m1에서 도커이미지를 생성했다면 arm64를 선택해야합니다.

그리고나서 "함수 생성" 버튼을 누릅니다. 로딩을 기다리면 생성된 함수가 보입니다.

이전 포스트에서 실행했던 것 처럼 "테스트" 텝에서 새 이벤트를 생성하고 파라메터를 넘기면 정상 작동하는것을 볼 수 있습니다.

 

실행결과

 

 

 

728x90
반응형

댓글