이상을 꿈꾸는 몽상가.. 프로그래밍을 좋아함..


Resizing Images On AWS Lambda

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

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 웹콘솔에서 하는 법은 찾지 못했습니다.)

S3 Trigger 설정

  • 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를 가진 글들을 모아뒀습니다. 제목을 눌러주세요.

i