Resizing Images On AWS Lambda
(이미지 출처 : https://aws.amazon.com/ko/lambda/features/)
고양이 방울(Belling The Cat) 앱을 구현하는 과정에서
AWS S3에 업로드 된 이미지의 크기를 리사이징하는 내용을 다뤘습니다.
(깨알같은 앱 홍보)
AWS Lambda 위에서 구현됐고 Python PIL(Pillow) 라이브러리를 이용했습니다. 그 내용에 대해서 공유합니다.
그리고 그 과정에서 만들어진 PIL 라이브러리를 포함한 ZIP 샘플을 공유드립니다.
전체구조 설명
S3에 파일이 업로드되면 그 이벤트에 의해 Lambda가 실행되고 이미지를 가로, 세로 1/2 크기로 리사이징 후 S3에 저장합니다.
- 업로드 된 S3 Bucket : sample
-
업로드 된 S3 파일명 : upload/original/sample.png
- 리사이징 된 S3 Bucket : sample-resized
- 리사이징 된 S3 파일명 : upload/original/sample.png
AWS Lambda에서 외부 라이브러리 사용하기
AWS Lambda에서 제공하는 기본 라이브러리 외의 다른 라이브러리를 사용하기 위해서는
해당 라이브러리를 소스코드와 함께 ZIP 으로 압축해서 AWS Lambda에 제공해야합니다.
하지만 이미 제가 만들어둔 결과물이 있으므로 모든 사람들이 동일한 작업을 반복해서 할 필요는 없어보입니다.
이 글에서는 이미 만들어둔 PillowOnAWSLambda.zip 파일로 진행하겠습니다.
하지만 추후에 Python, PIL 라이브러리 버전에 대한 이슈가 생길 경우에는 직접 AWS EC2 에서 PIL 라이브러리를 담은 ZIP 파일을 생성하셔야 합니다.
그 내용과 과정에 대해서는 Deploying Python Zip To AWS Lambda - 라이브러리 설치 글을 참고하시기 바랍니다.
PillowOnAWSLambda.zip 다운로드
$ cd /workspace/s3_image_resizing
$ wget https://github.com/dveamer/downloads/raw/master/AWS/PillowOnAWSLambda.zip
- 공유 위치 : PillowOnAWSLambda.zip
- Python 버전 : 3.x
- Pillow 버전 : 5.0.0
Python, PIL 버전이 확실하지 않습니다.
2018년 3월에 작업 후 EC2 인스턴스를 삭제해버리는 바람에 지금은 확인이 어렵습니다.
나중에 다시 만들게 되면 그 때는 버전을 기록확인해서 기록하도록 하겠습니다.
소스코드 작성
$ cd /workspace/s3_image_resizing
$ vi aws_lambda.py
aws_labmda.py
라는 파일을 생성하고 아래의 샘플 소스코드를 입력합니다.
from __future__ import print_function
import boto3
import os
import sys
import uuid
from PIL import Image
import PIL.Image
s3_client = boto3.client('s3')
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 handler(event, context):
for record in event['Records']:
bucket = record['s3']['bucket']['name']
key = record['s3']['object']['key']
download_path = '/tmp/{}{}'.format(uuid.uuid4(), key)
upload_path = '/tmp/resized-{}'.format(key)
s3_client.download_file(bucket, key, download_path)
resize_image(download_path, upload_path)
s3_client.upload_file(upload_path, '{}-resized'.format(bucket), key)
소스코드를 PIL ZIP에 추가하기
$ cd /workspace/s3_image_resizing
$ cp PillowOnAWSLambda.zip s3_image_resizing.zip
$ zip -g s3_image_resizing.zip ./aws_lambda.py
ZIP 파일 Lambda 올리기
Deploying Python Zip To AWS Lambda - Lambda에 등록 글을 참고하시기 바랍니다.
S3 Trigger 설정
AWS Lambda 웹콘솔에서 진행하시면 됩니다. (S3 웹콘솔에서 하는 법은 찾지 못했습니다.)
- Lambda > Function > Configuration > Designer 에서 S3를 선택합니다.
- 출력된
Configure Triggers
라는 입력창을 채워 넣으면 됩니다.- Bucket : S3 Bucket 명을 고르면 됩니다. S3에서 미리 생성 해두셔야합니다.
- Event Type : Trigger가 반응할 이벤트 종류를 의미합니다. 파일 생성(POST), 갱신(PUT), 복사(COPY), 삭제(DELETE) 등의 이벤트 종류가 있습니다.
- Prefix : Trigger가 반응할 디렉토리+파일 패턴의 prefix를 적어주시면 됩니다. 디렉토리 명을 적으시면 해당 디렉토리의 파일들에 대해서 Trigger가 동작한다고 생각하시면 됩니다. 주의할점은 시작을 “/” 로 하면 안됩니다. 예를들어,
/upload/original
로 설정하면 S3에 파일을 올려도 trigger가 동작하지 않습니다. 반드시upload/original
로 설정해야됩니다. - Filtter Pattern : Trigger에 등록할 파일의 확장자를 적어주시면 됩니다. 필터링 되는 내용이기 때문에 적지 않으셔도 됩니다.
Add
버튼을 누른 후Save
버튼을 눌러줍니다.
Lambda의 S3 접근 권한 등록
AWS IAM 웹콘솔에서 Lambda에게 S3 Trigger 이벤트에 대한 접근권한을 제공해줘야 합니다.
해당내용은 AWS IAM에 대한 내용이고 이미지 리사이징에 핵심 내용이 아니므로 이번 글에서는 다루지 않겠습니다.
Associated Posts
관련된 주제를 살펴볼 수 있도록 동일한 Tag를 가진 글들을 모아뒀습니다. 제목을 눌러주세요.-
Terraform, Helm을 이용한 AWS EKS 구성
(이미지 출처 : https://github.com/terraform-aws-modules)Terraform을 이용해서 AWS EKS를 구성하고 Helm을 이용해서 ingress와 application을 EKS 위에 띄우는 내용을 살펴봅니다.
진행방식은 AWS에서 제공한 from-zero-to-eks-with-terraform-and-helm 라는 가이드 문서의 예제를 따라하는 방식으로 진행합니다.... 더 읽기 -
Zappa를 이용해 AWS Lambda에 Flask 올리기
( 이미지 출처 : Wikipedia, https://aws.amazon.com/ko/lambda/features/ )Zappa라는 툴을 공유합니다.
AWS Lambda 위에서 Flask 프레임워크를 사용할 수 있게 해주며 귀찮던 AWS APIGateway path 추가 작업이 필요 없어집니다.
게다가 복잡한 배포 스크립트 작업 없이도 명령어 한줄만으로 배포 가능해집니다.
... 더 읽기 -
Python3.6 설치
( 이미지 출처 : Wikipedia )Ubuntu 14.04 LTS에서 Python3.6 을 컴파일 설치하는 법을 알아봅니다.
... 더 읽기 -
Python SimpleHTTPServer
-
AWS를 사용하면서 겪은 트러블슈팅 (DNS 기반 HA 관련 이슈)
-
Python WAS 구축하기 ( Django, Nginx, Gunicorn )
-
Deploying Python Zip To AWS Lambda
-
Sample Json Of AWS Events
-
Python 학습내용 기록