ENCORE CLOUD ARCHITECTURE TIL 2/17

신민창·2021년 2월 17일
0

TIL

목록 보기
10/46

AWS Lambda

서버 리스 환경 구현

서버리스 컴퓨팅이란 무엇인가?

서버리스 컴퓨팅을 사용하면 서버를 생각하지 않고 애플리케이션과 서비스를 구축하고 실행할 수 있습니다. 서버
리스 애플리케이션에서는 사용자가 서버를 프로비저닝, 확장, 관리할 필요가 없습니다. 거의 모든 유형의 애플리
케이션 또는 백엔드 서비스를 위해 서버리스 애플리케이션을 구축할 수 있으며, 애플리케이션을 고가용성으로 실
행하고 확장하는 데 필요한 모든 것이 자동으로 처리됩니다.
서버리스 컴퓨팅은 왜 사용합니까?
서버리스 애플리케이션 구축은 개발자가 클라우드든 온프레미스든 서버 또는 런타임의 관리 및 운영에 신경을
쓰는 대신 핵심 제품에 집중할 수 있다는 것을 의미합니다. 이렇게 오버헤드가 줄어들면 개발자는 확장성과 안정
성을 갖춘 훌륭한 제품을 개발하는 데 시간과 에너지를 쏟을 수 있습니다.
참조 https://aws.amazon.com/serverless/

AWS Lambda

완전 관리형 컴퓨팅 서비스
상태 비저장 코드 실행
Node.js, Java, Python, C#, Go, Ruby 지원
일정에서 또는 이벤트에 대한 응답으로 코드 실행
(예: Amazon S3 버킷 또는 Amazon DynamoDB 테이블의 데이터 변경)
엣지에서 실행 가능

AWS Lambda – 작동 방식

2

AWS Lambda의 핵심 구성 요소는 이벤트 소스와 Lambda 함수입니다.
이벤트 소스는 이벤트를 게시하고, Lambda 함수는 이벤트를 처리하도록 사용자가 작성하는 사용자 지정 코드입
니다. Lambda는 사용자 대신 Lambda 함수를 실행합니다.
Lambda 함수는 코드, 관련 종속성 및 구성으로 이루어집니다. 구성에는 이벤트를 수신하는 핸들러, 사용자 대신
Lambda 함수를 실행하기 위해 AWS Lambda가 맡을 수 있는 IAM 역할, 할당할 컴퓨팅 리소스, 실행 제한 시간
등의 정보가 포함됩니다.
계층을 사용하면 AWS Lambda 함수 개발자가 패키지, 바이너리, 런타임 및 Lambda 함수에 필요한 그 밖의 파일
을 함수 코드와 별개의 구성 요소로 유지할 수 있습니다.
Lambda 함수를 생성할 때 함수의 실행 환경에 포함될 하나 이상의 계층을 지정할 수 있습니다. 이렇게 하면 여
러 Lambda 함수에 분산된 동일한 파일의 사본을 유지할 필요가 없습니다. 예를 들어 Python으로 작성된 서버리
스 애플리케이션은 PyMySQL 같은 패키지를 사용하여 Amazon RDS MySQL 데이터베이스를 쿼리할 수 있습니다.
계층이 있는 경우 PyMySQL 패키지의 단일 사본만 유지하면 애플리케이션 내 모든 함수가 이를 사용할 수 있습
니다.
Lambda 계층 제한:

• 단일 함수는 한 번에 최대 5개의 계층을 가질 수 있습니다.
• 압축되지 않은 함수의 총 크기(계층 포함)는 압축되지 않은 배포 패키지 크기 제한인 250MB를
초과할 수 없습니다.

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

IAM - Roles - Create Role로 이동

해당 정책 선택

후 Lambda-S3-ExcutionRole 이름으로 역할 생성 완료

사용자 - 사용자 추가 로 이동


후 생성 한다.
생성 한후 .csv 파일은 별도로 저장한다.

s3로 이동 후

사진처럼 기존 버킷, 기존 버킷-resized 버킷 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)

Deploy (저장) 후 권한 으로 이동하여

그 후



기존 버킷과 연결한다.

그 후

밑줄 친 부분을 본인의 버켓 이름과 s3에 저장한 이미지 이름으로 수정한다.

그 후 EC2로 이동하여 리눅스 EC2 인스턴스를 생성한다. (보안그룹에서 22번 포트 위치무관으로 변경) 후 EC2 인스턴스에 연결한다.

연결 한 후
다음의 명령어들을 입력한다.

sudo yum update -y
sudo su
cd /home/ec2-user

sudo 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

wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tar.xz
tar -xJf Python-3.8.0.tar.xz
cd Python-3.8.0
./configure --enable-optimizations
make altinstall
export PATH=$PATH:/usr/local/bin
pip3.8 install pillow
pip3.8 install boto3
cd /usr/local/lib/python3.8/
mkdir –p'/home/ec2-user/lambda_layers/python/lib/python3.8/site-packages'
cp -r site-packages '/home/ec2-user/lambda_layers/python/lib/python3.8/'
cd site-packages
ls -la
cd /home/ec2-user/lambda_layers
zip -r lambda_layers.zip *
ls -la
aws configure
AWS Access Key ID [None] : AKIAWTD5YBH4JKDY2S45(본인키 입력.download받은 csv 파일에서 확인)
AWS Secret Access Key [None] : Prs1FdaVYOdUZbGbaVLLezmxIw0HRgDS0MKI8Z+9(본인키 입력)
Default region name [None] : ap-northeast-2
Default output format [None] :


aws s3 cp lambda_layers.zip s3://mybucket20210215 (본인 버킷 이름. S3버킷으로 파일 업로드 하는 것)
본인이 다운받은 CSV 파일에 본인 공개키, 비밀키 값이 있다. 그값을 입력하면 된다.

이렇게 될 경우 본인의 S3로 lambda_layers.zip이 저장된다.


해당 url을 복사하여

Lambda layer에 추가한다.

그 후

완료

이제

TEST 버튼을 누르면 -resized 버킷으로 resized된 버컷이 생성된다.

0개의 댓글