제일 중요한(뇌피셜) 개념을 다뤄보려 한다..

사실 내가 이걸 먼저 보려고 했었는데...😂


Warm Start / Cold Start

Lambda 동작 순서

lambda code 작성 & 배포 → Load Code as .zip → Download to container → Bootstrap code(compile, load code to container) → run code

https://velog.io/@milkcoke/Lambda-Cold-start

(Bootstrap: 특정 언어에 대해 컴파일하여 기록하는 것)

 

Warm Start

  • 이미 실행 준비가 완료된 상태

 

Cold Start

  • 배포 패키지의 크기와 코드 실행 시간 및 코드의 초기화 시간에 따라 새 실행 환경으로 호출을 라우팅할 때 지연 시간이 발생
  • 쉽게 얘기하면 잠시 절전 모드의 컴퓨터를 키는 느낌 이랄까...
  • 발생 원인
    • 인스턴스 자체가 떠있지 않은 상황:
      • 컨테이너를 실행시키기 위해선 인스턴스가 활성화되어 있어야하는데 요청과 요청 사이의 간격이 너무 크거나, 최초의 요청이여서 인스턴스가 내려가있을 수 있다.
    • ENI 적용 시간:
      • Lambda도 결국엔 서버이다. 통신을 위해선 ENI가 컨테이너에 붙어야 한다. 특히, VPC를 사용하는 Lambda의 경우 반드시 적용된다.
      • 예를 들면, DB와 연결할 때, DB는 내부 서버에게만 열어야하기 때문에..
      • 이를 해결하려면 VPC + ENI의 성능을 향상시켜야 한다!
    • Dwell Time:
      • lambda 구조에서도 봤듯이 요청이 들어오면 컨테이너로 바로 들어가는게 아니라 큐에 쌓이게 된다.
      • 큐에서 요청을 꺼내 컨테이너로 보내는 시간: Dwell Time
      • 이 시간은 언제 길어질까?
        • 한 계정에 동시에 띄울 수 있는 최대 컨테이너 수(Max Concurrent Executions)는 제한되어 있음
        • 요청이 엄청 들어왔다고 가정했을 때, 컨테이너가 어떻게 증가할까?
          • 아마 컨테이너가 하나씩 선형적으로 증가하는 그림은 아닐듯
        • 한 계정에는 하나의 서비스를 만들기 위해 여러 종류의 Lambda를 사용하게 된다. 각 Lambda에서 생성될 수 있는 컨테이너 수를 제한하는데(Reserved Concurrent Executions) 이 설정보다 많은 요청이 동시에 들어오면 Throttle 발생!

 

Cold Start 해결 방법

  • Lambda 메모리 늘리기:
    • 메모리를 올리면 인스턴스의 사양(cpu)이 올라가 처리 속도 자체가 빨라질 수 있다고 한다.
    • but, 비용 고민: (메모리별 가격) * (요청이 처리되는 시간) * (요청 수)
    • 메모리가 올라가 요청이 처리되는 시간이 줄어들 수도 있고 그냥 메모리만 올라가면 음... 계산기 잘 두드려라
  • lambda 컨테이너 재사용:
    • 한번 호출되고, 다음 호출이 5분 이내인 경우 그 후속 호출에 컨테이너 재사용
    • 자체적인 Warm Start 구성이라고 생각해도 될듯?
    • 여기서 꼼수를 쓰자.. 요청 없어도 5분마다 강제 실행을 시키는 것!
      • CW 활용, Route 53 HealthCheck를 람다 API Gateway Endpoint 설정 등...
      • but, 쓸데 없는 지출이 증가됨
    • 시간이 오래 걸리는 코드는 global로 선언하는 게 좋다
      • 재사용할 때 돌아가지 않도록!
      • 예를들면 db_connection과 같은 작업?
더보기

warm-cold-start-test func

let isWarmStart = false;

exports.handler = async () => {
  let message;
 
  if (isWarmStart) {
    message = "warm start";
  } else {
    message = "cold start";
    isWarmStart = true;
  }
 
  return {
    statusCode: 200,
    body: JSON.stringify({ message }),
  };
};

