[AWS] Kinesis 데이터 수집 파이프라인 구축 - (1)

sunnyjjang·2024년 10월 12일

AWS

목록 보기
20/21
post-thumbnail

LAB. AWS 서비스를 활용한 데이터 수집 파이프라인 구축

워크플로우
1. 역할 생성
2. API GateWay 구성
3. Amazon Kinesis 생성
4. Data Firehose 생성
5. 웹서버 구성
6. TEST

1. 역할 생성

  • API Gateway가 Kenesis에 데이터를 저장할 수 있는 권한
  • name : apigateway2kinesis-role
    • 유형 : AWS 서비스
    • 사용 사례 : API Gateway
    • 권한 : AmazonAPIGatewayPushToCloudWatchLogs
    • arn 정보 확인 : apigateway2kinesis-role arn (보안 중요)
  • 권한 추가
    • 역할 > 권한 추가 > 정책 연결 : AmazonKinesisFullAccess

2. API GateWay 구성

  • API Gateway 생성
    • 유형 : REST API
    • name : data-api
  • 리소스 생성
    • 리소스 경로 : /
    • 리소스 이름 : v1
  • 메소드 생성 - v1
    • 메서드 유형 : POST - 외부에서 요청받을 때 사용할 메서드
    • 통합 유형 : AWS 서비스
    • AWS 리전 : ap-northeast-2
    • AWS 서비스 : Kinesis
    • HTTP 메서드 : POST - API Gateway가 Kinesis 로 보낼 때 적용할 메서드
    • 작업 유형 : 작업 이름 사용
    • 작업 이름 : PutRecord (등록된 함수이기 때문에 대소문자 구분해서 정확하게 입력)
    • 실행 역할 : apigateway2kinesis-role의 arn 입력
    • 보안 인증 캐시 : Default (인증 정보 추가 X)
    • 콘텐츠 처리 : Default (패스스루)
    • 통합 시간 초과 : Default
  • 요청 헤더 파라미터 추가
    • v1 > POST > 통합 요청 > 편집 > URL 요청 헤더 파라미터
    • name : HTTPHEADER
    • 다음에서 매핑됨 : 'application/x-amz-json-1.1'
      HTTP HEADER 
      Name : Content-Type	
      Mapped from : 'application/x-amz-json-1.1'
  • 매핑 템플릿 추가
    • 콘텐츠 유형 : application/json
    • 템플릿 생성 : Empty
    • 템플릿 본문
      #set ( $enter = "
      ")
      #set($json = "$input.json('$')$enter")
      {
          "Data": "$util.base64Encode("$json")",
          "PartitionKey": "$input.params('X-Amzn-Trace-Id')",
          **"StreamName": "story-data-q"**
      }
  • API 배포
  • 설정 변경
    • 로깅 편집 : apigateway2kinesis-role의 ARN (API Gateway에서 만들어진 로그를 모두 CloudWatch에 남기기)
  • 메서드 재정의
    • 스테이지 > POST > 재정의 생성
    • CloudWatch Logs : 오류 및 정보로그
    • 조절 중 : 활성화
      • 요율 : 10000
      • 버스트: 5000

3. Amazon Kinesis 생성

  • 데이터 스트림 생성
    • 유형 : Kinesis Data Streams
    • name : story-data-q (api - 템플릿에 등록한 이름)
    • 용량 모드 : 프로비저닝
    • 프로비저닝된 샤드 : 1

4. Data Firehose 생성

  • 버킷 생성
    • name : api-data-stream-bucket
    • 퍼블릭 엑세스 차단 : 해제
  • Firehose 스트림 생성
    • 소스 및 대상 선택
      • 소스 : Amazon Kinesis Data Streams
      • 대상 : Amazon S3
    • 소스 설정
      • Kinesis 데이터 스트림 : story-data-q
    • Firehose 스트림 이름
      • Firehose 스트림 이름 : story-data-q
    • 대상 설정
      • S3 버킷 : s3://api-data-stream-bucket
      • S3 버킷 접두사 : rawdata/
    • 버퍼 힌트, 압축, 파일 확장자 및 암호화
      • S3 버퍼 힌트 : 버퍼가 1M가 되거나 10초마다 한번 씩 S3에 sync를 맞춤
        • 버퍼크기 : 1
        • 버퍼간격: 10초
      • 데이터 레코드 압축 : 활성화 되지 않음 (실제 현업에서는 압축해서 원시 데이터를 저장해 보호함)
      • S3 버킷 암호화 설정 사용

