前言
雖然現在是 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 上而已,東西都自己控,也不要太擔心太多什麼資安議題啦!