Wisdom’s Cloud
[AWS] 28. AWS Lambda 본문
구분 | 내용 |
서비스명 | 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
실습: S3와 Lambda로 이미지 Thumbnail 생성
* AWS Lambda 함수를 활용하여 S3로 파일을 업로드하는 경우 Lambda 트리거가 발동하여 Lambda를 실행시키고,
Python과 이미지 조정을 위한 Python 이미지 조정 라이브러리를 이용하여 이미지 사이즈를 조정해
별도의 S3 버킷으로 저장하는 로직을 이번 실습을 통해 구현한다. *
Step 1 IAM 역할 생성 및 S3 버킷 설정
Step 2 Lambda 함수 생성 및 기본 설정 구성
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에 Thumbnail을 생성하기 위해 Python 3.7에서 사용되는 라이브러리인
'PIL' 라이브러리가 등록되지 않아서 발생된 오류이다.
따라서 Python의 라이브러리를 Lambda에 사용하기 위해서는
Lambda Layer에 등록할 수 있는 zip 파일 형태의 라이브러리를 별도로 작성하여야 하며,
이를 위해 개발을 위한 EC2를 하나 설치하여 진행하는 것을 권장한다. *
Step 3 Lambda의 Runtime인 Python 3.7에서 라이브러리 작성 및 등록
# 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
'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 |