목차
요약
유튜버 '조코딩' 의 비트코인 자동매매 Open Source Project를 Serverless 리소스로 마이그레이션 해서 서버 비용 부담 저하 시켜봤습니다.
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
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
'1인개발 메이킹로그 > [Infra+k8s+App] 가상화폐 자동매매' 카테고리의 다른 글
[Error] 'NoneType' object is not subscriptable (0) | 2023.09.24 |
---|---|
[Test] Code 에서 AWS Credential 분리/제거 (1) | 2023.07.12 |
[Error] pod not completed (0) | 2023.06.25 |
[Error] string indices must be integers (0) | 2023.06.24 |
[테스트] Dockerfile 'CMD' / kubernetes cronjob (0) | 2023.06.19 |