본문 바로가기
  • 클라우드야 나랑 친해지자!
클라우드/AWS

Lambda와 S3로 이미지 썸네일 생성

by 정민규 2021. 4. 8.
반응형

수업을 듣고 배운 내용과 연습한 내용을 정리하였습니다

개인 공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

 

잘못된 부분이 있거나 질문사항은 댓글로 남겨주시면 성심성의껏 답변해드리겠습니다. 감사합니다!


 

교재 <아마존 웹 서비스 AWS DevOps Discovery Book - 권영환 지음>를 토대로 실습을 진행하였습니다.

 

 

 

* 실습요약

1. IAM 역할 생성 및 S3 버킷 설정

2. Lambda 함수 생성 및 기본 설정 구성

3. Lambda의 Python 3.7에서 라이브러리 작성 및 등록 방법

4. 생성된 리소스 종료

 

 

 

 

 

 

 

1. IAM 역할 생성 및 S3 버킷 설정

 

IAM > 역할 만들기 > 

 

 

 

 

'AWSLambdaBasicExecutionRole' , 'S3FullAccess' 항목 체크 

 

 

 

적절한 이름 입력 후 '만들기' 클릭

 

 

 

 

 

사용자 추가 > 이름 입력 > 프로그래밍 방식 액세스 체크 >

 

 

 

S3FullAccess 정책 연결 > 만들기 > csv 파일 다운로드

 

 

 

 

IAM 설정을 했다면 S3 버킷을 생성한 후, 테스트를 위해 이미지 파일을 업로드 합니다.

mohang.jpg
0.04MB

 

 

 

기존에 생성한 버킷 이름과 동일하게 작성하고 뒤에 '-resized' 를 추가해 버킷을 생성합니다.

(향후 Lambda 테스트를 위해 필요함)

 

 

 

 

 

 

 

 

2. Lambda 함수 생성 및 기본 설정 구성

 

Lambda 검색 > 함수 생성

 

 

 

 

 

[함수 코드] 작성 페이지에 다음과 같이 작성하여 저장합니다.

lambda_function.py
0.00MB

 

 

 

 

 

구성 > 권한 > 실행 역할 편집 > Lambda-S3-ExcutionRole 선택

 

 

 

 

 

트리거 추가 > S3 선택 > 처음 생성한 버킷 선택 > 만들기

 

 

 

 

 

 

테스트 > 이벤트 템플릿 : Amazon S3 Put > 이벤트 이름 : S3PutTest > 코드 수정

 

example-bucket 항목이 들어가는 자리에 이전에 생성한 버킷 이름으로 수정하고

'Object' 항목의 key에 대한 값을 'mohang.jpg'로 수정 후 저장합니다.

제 버킷 이름은 mybucket0408 입니다. 아래 사진은 오타난 사진입니다.

 

 

 

 

 

 

코드로 돌아와 'Deploy' 를 눌러 저장한 후, 테스트로 돌아와 '호출' 을 눌러 테스트해봅니다.

 

S3에 Thumbnail을 생성하기 위해 Python 3.7에서 사용되는 라이브러리인 'PTL' 라이브러리가 등록되지 않아서 발생된 오류입니다.

아래 단계를 통해 Python 3.7 라이브러리를 사용해보도록 하겠습니다.

 

 

 

 

 

 

 

 

3. Lambda의 Python 3.7에서 라이브러리 작성 및 등록 방법

 

EC2 생성 > Amazon Linux AMI 2 선택 > t2.micro 선택 > [검토 및 시작] 클릭 > 보안그룹에서 SSH에 대해 0.0.0.0/0 포트가 열려있는지 확인 >키페어 생성 > 키페어 다운로드 > 인스턴스 시작

인스턴스 상태가 '실행 중' 으로 변경될 때 까지 기다립니다.

 

 

 

 

다운로드 받은 키 페어 파일을 pem -> ppk로 변환합니다.

Puttyygen 실행 > 'Conversions -> import' > pem 파일 선택 > 'Save private key' 클릭

 

 

 

 

EC2 인스턴스를 Putty로 실행합니다.

 

