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

우노

[AWS Lambda] Amazon EFS 기반 Lambda 함수 구현 본문

AWS/Lambda

[AWS Lambda] Amazon EFS 기반 Lambda 함수 구현

운호(Noah) 2021. 8. 13. 14:12

목표

  • Tensorflow 모델을 사용해, 입력에 대한 예측값을 출력해주는 Lambda Function 을 생성합니다.
  • Lambda Function 은 모델을 사용하기 위해 고용량 패키지를 호출해야하는데,
  • AWS Lambda 에서 제공해주는 파일 저장소는 크기 제한이 존재하므로
  • Amazon EFS 를 통해 AWS Lambda 에서 고용량 패키지를 사용 가능하도록 설정합니다.

순서

  • Lambda 에서 사용할 package 를 EFS 에 설치
    1. EFS 를 마운트 할 EC2 생성
    2. Lambda 에서 EFS 로 접근하기 위해, EFS 용 보안 그룹 생성
    3. EFS 및 액세스 포인트 생성
    4. EC2 접속 후, EFS 마운트를 위한 패키지 설치
    5. EC2 에 EFS 마운트를 진행할 디렉토리 생성 후, 마운트 진행
    6. 마운트 디렉토리에 고용량 패키지 설치
  • Lambda 함수 생성
    1. Lambda 와 EFS 를 연결하기 위한 IAM 권한 생성
    2. Lambda 함수 생성 및 EFS 연결
    3. Lambda Function 테스트

1. EFS 를 마운트 할 EC2 생성

  • AWS Console 에서 EC2 를 생성합니다.

2. Lambda 에서 EFS 로 접근하기 위해, EFS 용 보안 그룹 생성

  • EFS 용 보안 그룹을 생성합니다.

  • AWS Console 에서 EC2 서비스에 접속한 뒤, [보안 그룹] 항목에서 [보안 그룹 생성] 버튼을 클릭합니다.

  • [보안 그룹 이름] 을 입력한 뒤, [인바운드 규칙] 에 새로운 규칙을 추가하고, [보안 그룹 생성] 버튼을 클릭합니다.

    • 유형 : 사용자 지정 TCP
    • 포트 범위 : 2049
    • 소스 : 위치 무관

3. EFS 및 액세스 포인트 생성

  • AWS Console 에서 EFS 서비스에 접속한 뒤, [파일 시스템 생성] 을 클릭합니다.

  • 아무런 설정을 하지 않고, 우측 하단의 [사용자 지정] 을 클릭합니다.

  • 1단계는, [이름] 만 설정한 뒤 넘어갑니다.

  • 2단계는, [탑재 대상] 에 존재하는 [보안 그룹] 을 전부 X 표시를 눌러 제거합니다.

  • 이전에 생성했던 [EFS 용 보안 그룹] 을 새롭게 등록한 뒤, 우측 하단의 [다음] 을 클릭합니다.

  • 3단계와 4단계는 아무런 설정 없이 넘어간 뒤, 파일 시스템을 생성합니다.

  • 생성된 파일 시스템의 이름을 클릭합니다.

  • 네비게이션 바의 [액세스 포인트] 에서, [액세스 포인트 생성] 을 클릭합니다.

  • [세부 정보][POSIX 사용자], [루트 디렉터리 생성 권한] 을 아래와 같이 입력한 뒤, 하단의 [액세스 포인트 생성] 을 클릭합니다.

4. EC2 접속 후, EFS 마운트를 위한 패키지 설치

  • 이전 단계에서 생성했던 EC2 에 접속합니다.

  • EFS 마운트를 위한 패키지를 설치합니다.

      sudo yum install -y amazon-efs-utils

5. EC2 에 EFS 마운트를 진행할 디렉토리 생성 후, 마운트 진행

  • 마운트를 진행할 디렉토리를 생성한 뒤, 접근합니다.

      mkdir -p /home/ec2-user/mountpoint/efs && cd /home/ec2-user/mountpoint
  • EFS 서비스 화면에서, 좌측 [액세스 포인트] 탭을 클릭한 뒤, 생성한 액세스 포인트의 [이름] 을 클릭합니다.

  • 우측 상단의 [연결] 을 클릭합니다.

  • 코드를 복사합니다.

  • EC2 에 복사한 코드를 붙여넣기 한 후, 실행합니다.

  • mount 가 정상적으로 진행되었는지 확인합니다.

      df -h

    • [127.0.0.1:/ 8.0E 0 8.0E 0% /home/ec2-user/mountpoint/efs] 을 통해 정상적으로 mount 된 것을 확인할 수 있습니다.

