공부하기싫어
article thumbnail

목차

     

    요약

    유튜버 '조코딩' 의 비트코인 자동매매 Open Source Project를 Serverless 리소스로 마이그레이션 해서 서버 비용 부담 저하 시켜봤습니다.

    https://youtu.be/Teju_e9TI3s

     

    1. Architecture

    1.1 diagram

    • EC2-t3a.micro-TradeServer : 현재시세와 목표가격을 비교해 자동으로 거래를 진행하는 메인 서버
    • Lambda-k-value : 변동성 돌파 전략 기준값 도출 함수
    • Lambda-AI : prophet 시계열 분석 당일 종가 예측 함수
    • dynamoDB : main python script 에서 사용될 값 저장 테이블
    • cloudwatch alarm group : 일정 EventBridge 그룹
    • SSM Parameter Store : upbit access, secret key 저장
    • S3 Bucket : daily log 저장

     

    1.2 Resource Configuration

    • EC2
    Region ap-northeast-2
    VPC/Subnet default / 2c
    AMI ubuntu-jammy-22.04-amd64-server
    Instance type t3a.micro
    Storege 16GiB
    Security Group - inbound 22 - 0.0.0.0/0
    Security Group - outbound all - 0.0.0.0/0
    IAM Role RoleForEC2-TradeServer

     

    • Lambda
    Function name runtime package type IAM Role
    k-value EthereumAutotrade-prod-bestk - image RoleForLambda-EthereumAutotrade
    AI-prophet EthereumAutotrade-prod-endprice - image RoleForLambda-EthereumAutotrade

    Function memory tmp storege timeout x-ray trace
    k-value 512MB 512MB 30sec Enable
    AI-prophet 4096MB 1024MB 1min Enable

     

    • dynamoDB
    Partition Key Env
    Table setting Customize settings
    Table class Standard
    Capacity mode Provisioning
    RCU / WCU / Auto scaling 1 / 1 / off

     

    • Cloudwatch
    Scheduler Schedule Group Target
    schedule-for-EthereumAutotrade-lambda_bestk AG-Ethereum-Autotrade EthereumAutotrade-prod-bestk
    schedule-for-EthereumAutotrade-lambda_endprice AG-Ethereum-Autotrade EthereumAutotrade-prod-endprice
    Scheduler Event Max time Retry DLQ IAM Role
    schedule-for-EthereumAutotrade-lambda_bestk 5min 3 queue-for-ethereum-autotrade-lambda2 default
    schedule-for-EthereumAutotrade-lambda_endprice 5min 3 queue-for-ethereum-autotrade-lambda2 default

     

    • IAM Role

    - RoleForEC2-TradeServer :

    • AmazonSSMManagedInstanceCore
    • AmazonDynamoDBReadOnlyAccess

     

    - RoleForLambda-EthereumAutotrade:

    • AWSXRayDaemonWriteAccess
    • AWSLambdaBasicExecutionRole
    • AWSLambdaTracerAccessExecutionRole
    • Inline Policy

     

    - generated-lambda-ec2schedule:

    • AmazonSSMFullAccess
    • AWSLambdaTracerAccessExecutionRole

     

    1.3 Estimated Budget

    Resource E_Budget/month note remarks
    EC2-t3a.micro 2.15USD Reserved Instance  
    Lambda - bestk 0.00USD x86 / 1RpD / 300ms / 1024MB / tmp-512MB  
    Lambda - endprice 0.03USD x86 / 1RpH / 600ms / 4096MB / tmp-1024MB  
    Lambda - ec2schedule 0.00USD default  
    dynamoDB 0.63USD 1RCU/1WCU PV  
    EventBridge - scheduler 1USD 미만 100만건당 1USD  
    x-ray 0.37USD 100% / 44640RpM / 4464QpM  
    S3 1USD 미만 단순 로그 저장  
    SSM parameter 0.00USD standard  
    SUM 4.81USD about 5USD  
    TAX 0.05USD 10%  
    final SUM     about 5USD
    before miration   t2.medium 34.16USD
    The Difference     +29USD

     

    2. CI/CD Pipeline

    2.1 pipeline diagram

    • 개발자가 깃허브 리포지토리로 푸시하게 하게되면 jenkins server ip 의 container pod 포트로 웹훅을 보냄
    •  ansible 을 통해 trade-server 로 사용하는 EC2 인스턴스에 수정한 파일 git pull 작업을 하게됨
    • lambda functions 에 사용되는 container images 는 수동으로 build/push
    • ECR에 올라가있는 이미지를 AWS lambda console 에서 직접 함수를 생성함

     

    3. Proccess

    3.1 proccess diagram

     

    3.2 python proccess describe

    기존 유튜버 조코딩의 프로젝트를 수정한 점만 기재함

    • output.log 파일을 날자별로 관리하기 위해 main python 파일은 매일 오전8시55분에 종료되도록 설정함
      • lambda 함수를 생성하고 매일 오전 9시에 main python 파일을 실행하도록 트리거를 설정함
    • python 파일에 직접 upbit key 를 담지 않기 위해 AWS SSM parameter store 를 사용해 이를 참조하도록 함
    • prophet 라이브러리가 실행될때 과도한 리소스 사용을 분리해내기 위해 container image 로 lambda 함수를 생성함
      • 람다 계층 / CodeArtifact 로 종속성을 포함하려고 하였으나 실패함
      • cloudwatch schedule 을 사용해 k 값을 계산해주는 lambda 함수는 매일 오전 8시 55분에 실행되도록 함
      • cloudwatch schedule 을 사용해 예상 종가를 계산해주는 lambda 함수는 매시 55분에 실행되도록 함
      • python proccess 에서는 각 값을 오전9시 / 매시 정각에 불러옴
    • lambda 함수의 실행값을 저장하기 위해 dynamoDB Table을 사용해서 boto3로 불러오도록 구성함

     

     

    4. Codes

    4.1 github fork

    https://github.com/cyaninn-entj/pyupbit-autotrade-with-AWS

     

    GitHub - cyaninn-entj/pyupbit-autotrade-with-AWS: 유튜버 '조코딩' 의 비트코인 자동매매 Open Source Project를 Ser

    유튜버 '조코딩' 의 비트코인 자동매매 Open Source Project를 Serverless 리소스로 마이그레이션 해서 서버 비용 부담 저하 목표 - GitHub - cyaninn-entj/pyupbit-autotrade-with-AWS: 유튜버 '조코딩' 의 비트코인 자

    github.com

     

    5. Implements

    5.1 Lambda Function - Container Image

    blog - https://yeonwoo97.tistory.com/398

     

    5.2 EC2 Python - read dynamoDB, SSM Parameter

    blog - https://yeonwoo97.tistory.com/400

     

    5.3 Lambda Function with Cloudwatch EventBridge Scheduler

    blog - https://yeonwoo97.tistory.com/402

     

    5.4 Lambda Function - update dynamoDB Table

    blog - https://yeonwoo97.tistory.com/403

     

    5.5 Lambda Function - sendCommand to EC2

    blog - https://yeonwoo97.tistory.com/405

     

    5.6 Lambda Function - sendCommand to EC2

    blog - https://yeonwoo97.tistory.com/407