✔️ 개요
- AWS Lambda 함수 생성
- S3 버킷을 Lambda 이벤트로 구성
- S3에 객체를 업로드해 Lambda 함수 트리거
- Amazon CloudWatch Log를 통해 AWS Lambda S3 기능 모니터링
✔️ 결과
1. 사용자가 S3의 소스 버킷에 객체를 업로드 (객체 생성 이벤트)
2. S3는 객체 생성 이벤트를 감지
3. S3는 Lambda 함수를 호출 → 이벤트 데이터를 함수 파라미터로 전달하여 객체 생성 이벤트를 AWS Lambda에 게시
4. Lambda는 Lambda 함수를 실행
5. Lambda 함수는 수신한 이벤트 데이터에서 소스 버킷 이름과 객체 키 이름을 알고 있다. Lambda 함수는 객체를 읽고 그래픽 라이브러리를 사용해 축소판을 생성한 다음 축소판을 대상 버킷에 저장한다.
해당 실습을 완료하면 계정에 다음 리소스가 제공된다.
✔️ S3 버킷 생성
두개의 S3 버킷을 생성한다. 하나는 입력용 다른 하나는 출력용이다.
[버킷 생성]을 클릭한 뒤 버킷의 고유한 이름을 지정한다 (ex. images-9613)
나머지 옵션을 기본값으로 남기고 화면 하단으로 스크롤한다.
같은 방식으로 출력용 다른 버킷을 생성한다. 해당 버킷은 버킷 이름 끝에 -resized를 넣는다.
업로드하고자 하는 이미지 파일을 HappyFace.jpg라는 이름으로 저장하고 사이즈를 확인한뒤 [업로드]한다.
✔️ AWS Lambda 함수 생성
Amazon S3에서 이미지를 읽고 이미지 크기를 조정한 다음 새 이미지를 S3에 저장하는 Lambda 함수를 생성한다.
서비스 메뉴에서 [Lambda]를 클릭하고 [함수 생성]을 클릭한다.
함수 생성 창에서 다음을 구성한다.
Lambda 함수에 S3에 액세스하여 이미지를 읽고 쓸 수 있는 권한을 부여한다.
- 기능 이름 : Create-Thumbnail
- 런타임 : Python 3.7
- ▶ 기본 실행 역할 변경 클릭
- 실행 역할 : 기존 역할 사용 선택
- 기존 역할 : lambda-execution-role 선택
[함수 생성]을 클릭
Lambda 함수는 Amazon Kinesis가 수신하는 데이터 또는 DynamoDB 데이터베이스에서 업데이트되는 데이터와 같은 활동에 의해 자동으로 트리거될 수 있다.
이번 실습에서는 S3 버킷에 새 객체가 생성될 때마다 Lambda 함수를 트리거한다.
[트리거 추가]를 클릭하고 다음을 구성한다.
- 트리거 선택 : S3
- 버킷: 이미지 버킷을 선택한다. (앞서 만든 image-9613)
- 이벤트 유형 : 모든 객체 생성 이벤트
- 재귀 호출의 경우 ☑ 입력과 출력 모두에 ... 알고 있습니다. 에 체크한다.
화면 하단으로 이동 후 [추가]를 클릭한다.
함수 개요를 확장하고 다이어그램 상단에서 Create-Thumbnail을 클릭한다.
[코드]를 클릭해 Lambda 함수를 구성한다.
에서 업로드 ▼ 를 클릭하고 S3의 위치를 선택한다.
S3 링크 URL: 아래 URL을 복사해 필드에 붙여넣는다.
https://s3-us-west-2.amazonaws.com/us-west-2-aws-training/awsu-spl/spl-88/2.3.18.prod/scripts/CreateThumbnail.zip
[저장] 클릭
Lambda 함수 예제
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((128, 128))
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)
- 들어오는 객체(Buckey, Key)의 이름이 포함된 이벤트 수신
- 이미지를 로컬 저장소에 다운로드한다.
- Pillow 라이브러리를 사용하여 이미지 크기 조정
- 크기가 조정된 이미지를 -resized 버킷에 업로드한다.
[런타임 설정] 섹션에서 [편집]을 클릭한다.
핸들러 입력 : CreateThumbnail.handler
[저장] 클릭
[구성] → [일반 구성] → [편집] 클릭
설명 입력 : Create a thumbnail-sized image
다른 설정은 기본값으로 두지만 다음은 이러한 설정에 대한 간략한 설명이다.
- 메모리는 함수에 할당된 리소스를 정의한다. 메모리를 늘리면 함수에 할당된 CPU도 늘어난다.
- Timeout은 함수 실행의 최대 지속 시간을 결정한다.
- [저장] 클릭
이제 Lambda 함수가 구성되었다.
✔️ 기능 테스트
작업에서는 Lambda 함수를 테스트한다.
[테스트] → [테스트 이벤트] 섹션에서 새 이벤트생성을 클릭한 다음 다음을 구성한다.
- 템플릿 : s3-put
- 이름 : Upload
S3에 업로드해 트리거될 때 Lambda 함수로 전송된 이벤트 데이터를 보여주는 샘플 템플릿이 표시된다.
이전에 생성한 버킷을 사용하도록 버킷 이름을 편집해야 한다.
example-bucket을 텍스트 편집기에 복사한 이미지 버킷의 이름 (images-9613)으로 바꾼다.
s3 섹션의 bucket 섹션의 name과 arn 섹션에서 버킷의 이름을 변경한다.
s3 섹션의 object 섹션의 key를 HappyFace.jpg로 변경한다.
[테스트]를 클릭한다.
이제 Lambda가 입력 이미지로 HappyFace.jpg를 사용해 함수를 트리거한다.
페이지 상단에 다음 메세지가 표시되어야 한다. 실행결과: 성공(로그)
▶ 확장할 세부 정보
- 실행 기간
- 구성된 리소스
- 사용된 최대 메모리
- 로그 출력
Amazon S3에 저장된 크기가 조정된 이미지를 볼 수 있다.
[서비스] 메뉴에서 S3를 클릭한다.
-resized 버킷의 이름을 클릭한 후 다음을 수행한다.
- HappyFace.jpg를 선택하기
- [열기]를 클릭하기
이미지는 원본 이미지보다 더 작다.
이미지를 images- 버킷에 업로드 한 다음 -resized 버킷에서 썸네일을 확인할 수 있다.
✔️ 모니터링 및 로깅
Lambda 함수를 모니터링하여 문제를 식별하고 디버깅에 도움이 되는 로그 파일을 볼 수 있다.
[서비스] 메뉴에서 Lambda를 클릭한다.
Create-Thumbnail 기능을 클릭한다.
[모니터] 탭을 클릭한다.
콘솔은 다음을 보여주는 그래프를 표시한다.
- 호출 : 함수가 호출된 횟수
- 기간 : 평균, 최소 및 최대 실행 시간
- 오류 수 및 성공률(%) : 오류 수 및 오류 없이 완료된 실행 비율
- 스로틀 : 너무 많은 기능이 동시에 호출되면 스로틀된다. 기본값은 1000개의 동시 실행이다.
- 비동기 전송 실패 : Lambda가 대상 또는 배달 못한 편지 대기열에 쓰려고 시도할 때 발생한 오류
- 반복자 수명 : 스트리밍 트리거(Amazon Kinesis 및 Amazon DynamoDB 스트림)에서 처리된 마지막 레코드의 수명을 측정
- 동시 실행 : 이벤트를 처리하는 함수 인스턴스의 수
Lambda 함수의 로그 메세지는 Amazon CloudWatch Logs에 보관된다.
[CloudWatch에서 로그 보기]를 클릭한다.
표시되는 로그 스트림을 클릭한다.
▶ 각 메세지를 클릭해 로그 메세지 세부 정보를 본다.
이벤트 데이터에는 요청 ID, 기간(밀리초), 청구 기간(가장 가까운 100ms로 반올림됨, 함수의 메모리 크기 및 함수가 사용한 최대 메모리가 포함된다.
'Public Cloud > AWS' 카테고리의 다른 글
[AWS] NACL과 Security Group의 차이 (2) | 2022.04.26 |
---|---|
[AWS] EFS(Elastic File System) 사용법 (0) | 2022.04.22 |
[AWS] CloudFormation으로 VPC 생성 및 업데이트하기 (0) | 2022.04.16 |
[AWS] AWS CloudFormation으로 웹 앱 런칭 및 관리하기 (0) | 2022.04.16 |
[AWS] AWS CLI와 SDK를 이용한 DynamoDB CRUD (0) | 2022.04.16 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!