AWS의 디커플링 서비스

wjdghks95·2024년 8월 13일
post-thumbnail

AWS의 디커플링 서비스 서론

디커플링

  • 아키텍처에서 주체간의 의존성을 낮추는 방법
  • 아키텍처의 유연성을 높이고 효율적으로 최적화

AWS의 디커플링 서비스

  • AWS에서 아키텍처의 유연성을 확보하기 위해 사용하는 서비스들
    • Amazon SQS
    • Amazon SNS
    • Amazon Kinesis
    • Amazon MQ
    • Amazon MSK (Kafka)
    • 기타 다양한 이벤트 기반 기능들
      • 예: S3 Event, EventBridge, DynamoDB Stream 등

Amazon SQS 소개

Amazon SQS

  • AWS에서 제공하는 큐 서비스
    • 하나의 메시지를 한번만 처리를 목표
  • 주요 사용 사례
    • 하나의 서비스에서 다른 서비스로 데이터를 전달하고 싶을 때
    • 아키텍처에서 AWS 서비스들의 느슨한 연결을 수립할 때
    • 메시지의 처리 순서 및 처리 여부를 보장하고 싶을 때
  • 사용 방식
    • 메시지를 받아 임시로 저장 (최대 14일), 이후 요청할 때 메시지를 들어온 순서대로 전달
    • 전달 받은 서비스가 메시지를 처리 후 처리 완료 요청을 받으면 삭제
    • 오류 등으로 처리 못하면 메시지 반환
    • 메시지는 여러 주체가 요청하더라도 한번만 전달되도록 처리
  • Public 서비스
    • 즉, AWS 외부에서 인터넷을 통해 사용 가능
  • Serverless 서비스로 분류
    • 고가용성이 자체적으로 확보되어 있음
    • 별도로 인프라 관리 불필요
  • 요청 횟수, 메시지 크기 등으로 과금

※ Queue

  • 선입선출(First In First Out) 형태의 대기열. 즉, 먼저 들어온 데이터를 먼저 처리
  • 아키텍처에서는 주로 서비스에서 다른 서비스로 데이터를 전달할 때 활용
    • 1:1 뿐만 아니라 1:N 관계에서도 활용 가능 (처리 자체는 한번)

Amazon SQS 기초

Amazon SQS의 주요 구성 요소

  • 메세지: SQS에서 전달하는 데이터의 단위
  • Producer: 메세지를 생산하고 SQS에 전달하는 주체
  • Queue: 메시지를 저장하고 메시지를 Consumer에게 전달하는 다양한 기능을 담당
  • Consumer: 메시지를 받아 처리하고 소비(삭제)하는 주체
  • Dead Letter Queue: 처리에 실패한 메시지를 모아둔 2차 Queue
  • 액세스 정책: SQS에 접근할 수 있는 주체에 대한 권한 설정 정책

Amazon SQS Queue의 타입

Standard

  • Standard SQS는 순서를 보장하지 않음
  • Standard SQS는 메시지를 여러번 전달할 가능성 존재: At Least Once Delivery

FIFO

  • 순서 보장 및 메시지를 단 한번만 전달하도록 보장하나 성능의 제약
  • Exactly Once Delivery
  • 즉, Standard 모드를 사용할 때는 멱등성(Idempotency) 확보 필요

* 멱등성(Idempotency): 로직이 여러 번 수행되더라도 동일한 결과를 보장할 수 있는 성질
예) 한 자리에 대한 기차표가 한 대상에게 여러 번 구매되더라도 요금이 여러 번 결제되지 않는 것

Amazon SQS 메시지

Amazon SQS 메시지

  • SQS에서 전달하는 데이터의 단위
  • 최대 사이즈: 256kb, 최대 14일까지 저장 가능
  • SQS의 메시지는 총 세 가지 상태
    • Stored: Producer가 메시지를 SQS Queue에 전달을 완료하여 대기중인 상태
      • 최대 갯수 제한 없음
    • In Flight: Consumer가 메시지를 가져와서 처리중인 상태
      • Standard 약 120,000개, FIFO 약 20,000개
    • Deleted: Consumer가 메시지 내용을 처리 후 삭제한 상태