인스턴스 업데이트를 하고, Root 권한 획득 작업을 수행합니다.

$sudo yum update -y
$sudo su

 

 

 

기존에 설치되어 있던 python2.7 Packages 중 PIL 라이브러리 제거 작업을 진행합니다.

$cd /usr/lib64/python2.7/site-packages/
$rm -rf PIL

 

 

 

필요한 라이브러리 설치를 진행합니다.

$sudo yum install -y gcc bzip2-devel ncurses-devel gdbm-devel xz-devel sqlite-devel openssl-devel tk-devel uuid-devel readline-devel zlib-devel libffi-devel

 

 

 

python 3.7의 다운로드와 압축 해제 작업을 수행합니다.

$wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
$tar -xJf Python-3.7.0.tar.xz
$cd Python-3.7.0

 

 

 

환경의 최적화 작업 및 구성 진행, 기존에 설치된 Python 2.7과 병행 사용하기 위해 make install(기존 2.7을 덮어씀) 대신 make altinstall을 사용합니다.

$./configure --enable-optimizations
$make altinstall
$export PATH=$PATH:/usr/local/bin

 

 

 

 

Lambd layer 등록이 필요한 Pillow, boto3에 대한 설치를 진행하고, 설치된 라이브러리의  Python3.7 site-packages를 지정된 경로로 복사한 후 정상적으로 라이브러리가 등록되었는지 확인합니다.

 

$pip3.7 install pillow
$pip3.7 install boto3
$cd /usr/local/lib/python3.7/
$mkdir -p /home/ec2-user/lambda_layers/python/lib/python3.7/site-packages
$cp -r site-packages /home/ec2-user/lambda_layers/python/lib/python3.7/
$cd site-packages
$ls -al

 

저는 pip3.7 명령어를 실행할 때 ImportError가 발생해서 실행이 안됐습니다.

이 오류는 새롭게 pip를 업데이트했을 때 pip에 설치된 main module를 찾을 수 없다는 것이였는데,

업데이트 이전에 모듈을 설치하여 에러를 해결할 수 있었습니다.

$sudo python3 -m pip uninstall pip && sudo yum install python3-pip --reinstall

제대로 재설치가 되지 않아도 일단 실행하고 다시 pip3.7 install pillow를 실행해보니 정상적으로 실행되었습니다.

 

 

 

 

 

lambda_layers 폴더로 이동 후 등록된 라이브러리들을 zip 명령을 이용하여 lambda_layers.zip 파일명으로 압축을 진행합니다.

$cd /home/ec2-user/lambda_layers
$zip -r lambda_layers.zip *
$ls -al

 

 

 

 

AWS CLI를 통해 S3에 파일을 업로드하기 위해 AWS configure를 실행하고, 이전에 발급받은 IAM의 신규 사용자 정보 중 액세스 키, 비밀 액세스 키와 본인 서비스에 대한 리전 정보를 추가로 입력합니다.

ouput format은 그냥 [Enter] 치시면 됩니다.

 

 

이제 작성된 파일을 S3로 업로드합니다.

$aws s3 cp lambda_layers.zip s3://버킷이름

 

 

 

 

파일이 업로드된 S3 Bucket으로 이동 후 업로드된 파일의 URL을 확인하여 복사합니다.

 

 

 

 

 

Lambda Layer 등록을 위해

Lambda > 계층 > 계층 생성

 

 

 

 

 

함수 > 계층 > Add a Layer

 

 

 

 

 

 

테스트에서 '호출'을 클릭하여 정상적으로 테스트가 수행됨을 확인합니다.

 

근데.....어찌 된 일인지 실패만 뜨네요......ㅜ

뭐가 문제인지 잘 모르겠네요...

 

 

 

하여튼!!

 

테스트에서 '호출'을 클릭하였을 때,

첫 번째로 생성한 S3버킷으로 이동하여 이미지 파일을 업로드하고, 두 번째로 생성된 S3버킷으로 이동하여 사이즈가 변경된 이미지가 정상적으로 생성됨을 확인하시면 됩니다..!

반응형

댓글