Wisdom’s Cloud

[AWS] 28. AWS Lambda 본문

AWS/Beginner

[AWS] 28. AWS Lambda

지혜로운지혜쓰 2022. 3. 22. 15:28

구분 내용
서비스명 AWS Lambda
설명 - 서버에 대한 걱정 없이 코드 실행
- 사용한 컴퓨팅 시간에 대해서만 비용 지불
주요 특징 - 기존 코드 활용 가능(Node.js, Java, Python, Go, C#)
- 단순한 자원 모델을 가지며, 실행되는 메모리에 따라 CPU, N/W 자원 할당
- 여러 AWS 서비스들과 통합되어 있으며, Event, Request 기반으로 실행 가능
- 자체 Editor, Zip 배포, Cloud9을 통해 개발 및 배포 가능
- CloudWatch, X-ray를 통해 요청 수, 에러 수, 처리 시간, 처리량 모니터링 가능
- AWS IAM Role을 사용한 권한 관리와 AWS 이벤트 소스의 자원 정책 적용
프리티어(Free Tier) - 월 1백만 건 무료 요청과 월 400,000초 컴퓨팅 시간(메모리에 따라 변경됨)
- 프리티어는 12개월 이후에도 종료되지 않으며, AWS 고객에게 무기한 제공

 

 

Lambda의 서비스 동작 방식
  • 이벤트 소스로부터 함수 실행에 대한 트리거가 발생된다. (Amazon S3, Amazon DynamoDB, Amazon Kinesis, Amazon Cognito, Amazon RDS Aurora, Amazon Alexa, Amazon API Gateway, AWS IoT, AWS CloudFormation, AWS CloudTrail, Amazon CloudWatch, Amazon SES, Amazon SNS, CRON Event, AWS Step Function)
  • Lambda 함수를 다양한 런타임과 라이브러리를 활용하여 개발할 수 있다. (node.js, Python, Java, C#, Go, Ruby on Rails)
  • AWS의 다양한 리소스에 접근 가능하도록 권한을 설정하여 액세스 권한 및 실행 권한을 관리할 수 있다. (AWS Lambda 리소스 기반 정책, AWS Lambda 실행 역할)
  • AWS 서비스와 연결 및 연동을 통해 다양한 서비스를 개발하거나 구현할 수 있다. 

 

 

Lambda의 기대 효과

 

구분 내용
완전 관리형 서비스 - 가용성이 뛰어나며, 내결함성을 갖춘 인프라에서 코드 실행
- OS 패치나, 사용량 증가에 따른 서버 증설 및 관리 불필요
- 코드를 원활하게 배포하고 내장된 로깅 및 모니터링 기능 제공
기존 보유 코드 재활용 - 새로운 언어 및 도구, 프레임워크를 배울 필요 없음
- 기존 라이브러리 및 타사 도구 활용 가능
- 모든 코드나 라이브러리를 Layer로 만들어 손쉽게 공유 활용 가능
통합된 보안 모델 - 내장 SDK, IAM과 통합하여 코드가 안전하게 다른 서비스의 액세스 제공
- 기본적으로 VPC 내부에서 코드가 실행되며, 리소스의 액세스 제어 가능
사용량 기반 지불 - 코드 실행에 필요한 컴퓨팅 시간 및 지원된 요청에 대해서만 비용 지불
- 100밀리초 단위로 청구 금액이 정산되기 때문에 비용 효율적인 서비스
높은 내결함성 - 각 리전의 여러 가용 영역의 컴퓨팅 파워를 활용하여 높은 내결함성
- 데이터 센터나 시설에 장애가 발생되어도 코드에 대한 보호 가능
- 유지 관리 시간이나 예약된 가동 중단 시간 없음
자동 규모 조정 - 사용량 변화에 따라 고객이 관리할 필요가 없으며, 자동으로 확장
- 하루 몇 개의 요청부터 1초당 수천 개의 요청까지 자동으로 쉽게 확장
- 이벤트 발생 빈도의 증가에 상관 없이 일관되게 높은 성능 유지

 

 

Lambda의 서비스 모델
  • Synchronous(Push): Amazon API Gateway와 연동으로 웹 애플리케이션을 통한 Request 수신 및 처리 결과에 대한 Feedback 제공  ex) 웹 애플리케이션, 모바일 백엔드, IoT 백엔드
  • Asynchronous(Event): Amazon SNS, Amazon S3 등의 이벤트 수신을 통해 트리거되어, 요청에 대한 처리 후 결과를 별도 저장 및 다른 서비스로 전송 처리  ex) 파일 또는 이미지 변환, 실시간 요청사항 처리, 타서비스 연동 및 전달
  • Stream-Base: Amazon DynamoDB, Amazon Kinesis로부터 상태 변경에 따른 트리거나 스트림베이스의 요청에 따른 사항 처리 및 타서비스 연동  ex) 실시간 스트림 처리, 데이터 추출 및 변환 서비스

 

 

실습: Lambda Console을 활용한 Hello World

 