Amazon SQS 메시지 구성

  • Message Body: 실제 메시지의 내용(String)
    • 최대 256Kib(Message Attribute 포함)
    • 크기가 큰 컨텐츠의 경우 S3에 저장 후 버킷/키 정보만을 저장하는 형식으로 전달 가능
  • Message Attribute: Key-Value 형식의 메타데이터로 Body에 포함되지 않는 추가적인 데이터
    • 주로 분류, 필터링, Body를 처리하기 위한 Context 등에 활용
      • 예: Attribute에 영상 처리 알고리즘 명시, 분류를 위한 Tag 정의 등
    • 최대 10개
  • Message System Attribute: AWS 서비스에서 활용하기 위한 Metadata
    • 현재는 AWS X-ray를 위한 AWSTraceHeader만 지원
  • Receipt Handle: 메시지를 삭제하기 위한 키
  • 기타 정보
    • Region, Event Source, MD5, Timestamp, 해시 등
  • FIFO의 경우 Message Group ID, Deduplication ID

Amazon SQS의 특징 및 기능

Producer

  • 메시지는 API를 사용해서 Push 가능
    • 이 때 Queue URL을 알고 있어야 정확한 SQS Queue를 판별하여 메시지 전송 가능
  • Queue URL 형식
    • https://sqs.<region>.amazonaws.com/<account-id>/<queue-name>
  • IAM 엔티티로서 권한이 있거나 리소스 기반 정책으로 권한 확보 필요 (sqs:SendMessage)
  • 다양한 AWS의 서비스에 이벤트로 연동

Consumer

  • 권한이 있는 상태에서 주기적으로 API로 Queue에 메시지를 요청(Poll)해서 처리
    • 역시 메시지 받아오고 삭제하는 권한 필요 (sqs:ReceiveMessage/sqs:DeleteMessage)
  • 기본적인 workflow: poll -> 처리 -> 삭제
  • Visibility Timeout 안에 메시지를 받아 처리하고 완료 시 삭제
    • 삭제하지 않으면 다시 Queue Visibility Timeout 이후 Queue로 반환
    • 혹은 Visibility Timeout을 늘려서 추가 시간을 확보 후 처리
  • 두 가지 Polling 방법
    • Short Polling
    • Long Polling

Visibility Timeout

  • 메시지의 요청 이후 다른 주체가 메시지를 요청할 수 없는 기간
    • 일종의 Lock
    • 해당 기간 동안에 다른 주체가 메시지 요청 불가능
  • 기본 30초, 최소 0초, 최대 12시간
  • Visibility Timeout 기간을 넘어서는 처리(삭제) 되지 않은 메시지는 자동으로 다른 주체에게 열림(요청가능)
    • 메시지를 처리하기 충분한 시간이지만 오류/에러 상황에 적절하게 대응할 수 있는 시간 필요
  • 기본적으로 Queue 단위이나 메시지 단위로 설정 가능. 즉, 필요하다면 Visibility Timeout 수정 가능
    - 주의: Visibility Timeout이 만료된다면 Queue 맨 뒤로 돌아감

Polling 방법

  • Short Polling (기본): 메세지 요청 시 Queue의 일부를 검색해서 가능한 메시지를 빠르게 찾아서 전달
    • 메시지를 못 찾아도 응답을 바로 전달
  • Long Polling: 메시지 요청 시 Queue 전체를 검색하여 적어도 하나의 메시지를 찾아서 전달
    • 메시지가 없다면 찾을 때까지 기다리거나, 혹은 Timeout을 넘는다면 그때 응답 전달
    • 1~20초까지 대기시간 설정 가능
    • 장점
      • False Empty Response 방지
      • 요청 횟수 줄이기
  • Batch 처리 가능: 한번에 최대 10개의 메시지 요청 가능

