AWS Lambda
서버를 프로비저닝하거나 관리하지 않아도 코드를 실행 할 수 있도록 해주며 사용한 컴퓨팅 시간에 대해서만 비용을 지불하는 컴퓨팅 서비스.
필요 시에만 코드를 실행하며, 하루 몇 개의 요청에서 초당 수천 개의 요청까지 자동으로 확장가능함
S3와 Lambda로 이미지 썸네일 생성 실습
사진을 업로드 시 사진의 크기를 1/2로 축소하여 다른 버킷에 저장

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

AWSLambdaBasicExecutionRole과 AmazonS3FullAccess 정책을 선택

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

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


2개의 버킷 생성

000-mybucket에 이미지 업로드

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

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 |
![]() |
![]() |
'AWS' 카테고리의 다른 글
[EC2] no space left on device (0) | 2024.03.03 |
---|---|
Spring 애플리케이션 내에서 AWS Parameter Store 사용 (1) | 2023.08.01 |
AWS CloudFormation (2)- 웹 애플리케이션 배포 및 관리 실습 (0) | 2021.08.25 |
AWS CloudFormation (1)- VPC생성 실습 (0) | 2021.08.25 |
AWS CodeDeploy를 이용한 현위치 배포 (0) | 2021.08.19 |
댓글