우노
[AWS Lambda] Amazon EFS 기반 Lambda 함수 구현 본문
목표
- Tensorflow 모델을 사용해, 입력에 대한 예측값을 출력해주는 Lambda Function 을 생성합니다.
- Lambda Function 은 모델을 사용하기 위해 고용량 패키지를 호출해야하는데,
- AWS Lambda 에서 제공해주는 파일 저장소는 크기 제한이 존재하므로
- Amazon EFS 를 통해 AWS Lambda 에서 고용량 패키지를 사용 가능하도록 설정합니다.
순서
- Lambda 에서 사용할 package 를 EFS 에 설치
- EFS 를 마운트 할 EC2 생성
- Lambda 에서 EFS 로 접근하기 위해, EFS 용 보안 그룹 생성
- EFS 및 액세스 포인트 생성
- EC2 접속 후, EFS 마운트를 위한 패키지 설치
- EC2 에 EFS 마운트를 진행할 디렉토리 생성 후, 마운트 진행
- 마운트 디렉토리에 고용량 패키지 설치
- Lambda 함수 생성
- Lambda 와 EFS 를 연결하기 위한 IAM 권한 생성
- Lambda 함수 생성 및 EFS 연결
- 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] 를 클릭한 뒤, 테스트 이벤트를 구성하고 [생성] 버튼을 클릭합니다.
결과를 확인합니다.
'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] Container Image 기반 Lambda 함수 구현 (4) | 2021.08.16 |
[AWS Lambda] S3 파일 다운로드 (2) | 2021.05.18 |