Lambda-Layers 사용해서 S3 이미지 Thumbnail 생성
1. Lambda에 부여할 IAM 역할 생성
- IAM메뉴로 접속해서 '역할만들기' 클릭
- 하단에 Lambda 선택하고 다음 클릭
- 권한추가에서 S3와 연동하기 위해 "lambda", "s3"로 검색하여 'AmazonS3ObjectLambdaExecutionRolePolicy'와 "AmazonS3FullAccess" 선택하고 다음 클릭
- 역할 이름은 "Lambda-S3-Exec"로 입력하고 하단에 '역할생성' 버튼 클릭
2. S3 버킷 생성
- S3메뉴의 '버킷만들기' 클릭하여 이름만 입력하고 나머지는 디폴트로 두고 버킷 2개(mytest-upload, mytest-upload-resized) 생성
- 버킷 생성 확인
- "mytest-upload" 버킷에서 '업로드' 버튼 클릭해서 샘플 이미지 하나 업로드
3. Lambda 생성
- Lambda 메뉴에서 '함수생성' 클릭하여 함수 이름("createS3Thumbnail"), 런타임(Python 3.7) 입력하고, 권한에서 '기존 역할 사용' 선택하여 위에서 생성한 역할("Lambda-S3-Exec") 선택 후 함수 생성
- 코드에서 실행할 python 코드 입력 후 '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')
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)
- '트리거 추가' 버튼 클릭
- S3를 선택하고 위에서 생성한 버킷 "mytest-upload" 선택 후 추가
- '테스트' 탭에서 템플릿을 's3-put' 을 선택, 이름은 "S3PutTest" 입력,
하단의 코드에서 'example-bucket'로 되어 있는 부분을 생성한 'mytest-upload' 버킷으로 변경, Object.key 항목은 위에서 S3 샘플로 업로드한 이미지명(lambda.png)으로 변경
- 우측 상단 '변경사항 저장' 버튼 클릭 후 '테스트' 버튼 클릭
- 에러 확인, Python3.7 라이브러리 생성 후 Lambda Layer 등록 필요 함
4. Lambda-Layer용 zip파일을 생성
- 일단 기본 EC2 하나 생성 후 접속
- EC2에 필요한 라이브러리를 설치한 후 이를 ZIP으로 압축하여 Lambda-Layer에서 사용하기 위해 S3에 업로드.
Python같은 경우 zip파일 내의 경로는 반드시 "python" 디렉토리로 시작해야하고, 그 python디렉토리에 라이브러리가 설치되어 있어야 함
sudo yum update -y
sudo su
# python3 설치 확인
python3 -V
# 라이브러리 설치를 위해 디렉토리 생성
mkdir -p /home/ec2-user/lambda_layers/python
cd /home/ec2-user/lambda_layers/python
# "python"디렉토리에 라이브러리 설치
pip3 install pillow -t .
pip3 install boto3 -t .
# zip 압축
cd ..
zip -r lambda_layers.zip *
# s3 업로드
aws s3 cp lambda_layers.zip s3://mytest-upload
5. Lambda Layer 설정
- Lambda '계층' 메뉴에서 Layer 생성, layer zip파일은 S3에 업로드 했음으로 'Amazon S3에서 파일 업로드' 선택하고, S3의 zip파일 URL 입력, 호환 런타임은 Python3.7 선택 후 생성
- Layers 클릭해서 Layers 등록화면 실행
- 사용자 지정 계층 선택하고, 위에서 생성한 Layer 선택
- 다시 테스트를 실행해 보면 정상 동작
- 'mytest-upload-resized' 버킷 확인해보면 resize된 이미지 업로드 되어 있음
- 이제 S3 'mytest-upload' 버킷에 다른 이미지를 업로드 할때마다 Lambda가 동작하여 'mytest-upload-resized' 버킷에 자동으로 resize된 이미지가 등록해줌
'개발 > AWS' 카테고리의 다른 글
CloudWatch Event 테스트(EventBridge) (0) | 2022.02.20 |
---|---|
AWS CloudWatch 이해 및 지표보기 (0) | 2022.02.20 |
AWS Lambda - Hello World (0) | 2022.02.19 |
AWS Lightsail 이해 및 테스트 (0) | 2022.02.09 |
AWS IAM 개념 및 테스트 (0) | 2022.02.06 |
댓글