就像很多人所知道的那样,这个世界上出现了一种叫区块链的技术,有一些区块链项目会发行 Token,这些 tokens 可以在交易所里交易。
我前几天想到是不是可以记录一下某个交易所的交易量变化,来了解这个交易所的运营情况。而且大部分交易所都有 api 可以调取交易市场上的数据。我选择了一个叫做 BigONE 的交易所。
根据他们的文档,我只需要调用一个接口就可以拿到所有交易市场的信息了。另外,我每天调用一次(凌晨3点),应该就差不多了。如果单开一台服务器做这件事,有点浪费;如果用我自己的电脑做这件事情,电脑就没法关机。
正好之前用过一点 AWS Lambda,这是一个只需要为算力付费(不是挖矿的算力)的计算服务。查了查,配合 AWS 的 Cloud Watch 服务,可以实现定点工作的功能,工作完成(几秒钟即可完成一次 api 的请求)后就不再收费。
创建 Lambda 函数
为了使用 AWS 的 Lambda 进行计算,你需要把处理方法写成一个函数。如果你用 python 就 def
一个,如果你用 node.js 就 function
一个。当到达了计算启动的条件,AWS 会自动调用这个函数。通常,你可以使用 AWS 默认的函数名,lambda_handler
,并且这个函数被放在lambda_function.py
这个文件下。
下面就是创建这个函数的具体代码:
from botocore.vendored import requests
import boto3
from datetime import datetime
s3 = boto3.client("s3")
def lambda_handler(event, context):
markets = requests.get("https://api.big.one/markets")
key = datetime.now().isoformat().split('.')[0] + '.json'
s3.put_object(Body=markets.text, Key=key, Bucket="bigone-metrics")
这里有一点想要说明,在 python 中发 http 请求时经常[1]被用到 requests
模块被 Lambda 放在了botocore.vendored
中[2]。
创建 S3 存储桶,赋予 Lambda 访问权限
为了更好的记录历史数据,我们都找个地方把数据存起来,S3 是一个比较便宜的地方。
为此我们需要在 S3 中创建一个存储桶。
但有了 S3 的存储桶之后,Lambda 并没有权限去访问它。我们需要为这个 Lambda 函数创建一个新角色,并赋予适当的权限。具体方法是:
创建 IAM,选择信任 Lambda- 在 IAM 中创建一个 Role,这个 Role 要基于 Lambda (用 AWS 的话说,就是信任实体类型是 Lambda,见上图)
- 为这个角色附加策略时,选择 S3 的 FullAccess 权限[3],和 CloudWatch Log 的权限(因为 Lambda 会把启动时间,运行时间写在日志中)
最后把这个角色赋予刚刚创建的 Lambda 函数。
创建 CloudWatch 计划
在 Cloud Watch 中创建创建一个规则,要求这个规则中的计划事件是每天一次,并且把触发目标指向刚刚创建的 Lambda 函数。具体示例可参加 AWS 官方指南。
在 CloudWatch 控制台中创建规则如果你想使用 Cron 来制定启动时间,比如北京时间晚上 1 点,你可以在上图所示的界面使用 Cron 表达式:0 17 * * ? *
。 注意这个时间是基于 UTC 时间。
之后启动计划事件就可以了。
后话
这应该比单开一台服务器的成本低很多。另外,我使用的是 AWS 东京区域。
网友评论