難道台指期都不會有逆價差了嗎系統 – 4

前言

雖然現在是 Agent 世代了,但土法煉鋼還是有它的好處,所以就接續 上一篇 所寫的,把這程式部署到 AWS Lambda 吧!

部署前準備

經過無數的測試,若我們要部署在 Lambda 上執行的話,永豐 Shioaji API 無法在 MacOS 用 --platform manylinux2014_x86_64 的方式打包 package (原因我也不知道),因為 AWS Lambda 是執行在 AWS Linux 2,所以我們也得用相同的環境打包。

1. 找個能用的 S3 bucket。

假設 bucket 名叫做 tshine73-meta

2. IAM role

建個給 EC2 機器的 IAM role,讓這個 role 能存取第 1 步的 S3 bucket。

role name: DeploymentRole

Trust relationships

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

Permissions

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::tshine73-meta",
                "arn:aws:s3:::tshine73-meta/*"]
        }
    ]
}

3. 建立 security group 讓 ssh 能通

aws ec2 create-security-group --group-name for-ssh --description "enable the ssh connection from anywhere"

aws ec2 authorize-security-group-ingress --group-name for-ssh --protocol tcp --port 22 --cidr 0.0.0.0/0

4. 建立 EC2

建立一台 image 為 Amazon Linux 2023 的 EC2 節點,然後 attach 第 2 步的 IAM role 上去。

aws ec2 run-instances --image-id ami-075b5421f670d735c --count 1 --instance-type t3.micro --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=deployment}]' --iam-instance-profile Name=DeploymentRole --security-groups for-ssh

5. 連到該 EC2 上

可透過 AWS console 連線至 EC2 上。

6. 安裝必要的軟體

sudo yum install -y python3.12
sudo yum install git -y
sudo yum install -y python3-pip
sudo yum install -y zip

7. 從 git 拉 code 下來然後建一下 .venv 環境

cd ~
git clone https://github.com/tshine73/alpha-investment.git
cd alpha-investment
python3.12 -m venv .venv
mkdir deployment
mkdir resources

8. 把你的 .env 和 Sinopac.pfx 簽證檔案放到專案目錄下

scp -i ~/.ssh/xxxx.pem .env ec2-user@{ip}:~/alpha-investment/deployment/
scp -i ~/.ssh/xxxx.pem ./alpha-investment/resources/Sinopac.pfx ec2-user@{ip}:~/alpha-investment/resources/

部署

1. 打包 package

git pull
source .venv/bin/activate
cd deployment
rm deployment_package.zip
mkdir package
pip install shioaji==1.2.7 python-dotenv==1.0.1 pydantic==2.11.5 pandas==2.3.2 --target ./package
rm -rf ./package/pandas/tests
cp -r ../lambda_function ./package/
rm -rf ./package/lambda_function/__pycache__
cp -r ../future_utils ./package/
rm -rf ./package/future_utils/__pycache__
cp -r ../model ./package/
rm -rf ./package/model/__pycache__
cp -r ../future ./package/
rm -rf ./package/future/__pycache__
cp -r ../core ./package/
rm -rf ./package/core/__pycache__
cp -r ../resources ./package/
cp .env ./package
cd package
zip -r ../deployment_package.zip .
cd ../../
rm -rf deployment/package

2. 複製 zip 檔到 S3

aws s3 cp ./deployment/deployment_package.zip s3://tshine73-meta/deployment/deployment_package.zip

3. 建立 Lambda function

name: auto-future-rollover

version: python3.12

architecture: x86_64

Exceution role: 選擇 Create default role

4. 新增 dynamoDB 權限到新建立的 IAM role 中

找到 Lambda function 建立的 IAM role,新增 AmazonDynamoDBFullAccess

5. 部署 code 到 lambda function 裡

進到 Lambda function 頁面後,在 code 的頁籤上找到 Upload from

然後選擇剛剛放zip 檔的 S3 後進行部署。

6. 變更 Lambda function 的程式進入點

往下滑一些,找到 Runtime settings 區塊,變更 Handler 設定為 lambda_function/future_rollover.handler

7. 更新環境變數

這步是因為 shioaji 預設是把 log 放在 /var 上,但該資料夾在 Lambda 上只可讀,所以我們要到 Configuration tab 上,點選 Environment variables 設定放 log 的位置。

8. 調一下執行時的資源

Lambda 預設的 timeout 秒數是 3 秒,每次執行都會做合約下載,所以可以調高 timeout 秒數和它的執行資源。

跑看看

到 Test tab 上 點選 Test 後,就可以看看執行結果啦。

若要真正的執行交易操作,請留意需要用以下參數來執行 Lambda 程式!

{
  "simulation": "False"
}

結語

拖了這麼久才寫完,過程中 AI Agent 蓬勃發展,因為我的目的很明確跟簡單,就只是台指期轉倉而已,但如果想要執行豐富的交易策略或測試,使用 AI Agent 應該會是更好的方式,但老派執行也有老派的好處,就只是個簡單程式跑在 Lambda 上而已,東西都自己控,也不要太擔心太多什麼資安議題啦!

tshine73
tshine73
文章: 71

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *