AWS Cloud9과 ECR을 이용하여 Lambda Container 배포하기

    목차
반응형

0. 상황

AWS의 서버리스 컴퓨팅 서비스인 Lambda를 이용하면 사용한 만큼만 요금이 나가기 때문에 EC2처럼 서버를 24시간 돌리는 것보다 훨씬 저렴하다. 그래서 Lambda를 많이 이용하게 되는데 단점은 EC2만큼의 자유도는 없다는 점이다.

2024.02.14 - [AWS] - AWS Lambda에 layer 추가하기 (추가 Package 설치)

그래서 layer를 추가하여 필요한 패키지를 설치하게 되는데 이것도 한계가 있다. 총 250MB라는 제한이 있어 여러 패키지를 동시에 설치하거나 무거운 패키지를 설치하는 데 제한적이다. 이를 해결하기 위한 방법이 ECR(Elastic Container Registry)에 Docker 환경을 올려놓고 Lambda 컨테이너로 사용하는 것이다. 그리고 ECR에 컨테이너를 올리는 가장 간편한 방법이 Cloud9을 이용하는 것이다.

 

1. Cloud9

AWS Cloud9를 사용하면 브라우저만을 이용하여 코드를 작성, 실행 및 디버깅할 수 있습니다.

AWS에서 Cloud9을 이렇게 소개하고 있다. 코드 작성을 위한 EC2라고 생각하면 될 것 같다. 장점은 EC2를 끌 필요 없이 특정 시간이 경과하면 자동으로 꺼져서 깜빡하고 종료를 하지 않아 요금 폭탄을 맞는 참사를 막을 수 있다. 그리고 EC2이기 때문에, 프리티어의 12개월동안 월 `t2.micro` 750시간 무료 혜택을 이용할 수 있다.

 

그러면 Cloud9에서 [환경 생성]을 통해 EC2를 생성하고 열어서 아래와 같은 폴더 구조를 생성해주자.

Lambda용 container를 만들 용도로 `lambda_container`라는 이름으로 환경을 생성하였으며 배포를 위한 폴더 안에 파일을 생성하였다.

- `app.py`: Lambda에서 실행할 스크립트 파일

- `Dockerfile`: Docker를 만들기 위한 파일

- `requirements.txt`: 설치할 패키지 명시

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

ADD requirements.txt .
ADD app.py ${LAMBDA_TASK_ROOT}

RUN pip install --no-cache-dir --upgrade pip setuptools \ 
    && pip install --no-cache-dir -r requirements.txt --target "${LAMBDA_TASK_ROOT}"

# Command can be overwritten by providing a different command in the template directly.
CMD ["app.handler"]

`Dockerfile`을 보면 이렇게 생겨먹었다. 먼저 lambda python 버전을 명시해주고 `requirements.txt` 내용물을 설치한 뒤 `${LAMBDA_TASK_ROOT}`에 `app.py`를 복사한 뒤 마지막으로 `app.py`의 `handler` 함수를 실행하겠다는 의미다. 

`requirements.txt` 없이 그냥 `RUN pip install pandas` 이런식으로 해줘도 상관은 없다.

 

import json

def handler(event, context):
    ...
    
    return json.dumps({"text":"Hello World!"})

`app.py`는 평소에 작성하던 Lambda와 동일하게 작성하면 된다. 주의할 점은 `Dockerfile`에서 명시한 `app.handler`를 여기서 사용해줘야 한다는 점이다.

 

여기까지 끝냈으면 Docker를 생성하여 ECR에 등록하자.

 

 

2. ECR

Amazon Elastic Container Registry(ECR)는 완전관리형 컨테이너 레지스트리로, 이미지와 아티팩트를 어디서나 쉽게 보관, 관리, 공유 및 배포하도록 지원합니다.

 

ECR에 들어가면 Private와 Public이 있는데, 여러 계정을 사용하거나 외부에 오픈할 게 아닌 이상 웬만하면 Private로 만들어주자.

 

[리포지토리 생성]을 해서 새로운 리포지토리를 만들고 클릭하여 상세 정보를 확인하면 우상단에 [푸시 명령 보기]가 있다.

Cloud9에 들어가서 하단 cmd창을 통해 `Dockerfile`이 존재하는 폴더로 이동 후, 1번부터 4번까지 명령어를 실행해주면 도커 이미지가 ECR에 등록이 된다.

 

참고

Lambda 함수를 테스트하느라 여러 docker를 만들게 됐다거나 해서 EC2 용량이 부족해질 때에는 `docker system prune` 명령어를 실행하여 만들어져있는 모든 docker를 지울 수 있다.

또는 EC2의 EBS 용량을 증가시켜도 된다. (하지만 그만큼 비용이 증가한다.) (참고 내용)

 

주의!

프리 티어의 경우 ECR은 월 0.5GB까지 무료이기 때문에 이미지 용량이 0.5GB를 넘으면서 테스트 용도라면 만들고 지우는 것을 추천한다.

하지만 테스트 용도가 아닌 운영 용도라면 이미지를 절대 삭제하지 말자. 이미지를 지워도 한동안 Lambda가 계속 실행되어서 괜찮다고 생각할 수 있지만 쿨다운되어 cold start를 하게 되면 Lambda는 ECR 이미지를 찾게 된다. 이 때 오류가 나므로 절대 삭제하지 말자.

 

 

3. Lambda

함수를 생성할 때 컨테이너 이미지를 선택, 이미지 찾아보기 버튼을 클릭하여 위에서 만들었던 이미지를 선택해주면 끝이난다.

만약 코드 수정이 필요하면 Cloud9에서 코드 수정, Docker 빌드 및 ECR 등록 후 Lambda에서 [새 이미지 배포]를 클릭하여 가장 최근에 만든 이미지를 선택해주면 된다.

 

728x90
반응형