시작하며

연수 3일차에는 AWS 로드 밸런서 실습, Python을 이용한 Kinesis 스트리밍 실습, 그리고 API Gateway → Kinesis Streams → Kinesis Firehose → S3로 이어지는 데이터 파이프라인 구축 실습을 진행했다. 마지막으로 Fluentd와 Snowflake 개념도 다뤘다.

본 강의 및 실습 내용

실습 1. AWS LoadBalancers

1. VPC Wizard를 통해 생성
    - (kbi-0127-main-vpc) / 10.0.0.0/16
 
2. EC2 Instance 2대 생성
    - (demo-vm-01, demo-vm-02)
 
3. Instance별로 서버 띄우기
    - sudo yum install -y httpd
    - sudo systemctl enable httpd.service
    - sudo systemctl start httpd.service
    - sudo systemctl status httpd.service
    - sudo groupadd www
    - sudo usermod -a -G www ec2-user
    - exit
 
4. 서버에 접속화면 변경
    - cd /var/www
    - sudo chown -R root:www /var/www
    - sudo chmod 2775 /var/www/html/
    - cd html
    - cat << EOF > index.html [Instance 01] KBI Cloud Data Platform: Load Balancer Demo
 
5. Load Balancing > Target-Group 생성
 
6. Load Balancers > LB 생성 > Application LB 생성
 
7. ALB 접속해서 Load Balancing 확인
    - stickiness : 세션 객체를 외부에서 관리할 수 없는 제약 환경이 있을 때 사용하는 옵션
    - (EC2 > Target groups > LB-VMS > attributes > stickiness 설정)

실습 2. Kinesis 간단한 데이터 produce 및 consume 확인

1. kinesis, boto3 설치
    - pip3 install kinesis --user
    - pip3 install boto3 --user
 
2. kinesis stream 생성
    - aws kinesis create-stream --stream-name kbi-0127-stream-code --shard-count 4
 
3. producer, consumer 작성 & 실행

producer.py

import boto3  # python aws library
from kinesis.producer import KinesisProducer
 
producer = KinesisProducer(stream_name='kbi-0127-stream-code')
 
for i in range(100):
    print(i)
    producer.put_record(str(i) + 'th message from Python')
 
print("completed")

consumer.py

import boto3
from kinesis.consumer import KinesisConsumer
 
consumer = KinesisConsumer(stream_name='kbi-0127-stream-code')
 
for message in consumer:
    print("===========")
    print(message)
    print("===========")

실습 3. Data Pipeline 구축 실습

데이터 플로우 예시:

  • Amazon EC2 or Cloud9 → Amazon API Gateway → Kinesis Streams → Kinesis Firehose → S3
  • ARN : ROLE에서 AWS 내부적으로 가지고 다니는 고유한 시리얼번호
1. Kinesis Stream 생성
    - (kbi-0127-data-pipe-stream)
 
2. S3 버킷 생성
    - kbi-0127-data-pipe-bucket
 
3. Role 설정
    - API-Gateway에 Role 생성, Permission 추가
    - Kinesis, KinesisFirehose, KinesisAnalytics Full Access 추가
 
4. API Gateway REST-API 생성
    - API 생성 > Resource 생성 > Method 추가 > ARN Role 설정 > Request Header, Body 설정
    - 매핑 템플릿 설정
#set( $enter = "" )
#set( $json = "$input.json('$')$enter")
{
    "Data": "$util.base64Encode("$json")",
    "PartitionKey": "1",
    "StreamName": "kbi-0127-data-pipe-stream"
}
5. kinesis firehose 설정
    - Source, Destination 설정
 
6. API 배포 URL 확인
 
+ Q1. S3 하나의 오브젝트에 저장하려면 어떻게 해야 하나?
+ Q2. Kinesis 내부 모니터링을 하려면 어떻게 해야 하나?

Fluentd

  • CNCF : 클라우드의 전반적인 기술을 담당하고 있다.
  • Kubernetes 사용자들이 특히 많이 사용한다.(내부 서버들을 밖으로 끄집어내기 위해 많이 활용)
  • Kinesis:Kafka → Kinesis-Firehose:Fluentd 관계로 이해할 수 있다.
  • 경량화되어 C++로 개발된 Fluentbit도 있다.
  • input → filter → buffer → output의 형태로 많이 사용한다.

Snowflake

  • multi star schema가 모여있는 데이터를 다루는 Amazon의 서드파티 회사
  • cloud-computing 기반의 DW 회사
  • 사용량 기반 과금 정책을 갖고 있다.
  • Cloud Public Storage 사용, ANSI SQL 지원, 다양한 서드파티 및 오토튜닝(indexing, partitioning 불필요)
  • 특정 시점으로 이동 가능 (Time Travel)

내부 동작 방식:

  • 하나의 파일을 micro-partition으로 작게 만든다. 변경점이 생성되면 기존 파일이 복사되어 버전이 올라간다.
  • 컬럼 기반 데이터베이스이며, 그래서 오브젝트 스토리지임에도 변경이 자유롭다.
  • 대신 SQL 실행 능력 측면에서 부족한 캐싱 능력을 보완하기 위해 Computing-Node의 파워를 증가시켜 비용이 RedShift보다 비싸졌다.
  • 실제 실행은 Virtual DW에서 수행된다. 쿼리가 밀린다면 Auto-Scaling도 가능하다.

정리하며

API Gateway → Kinesis → Firehose → S3로 이어지는 데이터 파이프라인은 실시간 스트리밍 데이터를 수집하고 저장하는 전형적인 서버리스 아키텍처이다. Fluentd는 로그 수집 및 전송의 표준으로 Kubernetes 환경에서 특히 유용하다. Snowflake는 컬럼 기반 스토리지와 Time Travel 기능을 통해 클라우드 네이티브 DW의 새로운 기준을 제시하고 있으나, 비용 측면에서 RedShift와 트레이드오프를 고려해야 한다.