SQS 보안

  • Access Policy: 어떤 주체가 SQS Queue에 접근하여 메시지를 보내거나 가져올 수 있는 리소스 기반 정책
    • 주체에게 권한이 없더라도 권한 부여 가능
    • 예: IAM 사용자에 아무 권한이 없더라도 Access 정책에 권한이 명시되어 있으면 Queue 사용 가능
  • 암호화
    • SQS-SSE(Encryption at rest), SQS-KMS 지원 (S3와 거의 동일)
    • Body만 암호화(Metadata, Timestamp 등은 암호화 처리하지 않음)

Dead Letter Queue

  • 시스템 오류로 처리할 수 없는 메시지를 임시로 저장하는 특수한 유형의 메시지 대기열
    • SQS에서 처리하지 못한 메시지를 담아두어 처리하는 다른 Queue
    • 추후 재처리 가능(Redrive)
  • 설정한 재시도 횟수보다 많이 실패했을 경우 DLQ로 전달

Monitoring

  • 기본적으로 CloudTrail로 API 로깅 가능
  • CloudWatch 기본 지표로 다양한 Metric 제공
  • 주요 메트릭
    • ApproximateAgeOfOldestMessage: (근사값) 가장 오래된 메세지의 나이
    • ApproximateNumberOfMessagesNotVisible: (근사값) 현재 In-Flight 중인 메시지
    • ApproximateNumberOfMessagesVisible: (근사값) 현재 Stored. 즉, 대기중인 메세지
    • NumberOfEmptyReceives: 메세지 요청 시 빈 응답이 전달 된 횟수
    • NumberOfMessagesReceived: 메세지 요청에 따라 전달된 메세지 갯수
    • NumberOfMessagesSent: Queue에 도착한 메세지 갯수
    • SentMessageSize: Queue에 도착한 메세지의 크기

실습 - Amazon SQS 이미지 리사이징

  1. S3에 생성(소스코드/이미지 업로드)
  2. 시작 템플릿 및 AutoScaling 그룹 생성
    a. 시작 템플릿에 적용할 IAM 역할 생성

    b. userdata 적용
    #!/bin/bash
    curl --silent --location https://rpm.nodesource.com/setup_20.x | bash -
    dnf -y install nodejs
    cd /home/ec2-user
    aws s3 cp s3://demo-image-resize-sqs-342849269408/demo-sqs-ec2-image-resize.zip /home/ec2-user --region ap-northeast-2 unzip demo-sqs-ec2-image-resize.zip
    npm install
    npm install forever -g
    forever stop src/server.js
    forever start -o out.log -e err.log src/server.js
    c. AutoScling 그룹 생성
    d. 유저데이터로 S3에서 소스코드 받아오고 빌드 후 애플리케이션 시작
  3. SQS 생성 및 S3와 연동
    a. SQS 대기열 생성

    b. 표시 제한 시간(Visibility Timeout) 설정

    c. 액세스 정책 설정 (S3에서 SQS로 보내기 위한 정책)

    d. 이벤트 알림 생성
  4. EC2가 시작되면서 애플리케이션에서 메시지 폴링 및 이미지 리사이징 시작 및 확인

Amazon SNS 소개

Amazon Simple Notification Servicve(Amazon SNS)는 애플리케이션 간 (A2A) 및 애플리케이션과 사용자 간(A2P) 통신 모두를 위한 완전관리형 메시징 서비스입니다.