그냥 아주 단순한 코드.. global로 isWarmStart 변수 선언하고 handler 실행되면 true로 값 바꿈.

처음에 실행한 결과값

그 이후 두번째 실행한 결과값

 

일정 시간 뒤에 다시 실행해보면 cold start를 다시 출력할 것이다..

 

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

[AWS] Serverless Service - Lambda 편 (1)  (0) 2022.11.05
[AWS] API Gateway - Websocket API  (0) 2022.11.01
[AWS] Fan-Out 시나리오 -1(easy)  (0) 2022.10.11
[AWS] Event-Driven Architecture  (0) 2022.10.11
[AWS] Lambda Layer  (0) 2022.10.07
SNS topic에 게시된 메시지가 복제되어
Kinesis Data Firehose 전송 스트림, SQS 대기열, HTTP(S) 엔드포인트 및 Lambda 함수와 같은 여러 엔드포인트로 푸시되는 경우

https://docs.aws.amazon.com/ko_kr/sns/latest/dg/sns-common-scenarios.html

 

이 중에서 나는 SNS - SQS 팬아웃 구조를 실습할 것이다!


(상황 설정: 온라인 상점에 주문이 접수될 때마다 주제에 대한 SNS 메시지를 전송하는 클라우드 네이티브 앱 개발 중

→ 해당 주제를 구독하는 SQS 대기열은 새 주문에 대해 각각 동일한 알림을 수신할 것)

 

  • SNS Topic 생성

 

  • SQS 대기열 생성

각각 이름이 Orders-for-Inventory / Orders-for-Analytics 인 Queue 생성

 

  • 대기열에서 주제 구독

 

  • 주제에 메시지 게시

 

  • 구독 확인

각 각 대기열 들어가서 폴링 하기

 

❗ 진짜 간단하게 SNS + SQS 구조를 나타낸 것... ❗

 

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

[AWS] API Gateway - Websocket API  (0) 2022.11.01
[AWS] Lambda Warm Start / Cold Start  (0) 2022.10.28
[AWS] Event-Driven Architecture  (0) 2022.10.11
[AWS] Lambda Layer  (0) 2022.10.07
[AWS] Amazon Rekognition 개념  (1) 2022.10.05
이벤트를 사용하여 분리된 서비스를 서로 트리거하고 통신하며
마이크로 서비스로 구축된 현대적 애플리케이션에서는 일반적


이벤트: 상태의 변화 또는 업데이트, 식별자

(이벤트 생산자 → 이벤트 라우터 → 이벤트 소비자)

 

사용 사례

  • 계정 간, 리전 간 데이터 복제
    • 이벤트 라우터를 사용하여 시스템 간에 데이터를 전송하면 다른 팀과 독립적으로 서비스를 개발하고 크기 조정하고 배포 가능
  • 리소스 상태 모니터링 및 알림
  • 팬아웃 및 병렬 처리
    • 이벤트에 반응하여 작동해야 하는 시스템이 많은 경우
    • 라우터가 이벤트를 시스템에 푸시하면, 각 시스템이 각각 다른 목적으로 이벤트를 병렬로 처리 가능
  • 이기종 시스템의 통합
    • 시스템이 서로 다른 스택에서 실행 중인 경우 결합하지 않은 상태로 시스템 간 정보 공유 가능

 

고려 사항

  • 이벤트 소스의 내구성. (이벤트 소스를 신뢰할 수 있어야 하며 전송이 보장되어야 함)
  • 성능 제어 요구 사항. (애플리케이션이 이벤트 라우터의 비동기 특성을 처리할 수 있어야 함)
  • 이벤트 흐름 추적. (모니터링 서비스를 통한 동적 추적은 가능, 코드 분석을 통한 정적 추적은 불가능)
  • 이벤트 소스의 데이터. (상태를 다시 빌드해야할 경우 이벤트 소스가 중복 제거되고 순서가 지정되어야 함)

 

