개요
AWS Lambda는 서버를 프로비저닝하거나 관리하지않아도 코드를 실행할 수 있도록 해주는 컴퓨팅 서비스.
AWS Lambda는 필요 시에만 코드를 실행하며, 하루 몇 개의 요청에서 초당 수천 개의 요청까지 자동으로 확장 가능합니다. 이를 통해 컴퓨팅 사용 시간에 대해서만 요금을 지불하면 되고 코드가 실행되지 않을 때는 요금이 부과되지 않습니다.
AWS Lambda는 사실상 모든 유형의 애플리케이션이나 백엔드 서비스에 대해 코드를 별도로 관리 없이 실행할 수 있습니다. Amazon Lambda는 기본적으로 Java, Go, PowerShell, Nodejs, C#, Python등의 언어를 사용하여 구현할 수 있습니다.
또한 각 리전에 있는 여러 가용 영역의 컴퓨팅 파워를 사용함으로써 개별 시스템이나 데이터 센터 시설의 장애가 발생하여도 서비스에 영향을 받지 않습니다. 별도의 OS를 관리하지 않아 보안 패치나 업데이트에 대한 관리가 필요하지 않으며 사용량 증가에 따른 Scale-Up이나 Scale-Out에 대한 조정 관리 걱정이 필요없습니다.
AWS Lambda의 서비스 동작 방식
1. 이벤트 소스로부터 함수 실행에 대한 트리거가 발생됩니다. 이러한 트리거는 S3 Bucket에 파일을 업로드하거나, 수정, 삭제 시 발생되도록 구성할 수 있습니다. 예를 들어 S3로 이미지를 업로드하면 업로드된 이미지가 대한 Thumbnail을 자동으로 처리하는 Lambda 함수를 실행하도록 구성하거나, DynamoDB의 특정 Field에 Insert나 업데이트 수행시 업데이트된 정보를 다른 RDB로 업데이트하는 Lambda 함수를 구현할 수 있습니다.
2. Lambda함수를 다양한 런타임과 라이브러리를 활용하여 개발할 수 있습니다. AWSLambda는 웹 기반의 전용 Editor에서 코드를 직접 개발하거나 함수 실행에 필요한 메모리 용량, 실행시간, 동시성구성, 환경변수 설정을 수행할 수 있습니다.
3. AWS의 다양한 리소스에 접근 가능토록 권함을 설정, Access 권한 및 실행 권함을 관리할 수 있습니다. AWS의 다양한 리소스에 접근 권한을 제어할 수 있도록 IAM Role을 구성할 수 있습니다.
4. AWS 서비스와 연결 및 연동을 통해 다양한 서비스를 개발하거나 구현할 수 있습니다. 이를 통해 다른 AWS Serverless 서비스를 바로 실행하거나, AI 기반의 다양한 인공지능 서비스 및 API를 제공하는 다양한 서비스를 통합하여 비즈니스에 필요한 활용 시나리오를 구현할 수 있습니다.
AWSLambda를 사용함으로써 다음과 같은 이점을 얻을 수 있습니다.
- 완전 관리형 서비스
- 기존 보유 코드 재활용
- 통합된 보안 모델
- 사용량 기반 지불
- 높은 내결함성
- 자동 규모 조정
AWS Lambda실습 - S3와 Lambda로 이미지 Thumbnail 생성 : IAM 역할 생성 및 S3 버킷 설정 후 Lambda로 소스코드 실행하기
단계 1. S3 버킷 생성 및 샘플 객체 업로드 // 콘솔메뉴 : 스토리지 - S3
다음 단계에 따라 S3 버킷을 생성하고 객체를 업로드합니다.
- Amazon S3 콘솔을 엽니다.
- 2개의 S3 버킷을 생성합니다. 대상 버킷의 이름을 source-resized로 지정해야 합니다. 여기서 source는 소스 버킷의 이름입니다. 예를 들어 소스 버킷은 mybucket이고 대상 버킷은 mybucket-resized입니다.
- 소스 버킷에서 .jpg 객체(예: HappyFace.jpg)를 업로드합니다.
- Lambda 함수를 테스트하기 전에 이 샘플 객체를 생성해야 합니다. Lambda invoke 명령을 사용하여 함수를 수동으로 테스트할 때, 소스 버킷 이름과 새로 생성된 객체로서 HappyFace.jpg를 지정하는 함수에 샘플 이벤트 데이터를 전달합니다.
단계 2. IAM 정책을 생성 // 콘솔메뉴 : 보안, 자격 증명 및 규정 준수 - IAM
Lambda 함수의 권한을 정의하는 IAM 정책을 생성합니다. 이 함수에는 다음을 수행할 권한이 있어야 합니다.
- 소스 S3 버킷에서 객체 가져오기.
- 크기가 조정된 객체를 대상 S3 버킷 저장.
- Amazon CloudWatch Logs에 로그를 씁니다.
IAM 정책을 생성
- IAM 콘솔에서 [정책(Policies)] 페이지를 엽니다.
- [Create policy]를 선택합니다.
- [역할 만들기] 페이지의 '이 역할을 사용할 서비스 선택' 항목에서 'Lambda' 선택 후 [다음]을 클릭합니다.
- '권한 정책 연결' 항목에서 정책 필터 검색창에 'Lambda'를 입력하고 'AWSLambdaBasic ExecutionRole'항목을 체크합니다.
- 동일 페이지에서 '정책 필터' 검색 창에 'S3' 입력 후 'AmazonS3 FullAccess' 항목에 체크하고 [다음]을 클릭합니다.
- '태그 추가' 항목의 [다음] 화면에서 '역할 이름'에 Lambda-S3-ExcutionRole' 입력하고 [역할 만들기] 버튼을 클릭합니다. 이렇게 Lambda-S3-ExcutionRole 역할을 생성하였습니다.
- 'IAM' 서비스에서 CLI를 위한 사용자 계정 생성을 위해 왼쪽메뉴에서 '사용자'클릭 후 [사용자 추가] 버튼을 클릭합니다. '사용자 이름' 항목에서 'S3_Access_User' 입력 후 하단 엑세스 유형에서 '프로그래밍 방식 엑세스' 항목을 체크하고 [다음] 버튼을 클릭합니다.
- [사용자 추가] 페이지에서 [기존정책직접연결] 버튼을 클릭합니다. '정책 필터' 검색창에 'S3'입력 후 'AmazonS3FullAccess'을 체크한 후 [다음]을 클릭합니다.
- [태그추가] 페이지에서 [다음] 버튼을 클릭 후 [검토] 페이지에서 [사용자 만들기] 버튼을 클릭합니다.
- [사용자 추가] 완료페이지에 AWS CLI에서 사용할 엑세스 키 ID/비밀엑세스 키에 대한 정보를 PC에 [CSV 다운로드] 버튼을 클릭합니다.
단계 3. 함수 코드 생성 // 콘솔메뉴 : 컴퓨팅 - Lambda
다음 코드 예제에서 Amazon S3 이벤트에는 소스 S3 버킷 이름과 객체 키 이름이 포함됩니다. 객체가 .jpg 또는 .png 이미지 파일인 경우 소스 버킷에서 이미지를 읽고 썸네일 이미지를 생성한 다음 대상 S3 버킷에 썸네일을 저장합니다.
다음을 참조하십시오.
- 이 코드는 대상 버킷이 존재하고 해당 이름이 소스 버킷 이름과 -resized가 이어진 형식이라고 가정합니다.
- 생성된 각 썸네일 파일에 대해 Lambda 함수 코드는 객체 키 이름을 resized-와 소스 객체 키 이름이 연결된 형식으로 파생합니다. 예를 들어 소스 객체 키 이름이 sample.jpg인 경우 코드는 키가 resized-sample.jpg인 썸네일 객체를 생성합니다.
- 메뉴중 [함수]를 들어갑니다. [함수 생성] 버튼을 클릭합니다.
- [함수생성] 페이지에서 [새로작성] 버튼을 클릭 후 '함수 이름'에 CreateS3Thumbnail'입력, 'Run Time'을 'Python3.x'로 선택하고 후 [함수 생성] 버튼을 클릭합니다.
- 다음 코드 예제를 lambda_function.py라는 파일에 복사합니다.
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)
- '구성'의 '실행 역할' 설정항목에서 '기존 역할 사용'을 선택하고 이전에 생성한 역할인 'Lambda-S3-ExcutionRole'을 선택합니다.
- Lambda Designer에서 [트리거 추가] 버튼을 클릭합니다.
- [트리거구성] 페이지에서 서비스로 'S3'를 선택하고 '버킷'은 이전에 생성한 버킷 중 첫번째로 생성한 버킷을 선택후 [Add] 버튼을 클릭합니다.
- 소스 코드를 [테스트] 버튼 클릭 후 '이벤트 템플릿'을 'Amazon S3 Put'으로 선택하고 이벤트 이름을 'S3PutTest'로 입력합니다. 테스트용 코드중 'example-bucket' 항목이 들어가는 2개의 항목을 이전에 생성한 버킷이름인 'mybucket0130'으로 수정하고, 'Object' 항목의 key에 대한 값을 '~~~.jpg'로 수정 후 [생성] 버튼을 클릭합니다.
※ 여기서 'No module named PIL....' 에러가 발생할수 있는데, 이는 Python3.x 라이브러리 생성 절차를 수행해야 합니다. 아래 링크를 참고하세요.(아래 작업을 간략히 설명하면 EC2인스턴스를 하나 만들어서 Python3.x 라이브러리를 컴파일해서 S3버킷에 올리는 작업입니다.
Python 모듈 S3에 업로드 하는 방법 https://www.python2.net/questions-228538.htm
python 3.x - 'lambda_function'모듈을 가져올 수 없습니다 - 'pandas'라는 모듈이 없습니다
START RequestId: 3d5691d9-ad79-4eed-a26c-5bc3f1a23a99 Version: $LATEST Unable to import module 'lambda_function': No module named 'pandas' END RequestId: 3d5691d9-ad79-4eed-a26c-5bc3f1a23a99 호스트 OS로 Windows 7 64 비트를 사용하고 있습니다.
www.python2.net
Python library EC2에 만들기 https://stackoverflow.com/questions/50734416/aws-lambda-unable-to-import-module-lambda-function-no-module-named-pil
'IaaS > 퍼블릭클라우드' 카테고리의 다른 글
(AWS) AWS의 CI/CD 툴 - CloudWatch (0) | 2021.06.06 |
---|---|
(AWS) AWS의 CI/CD 툴 - AWS Cloud9 (0) | 2021.06.06 |
(AWS) VPC with Cloudformation (0) | 2021.06.03 |
(AWS) AWS Cloudformation 템플릿 (0) | 2021.06.02 |
(AWS) IAM 이란? (0) | 2021.05.30 |