Amazon SNS

  • Pub/Sub 기반의 메시징 서비스
    • 하나의 메시지를 여러 서비스에서 처리
  • 주요 사용 사례
    • 하나의 메시지를 다수의 주체에서 처리하고 싶을 때(Fan Out)
    • 서비스에서 서비스로 메시지를 전달하고 싶을 때
    • 메시지를 임시로 저장하고 있거나 재생하여 동일한 로직을 다시 처리하고 싶을 때(FIFO)
  • 사용 방식
    • 하나의 토픽을 여러 주체가 구독
    • 토픽에 전달된 내용을 구독한 모든 주체가 전달받아 처리 -> 하나의 메시지를 여러 주체에서 처리
    • 다양한 프로토콜 및 서비스 지원(이메일, HTTP(S), SQS, SMS, Lambda)
    • 메시지 리플레이 기능 제공(FIFO)
  • Public 서비스
    • 즉, AWS 외부에서 인터넷을 통해 사용 가능
  • Serverless 서비스로 분류
    • 고가용성이 자체적으로 확보되어 있음
  • 요청 횟수, 메시지 크기 등으로 과금

※ SNS vs SQS

Amazon SNS 기초

Amazon SNS의 주요 구성 요소

  • 토픽(Topic): SNS의 커뮤니케이션 채널
  • 구독(Subscription): 토픽으로 들어온 메시지를 받아볼 수 있는 리소스
  • Publisher: 메시지를 생산하고 SNS에 전달하는 주체
  • Subscriber: 실제 구독으로부터 메시지를 받아서 처리하는 주체
  • 메시지: SNS에서 전달하는 데이터
  • 액세스 정책: SNS에 접근할 수 있는 주체에 대한 권한 설정 정책

Amazon SNS Topic / Subscription

  • 토픽(Topic): SNS의 커뮤니케이션 채널
    • 해당 토픽에 메시지를 발행(publish)하면 토픽을 구독(Subscribe)한 모든 대상에게 메시지를 발송
    • 즉, 하나의 메시지를 다수의 대상이 처리(=Fan Out)
  • 구독 프로토콜
    • 이메일
    • HTTP(S)
    • SQS
    • SMS
    • Lambda
    • Kinesis Data Firehose
  • 최초 구독시 확인 필요(예: 확인 이메일, Lambda의 경우 확인 이벤트)

Amazon SNS 메시지

Amazon SNS 메시지 구성(Standard)

  • Message Body: 실제 메시지의 내용(String)
    • 제목/내용
    • 최대 256Kib(Message Attribute 포함)
    • 크기가 큰 컨텐츠의 경우 S3에 저장 후 버킷/키 정보만을 저장하는 형식으로 전달 가능
    • Raw Message Delivery: SNS 메시지 포맷을 따르지 않고 전달받은 메시지를 그대로 전달
      - 주로 S3 로깅, SQS 등 메시지를 파싱하지 않고 있는 그대로 처리해야 할 경우 활용
  • Message Attribute: Key-Value 형식의 메타데이터로 Body에 포함되지 않는 추가적인 데이터
    • 주로 분류, 필터링, Body를 처리하기 위한 Context 등에 활용
      • 예: Attribute에 영상 처리 알고리즘 명시, 분류를 위한 Tag 정의 등
    • Raw Message Delivery 활성화 시 최대 10개
  • TTL (모바일 전용)
  • 기타
    • Timestamp, 토픽 ARN, 시그니처, 구독 해제를 위한 URL 등

Amazon SNS 메시지 필터링

  • 메시지 필터링을 통해 모든 메시지 대신 특정 메시지만 수신 가능
  • 각 Subscription Filter Policy 설정
    • Filter Policy: 메세지의 Body 혹은 Attributes 단위로 원하는 메시지를 매칭
    • 매칭 시 메시지 발송 / 불일치 시 메시지를 전달하지 않음
  • 필터링 가능 대상: Message Body, Message Attributes
    • 예: 구매 타입='Express' AND (구매 나라가 미국 OR 유럽) AND 가격이 20불 이상

Amazon SNS 기타 기능