여기까지가 간단한 아키텍처 관련 내용 이였고.. 이벤트 라우터 역할의 서비스를 알아보자.

간단하게 알아보고 자세한 내용은 나중에 콘솔 뜯을 때 확인하자...😅


Amazon EventBridge

  • AWS, 기존 시스템 또는 SaaS 애플리케이션에서 대규모 이벤트 기반 애플리케이션 구축
  • 이벤트 수신, 필터링, 변환, 라우팅 및 전송 기능을 제공하는 serverless event bus
  • 스키마
    • 전송되는 이벤트의 구조를 정의
    • 사용자 정의 스키마 생성 또는 업로드 / 이벤트 버스 이벤트에서 직접 스키마 유추
    • API를 사용해 IDE에서 직접 스키마에 대한 코드 바인딩으로 작업 및 관리 가능
  • 이벤트 버스
    • 이벤트를 수신하는 파이프라인
    • 규칙을 특정 이벤트 버스와 연결(해당 이벤트 버스에서 수신한 이벤트에만 규칙이 적용됨)
      • 각 이벤트 버스에 대해 최대 300개의 규칙
    • Default event bus: AWS 서비스에서 이벤트 수신
    • Custom event bus: 다른 계정/리전으로 이벤트를 보내거나 이벤트 수신
    • Partner event bus: SaaS 파트너로부터 이벤트 수신
  • 규칙
    • 들어오는 이벤트를 일치시키고 처리를 위해 대상으로 보냄
    • 이벤트 패턴(이벤트 구조와 규칙이 일치하는 필드 정의) / 일정(일정한 간격으로 작업 수행) 기반
    • 규칙에 대해 최대 5개의 대상 정의 가능
  • 이벤트 아카이브 및 리플레이
    • 아카이브 생성 시 이벤트 패턴을 지정하여 아카이브로 보낼 이벤트 결정 
    • 이벤트를 리플레이하여 오류를 복구, 애플리케이션의 새 기능을 검증 가능
    • 이벤트 버스에 게시되는 이벤트와 아카이브에 도착하는 이벤트 사이에 지연 있을 수 있음
      • 모든 이벤트가 리플레이 되도록 이벤트 리플레이를 10분 동안 지연하는 것이 좋음
  • 기능

Amazon Simple Notification Service (SNS)

  • 애플리케이션 간(A2A) 및 애플리케이션과 사용자 간(A2P) 통신 모두를 위한 완전 관리형 메시징 서비스
  • SNS topic을 사용하여 게시자 시스템은 병렬 처리를 위해 SQS, Lambda 등 많은 구독자 시스템으로 메시지를 팬아웃
    • Pub/Sub 말고도 SMS, 모바일 푸시 가능
  • 팬아웃 시나리오가 메인인 느낌.. 이는 실습과 함께 다뤄볼 예정!😁

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

[AWS] Lambda Warm Start / Cold Start  (0) 2022.10.28
[AWS] Fan-Out 시나리오 -1(easy)  (0) 2022.10.11
[AWS] Lambda Layer  (0) 2022.10.07
[AWS] Amazon Rekognition 개념  (1) 2022.10.05
[AWS] Amazon Rekognition 실습  (0) 2022.10.04

Rekognition 실습을 하다가 python의 matplotlib 라이브러리를 사용할 코드를 돌리는데 자꾸 모듈을 찾을 수 없다는 에러가 떴다.. 이를 해결할 방법을 찾았다! 먼저 해결했던 방법부터 적어보려 한다.

참고: https://awstip.com/how-to-use-your-favorite-python-packages-in-aws-lambda-1a514c7096f1


  • python matplotlib 모듈 다운로드

파일 경로 주의...❗

matplotlib/python/해당 모듈들...

pip install matplotlib -t {파일 경로}

 

  • Layer(계층) 생성

위에서 생성했던 zip파일을 올려주자.

(런타임 유의! 선택한 런타임에서만 계층이 적용된다.)

 

  • Lambda function에 Layer 추가

사용자 지정계층으로 Layer 추가하면 된다.

