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 |
댓글