5. 웹서버 구성

  • 보안 그룹 생성
    • name : manage-sg
      • vpc : lab-vpc
      • inbound : ssh - anywhere
  • 인스턴스 생성
    • name : manage-ec2
      • AMI : Amazon Linux
      • 인스턴스 유형 : t2.micro
      • key : lab-key
      • 네트워크
        • vpc : lab-vpc
        • subnet : public-ap-northeast-2a
        • 퍼블릭 IP : 활성화
        • 보안 그룹 : 기존 보안 그룹 선택 - manage-sg
      • 스토리지 : 30G, gp3

6. TEST

  • 원격 로그인 후 aws 프로파일 등록
    • AWS CLI 설치
      [ec2-user@ip-10-0-0-120 ~]$ sudo yum remove awscli
      [ec2-user@ip-10-0-0-120 ~]$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
      [ec2-user@ip-10-0-0-120 ~]$ unzip awscliv2.zip
      [ec2-user@ip-10-0-0-120 ~]$ sudo ./aws/install
      [ec2-user@ip-10-0-0-120 ~]$ aws --version
      aws-cli/2.17.36 Python/3.11.9 Linux/6.8.0-1012-aws exe/x86_64.ubuntu.24
      
      # 위에 명령어가 실행되지 않는 경우 path를 변경해주어야함
      [ec2-user@ip-10-0-0-120 ~]$ /usr/local/bin/aws --version
      aws-cli/2.17.60 Python/3.12.6 Linux/6.1.109-118.189.amzn2023.x86_64 exe/x86_64.amzn.2023
      [ec2-user@ip-10-0-0-120 ~]$ sudo mv /usr/local/bin/aws /usr/bin/
    • AWS 프로 파일 등록
      # AWS CLI에서 AWS 서비스에 접근할 수 있는 자격 증명을 설정
      [ec2-user@ip-10-0-0-126 ~]$ aws configure
      AWS Access Key ID [None]: AKIA...
      AWS Secret Access Key [None]: U6/kl2L7Zni5CM4...
      Default region name [None]: us-east-1
      Default output format [None]: json
      
      # 인증된 자격 증명 불러오기
      [ec2-user@ip-10-0-0-126 ~]$ aws sts get-caller-identity
      {
          "UserId": "AKIA...",
          "Account": "851725267032",
          "Arn": "apigateway2kinesis-role의 ARN"
      }
      
      # 버킷 확인
      [ec2-user@ip-10-0-0-126 ~]$ aws s3 ls
      2024-10-10 02:46:58 api-data-stream-bucket
  • 카프카 설치를 위한 java 설치
    [ec2-user@ip-10-0-0-126 ~]$ sudo yum search java-11
    [ec2-user@ip-10-0-0-126 ~]$ sudo yum install -y java-11-amazon-corretto
    [ec2-user@ip-10-0-0-126 ~]$ java --version
  • API Gateway
# Post json  
[ec2-user@ip-10-0-0-126 ~]$ 
curl -d "{\"value\":\"30\",\"type\":\"Tip 3\"}" \
   -H "Content-Type: application/json" \
   -X POST \
   https://d33mf4xn60.execute-api.ap-northeast-2.amazonaws.com/dev/v1
   ****
# shell 에서 shard의 값을 확인 
{"SequenceNumber":"49656616735127373407378311837199279454763322191160279042","ShardId":"shardId-000000000000"}

# shell 에서 shard의 값을 확인 
[ec2-user@ip-10-0-0-19 ~]$ SHARD_ITERATOR=$(aws kinesis get-shard-iterator --shard-id shardId-000000000000 --shard-iterator-type TRIM_HORIZON --stream-name story-data-q --query 'ShardIterator')

$ aws kinesis get-records --shard-iterator $SHARD_ITERATOR
  • S3 버킷 데이터 생성 확인
profile
지금 이 순간이 다시 넘겨볼 수 있는 한 페이지가 될 수 있게

0개의 댓글