(버전도 설정이 가능하니 모듈 업데이트를 원하면 버전을 업그레이드 하면 될듯)

 

 

❗ 추가적으로.. 문제가 있는 것 같다.. ❗

pip uninstall numpy 후 pip isntall numpy를 해도 계속 오류가 생긴다.

계속 같은 버전으로 설치가 되고 있는데 이를 어떻게 해결해야하나?

NOPE! 컴파일 된 바이너리들은 Amazon Linux와 호환되어야 한다.(OS 호환의 문제)

(numpy의 경우 C코드가 있기 때문)

 

  • Amazon Linux 환경에서 python 패키지들을 설치

아마 cloud9에서 패키지 받아서 진행하면 가능할듭..

아래의 명령어들은 기본적으로 cloud9은 python3.7 버전이라.. 버전 업그레이드를 원하면 실행

yum install -y gcc openssl-devel bzip2-devel libffi-devel
yum install -y wget

cd /usr/local/src
wget {원하는 버전 python download에서 가져오기}
tar xf {해당 파일}

cd {압축 푼 폴더}
./configure --enable-optimizations
make altinstall

python{해당 버전} --version
python{해당 버전} -m pip install --upgrade pip

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

[AWS] Fan-Out 시나리오 -1(easy)  (0) 2022.10.11
[AWS] Event-Driven Architecture  (0) 2022.10.11
[AWS] Amazon Rekognition 개념  (1) 2022.10.05
[AWS] Amazon Rekognition 실습  (0) 2022.10.04
[AWS] EC2로 MQTT 통신 테스트  (0) 2022.09.27

대학교 시절 프로젝트 성으로 잠깐 약간 맛만 봤었는데 이번 게임데이 준비하면서 좀 더 깊게 파볼 생각...

딥 러닝 기반 시각 분석 서비스 인데.. 신기하다 신기해! 약간 YOLO랑 비슷한 느낌?

 

참고: https://aws.amazon.com/ko/blogs/machine-learning/build-your-own-face-recognition-service-using-amazon-rekognition


  • Indexing(blue flow): 나중에 분석하기 위해 얼굴 이미지를 컬렉션으로 가져오는 프로세스
  • Analysis(black flow): 인덱스 내에서 일치하는 얼굴 컬렉션 쿼리하는 프로세스

  • CloudFormation 실행(한번에 다 설치해줌...)

템플릿 다운

위의 이미지는 스택 생성 후 생성된 리소스들이다. 과정 하나씩 살펴보자.

  • rekognition create-collection
aws rekognition create-collection --collection-id family-collection

위의 명령어를 AWS CLI에 입력해 collection을 생성하는 과정을 거친다.

 

  • DynamoDB create-table

RekognitionId 를 파티션 키로 family-collection 테이블을 생성했다.

 

  • IndexFaces 작업

S3 버킷 생성

 

IAM 역할 설정

1) S3 객체에 액세스할 수 있는 권한을 lambda에 부여

2) Rekognition의 IndexFaces 함수를 시작하고 FaceId 간의 매핑을 위해 DynamoDB key-value 저장소 내에 여러 항목 생성  가능