Amazon SNS 보안

  • Access Policy: 어떤 주체가 SNS에 접근하여 메시지를 보내거나 구독할 수 있는 리소스 기반 정책
    • 주체에게 권한이 없더라도 권한 부여 가능
    • 예: IAM 사용자에 아무 권한이 없더라도 Access 정책에 권한이 명시되어 있으면 SNS로 퍼블리시 가능
  • 암호화
    • KMS를 활용하여 Server Side Encryption 구현
    • Body만 암호화(Metadata, Timestamp 등은 암호화 처리하지 않음)

Monitoring

  • 기본적으로 CloudTrail로 API 로깅
  • CloudWatch 기본 지표로 다양한 Metric 제공
  • 주요 메트릭
    • NumberOfMessagesPublished: 발행된 메시지 숫자
    • NumberOfNotificationsDeliverd: 구독대상에게 전달된 메세지 숫자
    • PublishSize: 도착한 메시지의 크기

기타 기능

  • Amazon SNS Data Protection: SNS의 메시지중 민감한 정보를 감지하거나 검열해주는 서비스
    • Data Protection policy를 기반으로 필터링
    • Inbound Message / Outbound Message 모두 확인
  • 메시지 순서 보장 및 중복 제거(FIFO)
  • 메시지 보관 및 리플레이 기능(FIFO)

※ SNS 주제 및 구독 생성

Amazon SNS로 SMS 보내기

※ Amazon SNS에서 SMS를 보내기 위해서 고려할 점

  • 특정 리전에서만 문자 메시지 보내기 가능
    • 서울 리전을 사용 불가능
  • Spending Threshold: SNS, SMS 최초 사용 시 설정되어 있는 지출 비용 제한
    • 기본 $1, 늘리려면 Support Case 오픈 필요
  • Origination Identitied 필요: 나라마다 정책이 다르고 필수 여부 역시 다름
    • Sender ID: 메세지를 보낸 대상으로 표시되는 ID
      • 예: US 리전은 Sender ID 사용 불가능 / India 리전에서는 필수
      • 몇몇 나라에서는 Sender ID가 필수이며 몇 주의 기간이 소요되는 경우 발생
      • Support Case 등의 지원 필요
    • Origination Numbers: 받은 사람에게 보이는 전달자 번호

Amazon SNS SMS Sandbox

  • 최초로 제공되는 환경으로 테스트 및 준비를 진행
  • Sandbox에 있을 때는 지정한 번호로만 문자 메시지 가능
    • 최대 10개
    • 삭제는 24+ 시간 이후 번호 삭제 가능
  • Sandbox 탈출
    • 전화번호 인증
    • 테스트 문자 확인
    • Support Case에 연결
      • 목적 / 사용계획 / 리전 / 쿼타

SMS 메시지 종류

  • One Time Password: OTP 용도
  • Promotional: 홍보 용도
  • Transactional: 어카운트 상태 알람, 배송 상태 확인
    • 마케팅 내용 포함 불가능

Amazon SQS/SNS FIFO

SQS FIFO(First In First Out)

  • 기본적으로 SQS는 순서를 보장하지 않음
  • 기본적으로 SQS는 메시지를 여러 번 전달할 가능성 존재
  • FIFO 모드: 메시지의 순서를 보장하며 단 한번만 전달
  • 이외에 몇 가지 기능 추가
  • 단, 성능 저하 존재
    • High Throughput 모드로 어느정도 완화 가능
      • 리전별로 조금씩 최대 상한치가 다름
  • 이름에 .fifo 필수
    • 예: my-demo-queue.fifo

SQS FIFO - Deduplication ID

  • Deduplication ID: SQS에서 각 메시지의 중복 여부를 판단하기 위한 고유 토큰
  • 메시지를 SQS에 전달할 때 부여할 수 있으며 한번 특정 Deduplication ID를 가진 메시지가 처리된 경우 다음 5분동안 같은 Deduplication ID를 가진 메시지는 무시
    • 성공은 정상적으로 반환, 메시지만 무시
    • 메시지가 전달된 이후에도 계속 레코드를 추적
  • 두 가지 방법으로 제공
    • Contents Based: SQS에서 자동적으로 메시지의 Body의 SHA-256 해쉬를 Deduplication ID로 사용
      • 즉, Attribute는 HASH 과정에 포함하지 않음
    • 메시지의 프로듀서가 직접 Deduplication ID를 생성해서 같이 전달(예: Timestamp 등)