1. 콘솔에 로그인한 후, [서비스] -> [컴퓨팅] -> [Lambda] -> [함수]로 이동하여 [함수 생성] 버튼을 클릭한다.
2. 함수 생성 페이지에서 [새로 작성] 버튼을 클릭하고 함수 이름을 입력한다. 런타임에 [Python 3.7]을 선택한 후 [함수 생성] 버튼을 클릭한다.
3. 함수 생성이 완료되면 [Test] 버튼을 클릭한다.
4. 테스트 이벤트 구성 페이지에서 이벤트 이름을 입력한 후, [저장] 버튼을 클릭한다.
5. 코드 소스 항목에서 샘플로 작성된 python 3.7용 코드를 확인하고, [Test] 버튼을 클릭한다.
6. 새로운 창이 생기고, Execution results를 확인할 수 있다.
7. 모니터링 탭에서 Lambda 함수 실행에 대한 CloudWatch 지표를 모니터링할 수 있다.

 

 

실습: S3와 Lambda로 이미지 Thumbnail 생성

 

* AWS Lambda 함수를 활용하여 S3로 파일을 업로드하는 경우 Lambda 트리거가 발동하여 Lambda를 실행시키고,

Python과 이미지 조정을 위한 Python 이미지 조정 라이브러리를 이용하여 이미지 사이즈를 조정해

별도의 S3 버킷으로 저장하는 로직을 이번 실습을 통해 구현한다. *

 

Step 1 IAM 역할 생성 및 S3 버킷 설정

1. [서비스] -> [보안, 자격 증명 및 규정준수] -> [역할]로 이동하여 [역할 만들기] 버튼을 클릭한다.
2. 신뢰할 수 있는 엔터티 선택 페이지에서 [Lambda]를 선택한 후, [다음] 버튼을 클릭한다.
3. 권한 추가 페이지에서 [AWSLambdaBasicExecutionRole]을 선택한다.
4. 그리고 [AmazonS3FullAccess]도 선택한 후, [다음] 버튼을 클릭한다.
5. 이름 지정, 검토 및 생성 페이지에서 역할 이름을 입력한 후, [역할 생성] 버튼을 클릭한다.
6. 파일 업로드와 변환을 위한 S3 Bucket 2개를 생성하기 위해 [서비스] -> [스토리지] -> [S3]로 이동하여 [버킷 만들기] 버튼을 클릭한다.
7. 버킷 만들기 페이지에서 고유한 버킷 이름을 입력한 후, [버킷 만들기] 버튼을 클릭한다.
8. 테스트를 위해 방금 생성한 버킷에 이미지 파일을 업로드한다.
9. 기존에 생성한 버킷과 이름을 동일하게 작성하고 버킷 이름 뒤에 '-resized'를 추가하여 버킷을 만든다.

 

Step 2 Lambda 함수 생성 및 기본 설정 구성

1. Lambda 함수 생성을 위해 [서비스] -> [컴퓨팅] -> [Lambda] -> [함수]로 이동하여 [함수 생성] 버튼을 클릭한다.
2. 함수 생성 페이지에서 [새로 작성] 버튼을 클릭하고 함수 이름을 입력한다. 런타임에 [Python 3.7]을 선택한 후 [함수 생성] 버튼을 클릭한다.
3. 코드 소스 부분에 아래와 같이 작성하여 저장한 후, [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)

 

4. 구성 탭의 권한 부분에서 실행 역할의 [편집] 버튼을 클릭한다.
5. 기본 설정 편집 페이지에서 기존 역할을 이전에 생성한 역할로 변경한 후, [저장] 버튼을 클릭한다.
6. 구성 탭의 트리거 부분에서 [트리거 추가] 버튼을 클릭한다.
7. 추가 트리거 페이지에서 서비스로 [S3]를 선택하고, 버킷은 이전에 생성한 버킷으로 선택한 후, [추가] 버튼을 클릭한다.
8. 코드 탭에서 [Test] 버튼을 클릭한 후, 이벤트 이름을 입력하고 템플릿을 [s3-put]으로 선택한다.
9. 그리고 테스트용 코드 중 'example-bucket' 항목이 들어가는 2개의 항목을 이전에 생성한 버킷 이름으로 수정하고, 'Object' 항목의 key에 대한 값을 이전에 버킷에 업로드한 파일 이름으로 수정한 후, [저장] 버튼을 클릭한다.
10. 테스트 이벤트 생성 완료 후 [Test] 버튼을 클릭하면 다음과 같이 오류가 발생한다.

* 위 오류는 S3에 Thumbnail을 생성하기 위해 Python 3.7에서 사용되는 라이브러리인

'PIL' 라이브러리가 등록되지 않아서 발생된 오류이다.

따라서 Python의 라이브러리를 Lambda에 사용하기 위해서는

Lambda Layer에 등록할 수 있는 zip 파일 형태의 라이브러리를 별도로 작성하여야 하며,

이를 위해 개발을 위한 EC2를 하나 설치하여 진행하는 것을 권장한다. *

 

 

