우노
[AWS Lambda] Container Image 기반 Lambda 함수 구현 본문
구현 순서
- EC2 생성 및 접속
- Docker 설치
- Dockerfile 생성
- Image 생성
- 액세스 키 생성
- AWS Configure 설정
- ECR 환경 설정
- Image tagging
- ECR 에 Image 업로드
- Lambda Function 생성
- Lambda Function 테스트
1. EC2 생성 및 접속
- AWS Console 에서 EC2 서비스에 접속합니다.
- 아래 설정으로 EC2 를 생성합니다.
- Amazon Machine Image(AMI)
- Amazon Linux 2 AMI (HVM), SSD Volume Type
- 인스턴스 유형
- t2.medium
- 스토리지 크기
- 20GB
- 보안 그룹
- SSH, TCP, 22, 위치무관
- Amazon Machine Image(AMI)
2. Docker 설치
생성한 EC2 에 접속한 뒤, Docker 를 설치합니다. (Linux 기반)
# 패키지 업데이트 sudo yum update -y # docker 설치 sudo yum install docker -y # docker 서비스 실행 sudo service docker start # ec2-user를 docker 그룹에 추가 sudo usermod -a -G docker ec2-user
재접속합니다.
3. Dockerfile 생성
참고
Dockerfile 생성
vi Dockerfile
Dockerfile 작성
# aws 에서 제공하는 lambda base image (python) FROM amazon/aws-lambda-python:3.8 # optional : ensure that pip is up to data RUN /var/lang/bin/python3.8 -m pip install --upgrade pip # install git RUN yum install git -y # git clone RUN git clone https://github.com/unhochoi/lambda-with-docker-container.git # install packages RUN pip install -r lambda-with-docker-container/requirements.txt # git repository 의 lambda_function.py 를 Container 내부의 /var/task/ 로 이동 RUN cp lambda-with-docker-container/lambda_function.py /var/task/ # lambda_function.handler 실행 CMD ["lambda_function.handler"]
git repo 의 Lambda_function.py
# package import import json import numpy as np import tensorflow as tf # Model Load bz_smsm_dnn_model = tf.keras.models.load_model('/var/task/lambda-with-docker-container/model/dnn_bz_smsm_model') sp_smdm_dnn_model = tf.keras.models.load_model('/var/task/lambda-with-docker-container/model/dnn_sp_smdm_model') def handler(event, context): body = event["body-json"] # event 로부터 feature 전처리 lr = body["lr"] lc = body["lc"] rc = body["rc"] ld = body["ld"] rd = body["rd"] lnnz = body["lnnz"] rnnz = body["rnnz"] # 모델 입력으로 사용할 input_feature 생성 input_feature = np.array([[lr,lc,rc,ld,rd,lnnz,rnnz]]) # input_feature 에 대한 모델별 예측값 생성 bz_smsm_dnn_result = bz_smsm_dnn_model.predict(input_feature) sp_smdm_dnn_result = sp_smdm_dnn_model.predict(input_feature) # sp_smdm 이 최적일 경우 if (sp_smdm_dnn_result[0] <= bz_smsm_dnn_result[0]): optim_method = "sp_smdm" # bz_smsm 이 최적일 경우 else: optim_method = "bz_smsm" # 결과 생성 result = "bz_smsm : " + str(bz_smsm_dnn_result[0]) + " , " + \ "sp_smdm : " + str(sp_smdm_dnn_result[0]) + " , " + \ "optim_method : " + optim_method # 결과 반환 return { 'statusCode': 200, 'body': json.dumps(result) }
4. Image 생성
Image build
docker build -t unho-lambda-image .
5. 액세스 키 생성
AWS Console 에서 IAM 서비스를 찾아 접속합니다.
- EC2 에서 생성한 Image 를 ECR 로 업로드 하기 위해선, AWS CLI 를 사용해야하며
- AWS CLI 를 사용하기 위해선 AWS 계정의 액세스 키가 필요합니다.
좌측의 [사용자] 탭 클릭 후, 본인 계정을 클릭합니다.
본인 계정에 AdministratorAccess 권한이 할당되어 있지 않다면, 추가로 할당해야합니다.
아래 네비게이션 바에서 [보안 자격 증명] 을 클릭합니다.
[액세스 키] 의 [액세스 키 만들기] 를 클릭합니다.
[.csv 파일 다운로드] 를 클릭해, 계정 정보를 저장합니다.
6. AWS Configure 설정
다시 EC2 로 돌아와, 아래 명령어를 입력합니다.
aws configure
다운로드 받은 .csv 파일로부터 계정 정보를 입력합니다.
AWS Access Key ID [None]: AWS Secret Access Key [None]: Default region name [None]: # aws 명령어를 사용할 때 API를 호출할 기본 리전을 지정합니다. Default output format [None]: # API 호출 결과를 출력할 포맷을 지정합니다.
인증 설정을 확인합니다.
cat ~/.aws/credentials
7. ECR 환경 설정
EC2 에서 ECR 에 Image 를 업로드할 수 있도록 환경 설정을 진행합니다.
변수 설정
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
bash_profile 에 변수 등록
echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile
AWS Console 에서 ECR(Elastic Container Registry)를 찾아 접속합니다.
좌측 [Repositories] 클릭한 뒤, 우측 [리포지토리 생성] 을 클릭합니다.
[리포지토리 이름] 을 작성한 뒤, 우측 하단의 [리포지토리 생성] 을 클릭합니다.
생성된 Repository 의 [URI] 를 기억합니다.
8. Image tagging
다시 EC2 로 돌아와, 이전에 생성한 Image 에, Repositroy 의 URI 를 tag 로 달아줍니다.
docker tag "이미지명" $ACCOUNT_ID.dkr.ecr."리전명".amazonaws.com/"리포지토리 이름"
9. ECR 에 Image 업로드
docker client 를 registry 에 인증하여 사용하도록 로그인합니다.
aws ecr get-login-password --region "리전명" | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr."리전명".amazonaws.com
docker Image 를 ECR 에 push 합니다.
docker push $ACCOUNT_ID.dkr.ecr."리전명".amazonaws.com/"리포지토리 이름"
ECR 서비스의 리포지토리 탭에서 생성한 리포지토리를 클릭해, Image 가 정상적으로 업로드 되었는지 확인합니다.
10. Lambda Function 생성
AWS Console 에서 Lambda 서비스에 접속합니다.
좌측 [함수] 탭에서, [함수 생성] 을 클릭합니다.
상단의 [컨테이너 이미지] 를 클릭한 뒤, [힘수 이름] 을 작성하고, [컨테이너 이미지 URI] 의 [이미지 찾아보기] 를 클릭합니다.
생성한 ECR 이미지로 [이미지 선택]한 뒤, [함수 생성] 을 클릭합니다.
함수 생성 후, 하단 네비게이션 바의 [구성] 탭에서 [일반 구성] 선택 후, 우측 [편집] 을 클릭합니다.
[메모리] 와 [제한 시간] 을 기호에 맞게 수정합니다.
11. Lambda Function 테스트
하단의 네비게이션 바에서 [테스트] 를 클릭한 뒤, 적절한 이벤트를 입력해 Lambda Function 을 테스트합니다.
{ "body-json" : { "lr": 97366, "lc": 33288, "rc": 5958, "ld": 0.00056263, "rd": 0.13, "lnnz": 1823595, "rnnz": 25785518} }
결과를 확인합니다.
'AWS > Lambda' 카테고리의 다른 글
[Lambda] CloudWatch를 사용해 Lambda를 주기적으로 실행하는 방법 (0) | 2022.04.27 |
---|---|
[AWS Lambda] Provisioned Concurrency 설정 방법 (0) | 2021.11.27 |
[AWS Lambda] Duration, Billed Duration, Init Duration 간 차이 (0) | 2021.08.18 |
[AWS Lambda] Amazon EFS 기반 Lambda 함수 구현 (0) | 2021.08.13 |
[AWS Lambda] S3 파일 다운로드 (2) | 2021.05.18 |