SNS FIFO(First In First Out)

  • SNS의 메시지 전달을 FIFO로 할 수 있는 모드
  • 두 가지 효과
    • 순서 보장
    • 중복 제거
  • SQS FIFO / Standard Queue만 연동 가능
    • 이메일, 휴대폰 SMS, HTTP 엔드포인트 등 일반적인 Subscriber와 연동 불가능
  • 기타 기능
    • 메시지 그룹
    • 메시지 필터링
  • 이름에 .fifo 필수
    - 예: my-demo-topic.fifo

SNS FIFO - Message 순서

  • 일반적인 SNS + SQS 조합은 순서를 보장하지 않음
    • 즉, 메시지가 발송된 순서와 별도로 대상이 수신
    • 일반 SNS / 일반 SQS 둘 다 순서 보장(X)
  • 순서를 보장하기 위해서는 SNS FIFO + SQS FIFO가 필요
  • 각 Subscription에 전달되는 메시지 별 순서는 다를 수 있지만, 받는 메시지의 순서는 동일
  • Message Sequence Number: 연속적은 아니지만 항상 증가하는 번호
    • SNS FIFO에서 메시지를 받아 발송할 때 부여
    • Message Body에 포함. 단, Raw Message 전달 활성화 시 포함하지 않음

SNS FIFO - Filtering

  • 메시지 필터링을 통해 모든 메세지 대신 특정 메세지만 수신 가능
  • 각 Subscription FIlter Policy 설정 가능
    - FIlter Policy: 메세지의 Body 혹은 Attributes 단위로 원하는 메시지를 매칭
    - 매칭 시 메시지 발송 / 불일치 시 메세지를 전달하지 않음

SNS FIFO - Deduplication

  • Deduplication: 중복 제거 -> 정확하게 한번만 메시지를 전달하는 기능
  • Deduplication ID를 기반으로 중복된 메세지를 제거
    • 5분 이내에 같은 Duplication ID를 가진 메세지가 전달되면 요청은 성공하지만 전달되지 않음
    • SNS 메세지가 전달된 이후에도 ID는 트랙
  • SNS에 전달된 메세지 Body를 기반으로 Deduplication ID 생성 가능
    • 메시지 Body의 Hash 기반으로 Deduplication ID를 생성
    • Attribute는 Hash에 반영하지 않음

SNS FIFO - Message Archive / Replay

  • SNS FIFO에 전달된 메시지를 저장하고 필요에 따라 Replay 가능
    • 사용 사례
      • 메시지 전달 과정의 오류를 복구
      • 기존 어플리케이션의 장애 복구
      • 신규 어플리케이션의 Sync 맞추기
  • 메시지 보관 기간 설정: 1일에서 365일
  • 추가 보관 비용 발생
  • Replay시 시간을 정해서 Replay 가능

SQS/SNS FIFO - Message Group ID

  • Message Group ID: SNS/SQS FIFO 내부의 일종의 채널
  • Message Group ID 단위로 순서 보장 및 전달이 이루어짐
    • 즉, 다른 Message Group ID끼리는 순서 보장이 이루어지지 않음
    • SQS FIFO에서는 동일 Message Group ID를 가진 메시지는 동시에 하나만 처리 가능 -> 하나의 Message Group에서 맨 처음 메시지가 처리되지 않으면 나머지 Message Group 모두 대기
  • SNS FIFO에서 Message Group ID를 전달했을 때, 대상이 SQS FIFO라면 Message Group ID 같이 전달

※ SQS FIFO vs Standard

