본문 바로가기
AWS

AWS Lambda 실습

by 장중앙 2021. 8. 26.

AWS Lambda

서버를 프로비저닝하거나 관리하지 않아도 코드를 실행 할 수 있도록 해주며 사용한 컴퓨팅 시간에 대해서만 비용을 지불하는 컴퓨팅 서비스.

필요 시에만 코드를 실행하며, 하루 몇 개의 요청에서 초당 수천 개의 요청까지 자동으로 확장가능함

 

 

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

사진을 업로드 시 사진의 크기를 1/2로 축소하여 다른 버킷에 저장

IAM 역할 생성 및 S3 버킷 설정

IAM 역할 생성

AWSLambdaBasicExecutionRole과 AmazonS3FullAccess 정책을 선택

생성한 역할 확인

 

프로그래밍 방식으로 AWS 리소스에 접근할 사용자 생성

EC2에서 생성한 이미지 라이브러리를 S3에 업로드할 사용자(S3에 대한 읽기 권한을 가져야함)

생성한 사용자 확인

2개의 버킷 생성

000-mybucket에 이미지 업로드

 

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

Lambda함수 생성

생성한 Lambda함수 확인

mybucket의 이미지의 크기가 수정되어 mybucket-resized에 저장되는 Lambda함수 코드 작성후 deploy

import boto3
import os
import sys
import uuid
from urllib.parse import unquote_plus
from PIL import Image
import PIL.Image

s3_client=boto3.client('s3')

#image_path의 이미지를 1/2로 줄여서 resized_path에 저장
def resize_image(image_path, resized_path):
    with Image.open(image_path) as image:
        image.thumbnail(tuple(x/2 for x in image.size))
        image.save(resized_path)
        
def lambda_handler(event, context):
    for record in event['Records']:
        bucket= record['s3']['bucket']['name'] #버킷명
        key=unquote_plus(record['s3']['object']['key']) #파일명
        tmpkey=key.replace('/','')
        download_path='/tmp/{}{}'.format(uuid.uuid4(), tmpkey)
        upload_path='/tmp/resized-{}'.format(tmpkey)
        s3_client.download_file(bucket, key, download_path)
        resize_image(download_path, upload_path)
        s3_client.upload_file(upload_path,'{}-resized'.format(bucket), key)

이벤트 트리거 추가

테스트 이벤트에서 버킷이름, mybucket에 업로드한 사진이름(key)를 수정

테스트시 에러발생

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

 

Lambda의 런타임인 Python3.7에서 라이브러리 작성 및 등록 

Lambda는 서버리스 시스템이기 때문에 자체적으로 라이브러리 설치가능

Lambda Layer에 등록할 수 있는 zip파일 형태의 라이브러리를 별도로 작성

 

이를 위한 EC2생성

쉘접속을 위해 퍼블릭 IP 자동 할당을 활성화

이후 쉘 접속을 위해 보안그룹에서 SSH 설정, 키페어 저장

다운받은 키페어를 이용하여 해당 인스턴스에 SSH 접속

더보기

shell script

 

sudo su
yum update -y
cd /home/ec2-user/


#필요한 라이브러리 설치 
sudo yum install gcc bzip2-devel ncurses-devel gdbm-devel xz-devel sqlite-devel openssl-devel tk-devel uuid-devel readline-devel zlib-devel libffi-devel

 

# python3.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/

 

#환경의 최적화 작업, 기존에 설치된 Python2.7에 덮어씀

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

 

#Lambda Layer 등록이 필요한 Pillow, boto3 설치, 설치된 라이브러리의 python3.7 site-package를 지정된 경로로 복사 zip생성

pip3.7 install pillow

pip3.7 install boto3

cd /usr/local/lib/python3.7/

mkdir -p /home/ec2-user/lambda_layers/python/lib64/python3.7/site-packages

mkdir -p /home/ec2-user/lambda_layers/python/lib/python3.7
cd /home/ec2-user/lambda_layers/
cp -r /usr/local/lib64/python3.7/site-packages  python/lib/python3.7/
ls /usr/local/lib/python3.7/site-packages/
ls ./python/lib/python3.7/site-packages/
zip -r lambda_layers.zip *

 

 

#AWS CLI를 통해 S3에 파일을 업로드 하기 위해 AWS Configure를 실행, 엑세스 키, region 정보를 추가로 입력
#이전에 사용자를 생성할때 저장한 엑셀파일 확인, 현재 작업중인 region 기입

aws configure

AWS Access Key Id [None] : ????

AWS Secret Access Key Id [None] : ???? 

AWS Default Region name [None] : ????

AWS Default output format [None] : 

 

#작성된 파일을 S3(업로드 버킷)로 업로드

aws s3 cp lambda_layers.zip s3://skuser68-mybucket

버킷에 업로드된 zip파일 확인

Lambda Layer 등록을 위해 Lambda 함수 -> 계층생성

링크 URL의 경우 bucket에 업로드된 .zip파일의 객체 URL

이전에 작성한 Lambda 함수로 이동, Layer를 등록

추가된 계층 확인

Lambda함수 테스트 실행

 

에러발생

S3버킷에 엑세스 권한이 없어서 발생(Lambda 함수 생성시 IAM 역할 만들기에서 만든 역할을 넣지 않음.....)

앞서 만든 역할 추가

테스트 성공

mybucket-resized에 추가되는 것을 확인

 

실제 버킷에 추가 (cat.jpg 업로드) 

업로드와 동시에 mybucket-resized에 추가되는 것을 확인

Lambda함수에서 이미지의 크기를 조절했기 때문에 리사이즈 버킷에서는 크기가 줄어든 것을 확인가능

mybucket/cat.jpg mybucket-resized/cat.jpg

 

댓글