Public Cloud/AWS

[AWS] Lambda 실습

TTOII 2022. 4. 16. 23:28
728x90

✔️ 개요

  • AWS Lambda 함수 생성
  • S3 버킷을 Lambda 이벤트로 구성
  • S3에 객체를 업로드해 Lambda 함수 트리거
  • Amazon CloudWatch Log를 통해 AWS Lambda S3 기능 모니터링

✔️ 결과 

출처 : Amazon Qwiklabs

1. 사용자가 S3의 소스 버킷에 객체를 업로드 (객체 생성 이벤트)

2. S3는 객체 생성 이벤트를 감지

3. S3는 Lambda 함수를 호출 → 이벤트 데이터를 함수 파라미터로 전달하여 객체 생성 이벤트를 AWS Lambda에 게시

4. Lambda는 Lambda 함수를 실행

5. Lambda 함수는 수신한 이벤트 데이터에서 소스 버킷 이름과 객체 키 이름을 알고 있다. Lambda 함수는 객체를 읽고 그래픽 라이브러리를 사용해 축소판을 생성한 다음 축소판을 대상 버킷에 저장한다.

 

해당 실습을 완료하면 계정에 다음 리소스가 제공된다.

출처 : Amazon Qwiklabs

✔️ 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로 반올림됨, 함수의 메모리 크기 및 함수가 사용한 최대 메모리가 포함된다. 

 

 

728x90