본문 바로가기
개발/AWS

AWS Lambda-Layers 테스트 Python

by 궁즉변 변즉통 통즉구 2022. 2. 19.
반응형

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' 클릭으로 반영

코드출처: https://github.com/saga111/AWSDevOpsDiscoveryBook

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

댓글