더보기
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::training-bucket-221004/*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "rekognition:IndexFaces"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "dynamodb:PutItem"
            ],
            "Resource": "arn:aws:dynamodb:<Region>:<ACCOUNT-ID>:table/family-collection",
            "Effect": "Allow"
        }
    ]
}

해당 IAM 역할을 Lambda 함수에 붙여주자.

 

마지막으로 새 사진이 S3에 업로드될 때마다 트리거되는 Lambda 함수 생성(트리거 추가)

 

해당 lambda 함수에 코드 넣어주기.

1) Rekognition IndexFaces API를 사용하여 입력 이미지에서 얼굴을 감지하고 지정된 컬렉션에 추가

2) 성공하면 S3에 있는 객체의 메타데이터에서 사람의 전체 이름을 검색, 그런 다음 나중에 참조할 수 있도록 DynamoDB 테이블에 FaceId가 있는 key-value 튜플로 저장

더보기
import os
import boto3
from decimal import Decimal
import json
import urllib

print('Loading function')

dynamodb = boto3.client('dynamodb')
s3 = boto3.client('s3')
rekognition = boto3.client('rekognition')


# --------------- Helper Functions ------------------

def index_faces(bucket, key):
    CollectionId = os.getenv("CollectionName")

    response = rekognition.index_faces(
        Image={"S3Object": {"Bucket": bucket, "Name": key}},
        CollectionId=CollectionId,
    )
    return response


def update_index(tableName,faceId, fullName):
    response = dynamodb.put_item(
        TableName=tableName,
        Item={
        'RekognitionId': {'S': faceId},
        'FullName': {'S': fullName}
        }
    )

# --------------- Main handler ------------------

def lambda_handler(event, context):

    # Get the object from the event
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
              

    try:
        # Calls Amazon Rekognition IndexFaces API to detect faces in S3 object
        # to index faces into specified collection
        response = index_faces(bucket, key)

        # Commit faceId and full name object metadata to DynamoDB
        if response['ResponseMetadata']['HTTPStatusCode'] == 200:
            faceId = response['FaceRecords'][0]['Face']['FaceId']

            ret = s3.head_object(Bucket=bucket,Key=key)
            personFullName = ret['Metadata']['fullname']

            update_index(os.getenv("DynamoDBTableName"), faceId, personFullName)

        # Print response to console.
        print(response)

        return response
    except Exception as e:
        print(e)
        print("Error processing {} from bucket {}. ".format(key, bucket)) 
        raise e

 

이후에 이미지를 S3에 업로드한 뒤에 해당 코드를 통해 Face collection을 시드할 수 있다.

(현재는 S3 버킷에 이미지가 없음....;; 따라서 코드 실행에 에러 나는게 당연하다..?)

 

해당 컬렉션이 잘 만들어졌는지 확인하기 위해선

aws rekognition list-faces --collection-id family-collection

 

위의 명령어를 사용하면 된다.

 

  • 분석 작업

컬렉션이 채워지면 얼굴이 포함된 다른 이미지를 전달하여 쿼리가 가능하다.

SearchFacesByImageAPI를 사용하여 쿼리할 컬렉션 이름과 분석할 이미지에 대한 참조 두 가지 이상의 매개변수 제공

아래의 코드는 이미지를 bytestream으로 제출하는 방법을 보여준다.

(응답의 경우 일치 항목의 FaceId가 포함된 JSON 객체를 반환, (메타데이터 중 신뢰도 점수, 이미지 내 얼굴의 좌표))

더보기
import boto3
import io
from PIL import Image

rekognition = boto3.client('rekognition', region_name='eu-west-1')
dynamodb = boto3.client('dynamodb', region_name='eu-west-1')
    
image = Image.open("group1.jpeg")
stream = io.BytesIO()
image.save(stream,format="JPEG")
image_binary = stream.getvalue()


response = rekognition.search_faces_by_image(
        CollectionId='family_collection',
        Image={'Bytes':image_binary}                                       
        )
    
for match in response['FaceMatches']:
    print (match['Face']['FaceId'],match['Face']['Confidence'])
        
    face = dynamodb.get_item(
        TableName='family_collection',  
        Key={'RekognitionId': {'S': match['Face']['FaceId']}}
        )
    
    if 'Item' in face:
        print (face['Item']['FullName']['S'])
    else:
        print ('no match found in person lookup')

 

 

❗ 우씨 뭐가뭔지 모르겠다... Rekognition 구조부터 파악하고 해봐야할듯?! ❗

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

[AWS] Lambda Layer  (0) 2022.10.07
[AWS] Amazon Rekognition 개념  (1) 2022.10.05
[AWS] EC2로 MQTT 통신 테스트  (0) 2022.09.27
[AWS] Amazon Kinesis 개념  (0) 2022.09.26
[AWS] IoT Core 살펴보기 -4(데이터 레이크)  (0) 2022.09.26

+ Recent posts