실습 - SNS FIFO Storage/Replay

  1. SNS FIFO와 SQS 큐로 연결하는 Subscription 생성 (CloudFormation을 사용한 프로비전)
    a. DynamoDB에 요청을 저장하는 로직
    b. 이메일을 보내는 로직

  2. 데이터를 삭제하고 Replay로 DB에 데이터가 다시 생성되는 것을 확인
    a. 아카이브 정책 활성화

    b. 재생

  3. S3에 데이터를 저장하는 로직을 담은 Subscription 추가
    a. 구독 생성
    b. Replay로 기존 로직과 sync 맞추는 부분 구현

Amazon Kinesis 소개

Amazon Kinesis를 사용하면 실시간 스트리밍 데이터를 손쉽게 수집, 처리 및 분석할 수 있으므로 적시에 통찰력을 확보하고 새로운 정보에 신속하게 대응할 수 있습니다. Amazon Kinesis는 모든 규모의 스트리밍 데이터를 비용 효율적으로 처리할 수 있는 핵심 기능과 더불어 애플리케이션 요구 사항에 가장 적합한 도구를 선택할 수 있는 유연성을 제공합니다.

Kinesis 서비스

  • AWS에서 스트리밍 데이터를 수집하고 분석 처리하는 서비스
  • 총 4가지 서비스
    • Kinesis Data Stream: 스트리밍 데이터를 수집하는 서비스
    • Amazon Data Firehose(Kinesis Data Firehose): 데이터를 수집하고 변환하여 공급자(S3, RedShift, AWS OpenSearch, Datadog, HTTP 등)에게 전송하는 서비스
    • Kinesis Data Analytics Studio: 실시간 스트리밍 데이터를 분석하는 서비스
    • Kinesis Videos Streams: 재생, 분석 및 기계 학습을 위해 미디어 스트림을 캡처, 처리 및 저장

Amazon Kinesis Data Stream 기초

Kinesis Data Stream

  • 스트리밍 데이터를 수집하고 처리 주체에 전달하는 서비스
  • 요청이 아닌 데이터의 처리
  • 단발성 데이터가 아니라 많은 분량을 지속적으로 전달되는 데이터의 처리
  • 예: 로그, 이용 데이터, 센서 데이터
  • 작은 데이터부터 거의 무한대의 용량을 처리 가능
  • 고가용성 내부적으로 확보

Kinesis Data Stream의 주요 구성 요소

  • Data Stream: 샤드(Shard)로 구성된 데이터 처리를 위한 스트림
    • Shard: Kinesis의 Data Stream의 처리 단위로 일종의 내부 파이프라인
  • 데이터 레코드: Kinesis를 활용해 보내려 하는 데이터
    • Sequence Number: 샤드 내의 파티션 키 단위로 부여되는 고유 번호
  • Producer: 데이터를 생산해서 Kinesis에 전달하는 주체
  • Consumer: 데이터를 소비하는 주체로 데이터를 직접 처리하거나 다른 주체로 전달
  • 액세스 정책: Kinesis의 접근을 제어

Data Stream

  • 데이터 처리를 위한 스트림
  • 24시간 ~ 1년 단위로 데이터 저장(vs SQS는 14일)
    • SQS와 달리 원한다면 이 기간 내에 데이터를 다시 조회/처리 가능
  • 샤드 단위로 데이터를 처리
  • Capacity Mode
    • On-Demand: 샤드를 수요에 따라 증설하고 사용한 데이터 용량만큼 비용 지불
    • Provisioned: 샤드 숫자를 지정하고(변경 가능) 총 숫자 만큼의 샤드에 대해서만 비용 지불

샤드(Shard)

  • Kinesis의 Data Stream의 처리 단위로 일종의 내부 파이프라인
  • 정해진 용량의 데이터를 처리
    • 읽기: 5Transections/Sec, 2MB/Sec
    • 쓰기: 100 데이터 레코드/Sec, 1MB/Sec
    • 즉, Data Stream의 처리 가능 용량을 보유한 샤드의 합을 계산
  • 데이터 레코드의 Partition Key의 MD5 Hash 값을 기반으로 샤드를 결정
  • 샤드 숫자 조절
    • Reshard: 샤드의 숫자를 조절
      • 2개로 Split / 2개를 합치는 Merge로만 가능
    • Update Shard: Background에서 샤드 숫자를 지정한 숫자로 조절(병합/분할)
    • OPEN / CLOSED / EXPIRED 상태로 관리

