오늘의 인기 글
최근 글
최근 댓글
Today
Total
05-07 05:42
관리 메뉴

우노

[AWS Lambda] Container Image 기반 Lambda 함수 구현 본문

AWS/Lambda

[AWS Lambda] Container Image 기반 Lambda 함수 구현

운호(Noah) 2021. 8. 16. 16:49

구현 순서

  1. EC2 생성 및 접속
  2. Docker 설치
  3. Dockerfile 생성
  4. Image 생성
  5. 액세스 키 생성
  6. AWS Configure 설정
  7. ECR 환경 설정
  8. Image tagging
  9. ECR 에 Image 업로드
  10. Lambda Function 생성
  11. 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, 위치무관

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}
      }
  • 결과를 확인합니다.

Comments