Step 3 Lambda의 Runtime인 Python 3.7에서 라이브러리 작성 및 등록

1. EC2 생성을 위해 [서비스] -> [컴퓨팅] -> [인스턴스]로 이동한 후, [인스턴스 시작] 버튼을 클릭한다.
2. AMI 선택 페이지에서 'Amazon Linux 2 AMI'의 [선택] 버튼을 클릭한다.
3. 인스턴스 유형 선택 페이지에서 't2.micro'를 선택한 후, [검토 및 시작] 버튼을 클릭한다.
4. 인스턴스 시작 검토 페이지에서 [시작하기] 버튼을 클릭한다.
5. 새로운 키 페어 생성을 위해 키 페어 이름을 입력한 후, [키 페어 다운로드] 버튼을 클릭하여 PC에 키 페어를 저장한다. 그리고 [인스턴스 시작] 버튼을 클릭한다.
6. 다운로드 받은 키 페어 파일을 pem에서 ppk로 변환하기 위해 PuTTYgen 프로그램을 실행한다. [Conversions] -> [Import key]를 클릭하여 이전에 다운받은 pem 파일을 선택한 후, [Save private key] 버튼을 클릭하여 ppk 파일로 변환하여 저장한다.
7. PuTTY를 실행하여 변환한 ppk 파일을 등록한 후, 생성한 인스턴스의 퍼블릭 IP 주소를 입력하여 인스턴스에 로그인한다. 그리고 아래의 명령어를 수행한다.

# Root 권한 획득 및 인스턴스 업데이트
sudo su
sudo yum update -y

# 필요한 라이브러리 설치
yum install gcc bzip2-devel ncurses-devel gdbm-devel xz-devel sqlite-devel openssl-devel tk-devel uuid-devel readline-devel zlib-devel libffi-devel

# Python 3.7의 다운로드 및 압축 해제
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
tar -xJf Python-3.7.0.tar.xz
cd Python-3.7.0

# 환경의 최적화 및 구성 (기존에 설치된 Python 2.7과 병행 사용하기 위해 make install 대신 make altinstall을 사용)
./configure --enable-optimizations
make altinstall
export PATH=$PATH:/usr/local/bin

# Lambda layer 등록이 필요한 pillow와 boto3에 대한 설치
pip3.7 install --upgrade pip
pip3.7 install pillow
pip3.7 install boto3

# 설치된 라이브러리의 Python3.7 site-packages를 지정된 경로로 복사한 후, 정상적으로 라이브러리가 등록되었는지 확인
mkdir -p /home/ec2-user/lambda_layers/python/lib/python3.7/site-packages
cd /usr/local/lib/python3.7
cp -r site-packages /home/ec2-user/lambda_layers/python/lib/python3.7/
cd /usr/local/lib64/python3.7
cp -r site-packages /home/ec2-user/lambda_layers/python/lib/python3.7/
cd site-packages
ls -al

# lambda_layers 폴더로 이동한 후, 등록된 라이브러리들을 zip 명령을 이용하여 lambda_layers.zip 파일명으로 압축
cd /home/ec2-user/lambda_layers
zip -r lambda_layers.zip *
ls -al

# AWS CLI를 통해 S3에 파일을 업로드하기 위해 AWS Configure를 실행
aws configure

# 작성된 파일을 S3로 업로드
aws s3 cp lambda_layers.zip s3://thumnail0322

 

8. 파일이 업로드된 S3 Bucket으로 이동한 후, 업로드된 파일의 URL을 확인하여 복사한다.
9. Lambda layer 등록을 위해 Lambda의 계층 메뉴에서 [계층 생성] 버튼을 클릭한다.
10. 계층 생성 페이지에서 이름을 입력한 후, [Amazon S3에서 파일 업로드]를 선택하여 이전에 복사했던 S3에 업로드된 라이브러리 URL을 입력한다. 그리고 호환 런타임을 [Python 3.7]로 선택한 후, [생성] 버튼을 클릭한다.
11. 이전에 작성된 Lambda 함수로 이동하여 계층 부분의 [Add a layer] 버튼을 클릭한다.
12. 계층 추가 페이지에서 [사용자 지정 계층]을 클릭하여 이전에 생성한 계층을 선택한 후, [추가] 버튼을 클릭한다.
13. 다시 [Test] 버튼을 클릭하면 에러 없이 정상적으로 테스트가 수행됨을 확인할 수 있다.
14. resized 버킷으로 이동하여 Thumbnail 이미지가 정상적으로 생성됨을 확인할 수 있다.
왼쪽: 447 X 360 / 오른쪽: 223 X 180

'AWS > Beginner' 카테고리의 다른 글

[AWS] 30. 클라우드 용어 정리(12)  (0) 2022.03.27
[AWS] 29. Amazon CloudWatch  (0) 2022.03.24
[AWS] 27. AWS OpsWorks  (0) 2022.03.21
[AWS] 26. AWS CloudFormation  (0) 2022.03.19
[AWS] 25. 클라우드 용어 정리(11)  (0) 2022.03.19