본문 바로가기
DevOps/Cloud

LocalStack으로 AWS local Kinesis 환경 만들기

by 카프리썬 2023. 12. 10.
728x90

 

목차

    로그 수집기 

    AWS kinesis

    AWS kinesis를 사용해서 많은 로그들을 수집하고 있다.

    키네시스는 실시간 데이터 스트리밍 서비스로, 실시간으로 흘러들어오는 데이터들을 받아서 처리해주는 서비스이다. 

    이때 데이터들은 어느정도라 섣불리 예상하기 어려운데, 다행히도 키네시스는 유동적으로 shard수를 조절해서 scale out까지 가능하다.

     

    물론 도메인에 따라 다르겠지만 우리 앱 기준으로 예를 들어 상품을 클릭하고, 상품을 장바구니에 담고, 구매하고 등등 한 사용자이더라도 다양한 이벤트가 발생한다. 이에 따라 무수한 로그들을 키네시스가 실시간으로 받아서 저장하는 것이다.  

     

    Receiver Server

    결국 이러한 로그들을 키네시스가 받아서 처리해주기 위해, 로그들을 키네시스로 보내주는 서버가 필요하다.

    즉, 리시버 서버이다. aws sdk를 사용해서 로그를 전달할 키네시스와 연결해 놓는 것이다.

    이 서버에 다양한 로그들로 request를 날리면, 서버에서는 각 이벤트 타입에 따라 분류하고, 키네시스 스트림에 데이터를 전송한다.

     

    그런데 왜 갑자기 Localstack?

    그런데 최근에 리시버 서버를 리팩토링할 일이 생겨서

    코드를 수정하고 나서 테스트를 하려고 했는데..

    오잉? 어떻게 테스트 해 보징?

    키네시스로 전달하려는 이벤트 로그들은 임의로 만들수 있다고 치는데,

    이 로그들을 리시버 서버가 제대로 처리해서 키네시스로 잘 보내졌는지는 어떻게 확인하지..? (대.략.난.감)

     

    아쉽게도 aws에는 stg과 prod 키네스스만 구축되어 있었는데, 혹시 개발용 키네시스를 따로 만들어야하나..?

    심지어 이벤트 타입에 따라서 전송하는 키네시스 스트림이 여러개이다보니 테스트 스트림을 여러개 만들기도 좀 그랬다..

     

    알고보니 localstack이라고 로컬에서 aws환경을 구축할 수가 있었다.

    https://www.localstack.cloud/

     

    LocalStack

    Use LocalStack as a drop-in replacement for AWS in your dev and testing environments.

    www.localstack.cloud

    Locakstack이란?

    로컬스택은 AWS 클라우드 리소스의 기능을 애뮬레이션하여 제공한다.

    예를 들면 키네시스를 로컬환경에서 사용할수 있도록 모킹해주는 것이다. 

    (오호라..그렇다면 리시버 서버에서 연결하는 키네시스를 요길로 연결하면 될듯..?)

    Localstack 설치

    localstack구성은 docker를 사용할 수 있어서 생각보다 간단하다.

    docker run --rm -it -p 4566:4566 -p 4510-4559:4510-4559 localstack/localstack

     

    그럼 아래 로그에도 보시다시피 이렇게 키네시스 mock server가 띄워진걸 확인할 수 있다. 

    kinesis_mock_server :[info] kinesis.mock.KinesisMockServices 2023-11-28T06:44:41.5330307 

     

    그리고 4566포트에도 띄워진걸 확인할 수 있다. 

     

    뿐만 아니라 docker-compose로도 구성할 수 있는데, 관련 docker-compose.yml 파일은 아래와 같다.

    version: "3.8"
    
    services:
      localstack:
        container_name: "${LOCALSTACK_DOCKER_NAME-localstack-main}"
        image: localstack/localstack
        ports:
          - "127.0.0.1:4566:4566"            # LocalStack Gateway
          - "127.0.0.1:4510-4559:4510-4559"  # external services port range
        environment:
          - DEBUG=${DEBUG-}
          - DOCKER_HOST=unix:///var/run/docker.sock
        volumes:
          - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"
          - "/var/run/docker.sock:/var/run/docker.sock"

     

    docker-compse.yml 파일 생성 후

    docker-compose up

     

     

    Localstack 서비스 확인 

    localstack status service

     

    현재 kinesis 서비스가 running 인걸 확인할 수 있다. 

     

    만약, 로컬스택이 실행되지 않았다면 아래같은 에러나올 것이다!

    ❌ Error: could not connect to LocalStack health endpoint at http://localhost:4566

     

     

    Local kinesis stream 생성 

    awslocal 설치 

    pip install awscli-local

     

    awslocal 명령어는 localstack으로 날리는 aws-cli이다. (localstack 서버와 awslocal 클라이언트랄까)

    사실 일반적인 awscli의 endpoint를 로컬스택 서버로 날리는 명령어와 같다고 보면 될것같다. 

    ( aws --endpoint-url=http://localhost:4566 ~ ) 명령어와 동일하다. 

     

    https://github.com/localstack/awscli-local

     

    GitHub - localstack/awscli-local: 💲 "awslocal" - Thin wrapper around the "aws" command line interface for use with LocalStac

    💲 "awslocal" - Thin wrapper around the "aws" command line interface for use with LocalStack - GitHub - localstack/awscli-local: 💲 "awslocal" - Thin wrapper around th...

    github.com

     

    Local kinesis stream 확인 및 생성

    전체 스트림 리스트 확인

    awslocal kinesis list-streams

     

     

    앞단에서는 awslocal로 명령어 날려서 결과로컬 스택 서버에서는 AWS kinesis.ListStreams => 200 로그 확인

     

    스트림 생성 

    awslocal kinesis create-stream --stream-name bun-log-receiver-dev --shard-count  1

     

    생성된 스트림 정보 확인

    awslocal kinesis describe-stream —-stream-name bun-log-receiver-dev

     

    로컬 환경에서 테스트 하기

    결국 이렇게 로컬 환경에서 필요한 키네시스 스트림들을 생성했다. 이제 리시버 서버의 테스트 환경이 구축 된것이다.

    스트림 레코드 확인

    우선 테스트 데이터로써 키네시스로 전달하려는 이벤트 로그 데이터를 임의로 만들었다.

    그리고 리시버 서버 API를 호출하여 이벤트 로그 데이터가 로컬 키네시스 스트림으로 put Record가 되도록 동작시키고,

    해당 스트림을 get Record 하여 해당 데이터가 특정 스트림에 들어있는지 테스트하면 되는 것이다..!

     

    get Record는 아래와 같이 3단계로 진행이 된다..

    1. describe로 ShardId 가지고 오기 shardId-000000000000

    awslocal kinesis describe-stream --stream-name bun-log-receiver-dev

    2.ShardId로 Shard iterator 가지고 오기

    awslocal kinesis get-shard-iterator --stream-name bun-log-receiver-dev --shard-id shardId-000000000000 --shard-iterator-type TRIM_HORIZON

    3.Shard iterator로 getRecords 가지고 오기 

    awslocal kinesis get-records --shard-iterator  AAAAAAAAAAF9RzndFbih9gHt2ao5BEl5uYZlVK7611MmG+WtZsVI2ptQQvGABkhTkzU4sff9DsI5evzqvnLtI08aAM7cTOx8oQKviDf0tDAzz2X8hQcU1nWFlX1efOrw3hMn/oPKCMBc5dyLdeD8brY4Rk2C4/UxN6Zk30Gqg/BYqEicALHVnVcRLK79+B3HFKubACsiSX048sCFkvSvy91YPHGhqhYPhJ3FheQR7PAXGC/tf+bPiw==

     

    찾아보니 사실 위의 3단계를 변수를 통해 한번에 명령어를 날릴수도 있었다..!

    https://github.com/localstack/localstack/issues/3488

     

    아무튼간 결국 아래의 레코드가 해당 스트림에 들어와있는걸 확인할 수 있다! 

     

    testContainer 

    그런데 사실 위에처럼 LocalStack 컨테이너를 별도로 도커로 실행시켜서 띄울수도 있었지만,

    리시버 서버가 Java언어로 만들어져있기 때문에 testContainer로 LocalStack을 사용할 수 도 있었다! 

    testContainer가 코드안에서 localstack 이미지를 가지고와서 container를 동작시키는 것이다..! 

     

    https://testcontainers.com/ 

    https://dev.gmarket.com/76

     

    요건 다음에 알아보도록 하자..ㅎㅎ..

     

     

     

     

    반응형

    $(document).ready(function() { var $toc = $("#toc"); $toc.toc({content: ".tt_article_useless_p_margin", headings: "h2,h3,h4"}); });