Producer

  • 크게 3가지 방법으로 Kinesis로 데이터 전송
    • API: PutRecord/PutRecords로 데이터 레코드 전달
    • Amazon Kinesis Producer Library(KPL): Kinesis에 데이터 레코드를 전달하기 위한 라이브러리
      • Stream에 데이터를 전달하기 위한 다양한 기능
        • Retry / 데이터 취합 및 Batch 전달 / CloudWatch 메트릭을 통한 모니터링
    • Amazon Kinesis Agent: JAVA 기반 어플리케이션

Consumer

  • KCL(Amazon Kinesis Client Library): Kinesis의 데이터 레코드 읽기를 쉽게 관리하기 위해서 만들어진 라이브러리
    • JAVA, Python, Ruby, Node.js, .NET 지원
    • 데이터 스트림의 변경, 데이터 스트리밍의 로드 밸런싱, 리샤드 등의 다양한 상황 및 로직 처리 기능을 미리 구현
  • 직접 데이터를 처리하기도 하고 상황에 따라서는 다른 주체(S3, OpenSearch 등)에 전달

기타

  • KMS를 활용한 서버 사이드 암호화 지원
  • IAM 리소스 기반 정책으로 권한 부여 가능
  • CloudWatch에서 다양한 지표 수집
    • Basic: 기본 지표 수집 모드로 스트림 단위의 지표를 1분 단위로 수집
    • Enhanced: 추가 비용으로 샤드 단위의 지표를 1분 단위로 수집

Amazon Data Firehose

Amazon Data Firehose는 Amazon Simple Storage Service(Amazon S3), Amazon Redshift, Amazon OpenSearch 서비스, Splink 및 타사 서비스(Datadog, LogicMonitor Dynatrace, MongoDB, New Relic, Coraloc) 등의 대상에 실시간 스트리밍 데이터를 전송하는 완전 관리형 서비스입니다.

Amazon Data Firehose

  • 데이터를 원하는 주체로 전달해주는 서비스
    • 주로 데이터를 처리하는 주체(OpenSearch, RedShift, Splunk, Datadog)로 전달
    • 혹은 S3에 직접 저장해서 보관 / Athena 분석 가능
  • 일정 버퍼/시간이 찰 때 까지 기다렸다가 하나의 파일로 flush 하는 형식
    • 전달 대상에 따라 버퍼 사이즈와 시간 변동

Data Transform

  • 데이터가 Firehose로 내용을 변경시켜 받는 기능
    • 데이터 포맷, 파일 사이즈 등 데이터 내용을 원하는대로 변경 가능
    • 예: Apache Parquet으로 변경, 로그 중 민감 정보 제거, 필터링 등
  • Apache Parquet or Apache ORC 데이터 포맷 변경은 기본 지원
  • 다른 변경(예: to csv, 민감 정보 제거 등)은 AWS Lambda 서비스를 호출해서 변경
    • 기본 1MB 단위 ~ 최대 6MB(Lambda Payload Limit)로 전달

기타

  • S3에 저장시 오브젝트 Key(파일명) 지정 가능
    • 예: Athena에서 활용하기 위한 포맷
    • <Prefix>year=<YYYY>/month=<MM>/day=<DD>/hour=<HH>/minute<mm>/<unique_id>.json

실습 - Click Heatmap 만들기

  1. CloudFormation 프로비전
  2. 로그 데이터 생성 후 S3에서 확인

참고

https://www.inflearn.com/course/%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%98%EB%8A%94-aws-%EA%B8%B0%EC%B4%88/dashboard

0개의 댓글