6. 마운트 디렉토리에 고용량 패키지 설치

  • Lambda 에서 사용할 패키지를 설치합니다. (수정 가능)

      # python3.8 설치를 위한 CentOS 패키지 설치
      sudo yum -y groupinstall "Development Tools"
      sudo yum -y install openssl-devel bzip2-devel libffi-devel
    
      # python3.8 파일을 직접 다운로드, 압축 해제 및 설치
      wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
      tar xvf Python-3.8.3.tgz
      cd Python-3.8*/
      ./configure --enable-optimizations
      sudo make altinstall
    
      # 패키지(numpy, etc, ..) 설치를 위한 CentOS 패키지 설치
      sudo yum -y install gcc-c++
      sudo yum -y install python3-devel
    
      # 패키지 설치 (--target 옵션을 이용하여 특정 위치에 패키지 설치)
      mkdir /home/ec2-user/mountpoint/efs/packages
      pip3.8 install --upgrade --target /home/ec2-user/mountpoint/efs/packages/ numpy
      pip3.8 install --upgrade --target /home/ec2-user/mountpoint/efs/packages/ tensorflow
  • 패키지 설치 완료를 확인합니다.

      ls /home/ec2-user/mountpoint/efs/packages
  • Lambda 에서 사용할 모델을 다운로드합니다. (선택사항)

      mkdir /home/ec2-user/mountpoint/efs/model && cd /home/ec2-user/mountpoint/efs/model
      wget "모델다운로드주소"
  • 모델 다운로드 완료를 확인합니다.

      ls /home/ec2-user/mountpoint/efs/model

7. Lambda 와 EFS 를 연결하기 위한 IAM 권한 생성

  • AWS Console 에서 IAM 서비스에 접속합니다.

  • 좌측 [역할] 탭에서, [역할 만들기] 를 클릭합니다.

  • [일반 사용 사례] 에서 [Lambda] 를 클릭한 뒤, 우측 하단의 [다음:권한] 을 클릭합니다.

  • 아래 3가지 권한을 검색하여 체크하고, 우측 하단의 [다음 : 태그] 를 클릭합니다.

    • AWSLambdaExecute
    • AWSLambdaVPCAccessExecutionRole
    • AmazonElasticFileSystemClientFullAccess
  • [태그 추가] 에선 아무런 설정 없이, [다음 : 검토] 를 클릭합니다.

  • [검토] 에선 [역할 이름] 만 설정한 뒤, [역할 만들기] 를 클릭합니다.

8. Lambda 함수 생성 및 EFS 연결, 테스트

  • AWS Console 에서 Lambda 서비스에 접속합니다.

  • [함수 생성] 을 클릭합니다.

  • [기본 정보] 는 아래와 같이 입력합니다.

    • 런타임 : Python 3.8
    • 실행 역할 : 기존 역할 사용
    • 기존 역할 : unho-lambda-efs-role
  • 하단의 [고급 설정] 을 클릭하고, 아래와 같이 설정한 뒤, [함수 생성] 버튼을 클릭합니다.

    • VPC : default
    • 서브넷 : 전부
    • 보안 그룹 : default
  • Lamda 함수의 메모리와 제한 시간 설정을 바꾸기 위해 [구성] 탭을 클릭한 뒤, [편집] 을 클릭합니다.

  • 기본 설정에서 [메모리][2048] 로 변경하고, [제한 시간][1 분] 으로 변경한 뒤, [저장] 합니다.

  • [구성] 탭의 좌측 하단 [파일 시스템] 항목을 클릭한 뒤, [파일 시스템 추가] 를 클릭합니다.

  • 이전에 생성한 EFS 를 Lambda 에 연결합니다.

9. Lambda Function 테스트

  • [코드] 탭의 [lambda_function.py] 에 원하는 코드를 입력합니다.

      import json
      import boto3
      import sys
    
      # EFS 내의 Package 를 Import 가능하도록 경로 추가
      sys.path.append("/mnt/efs/packages")
    
      # package import
      import numpy as np
      import tensorflow as tf
    
      # EFS 내의 Model 을 Load 하기
      sp_smdm_dnn_model = tf.keras.models.load_model('/mnt/efs/model/dnn_sp_smdm_model')
      bz_smsm_dnn_model = tf.keras.models.load_model('/mnt/efs/model/dnn_bz_smsm_model')
    
      # 메인 함수
      def lambda_handler(event, context):
    
          # event 로부터 feature 전처리
          lr = event["lr"]
          lc = event["lc"]
          rc = event["rc"]
          ld = event["ld"]
          rd = event["rd"]
          lnnz = event["lnnz"]
          rnnz = event["rnnz"]
    
          # 모델 입력으로 사용할 input_feature 생성
          input_feature = np.array([[lr,lc,rc,ld,rd,lnnz,rnnz]])
    
          # input_feature 에 대한 모델별 예측값 생성
          sp_smdm_dnn_result = sp_smdm_dnn_model.predict(input_feature)
          bz_smsm_dnn_result = bz_smsm_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 = "sp_smdm : " + str(sp_smdm_dnn_result[0]) + " , " + \
              "bz_smsm : " + str(bz_smsm_dnn_result[0]) + " , " + \
              "optim_method : " + optim_method
    
          # 결과 반환
          return {
              'statusCode': 200,
              'body': json.dumps(result)
          }
  • 코드 작성 후, 상단의 [Deploy] 를 클릭해, 코드를 저장(배포)합니다.

  • 상단의 [Test] 를 클릭한 뒤, 테스트 이벤트를 구성하고 [생성] 버튼을 클릭합니다.

  • 결과를 확인합니다.

Comments