阿里云定时任务并自动释放
前言
最近写了一个爬虫脚本, 脚本跑在一台北京的 ecs 上. 但奈何因某种未知力量, 需要连接代理才能访问目标网站.
本来想着自己搭代理, 但是太贵了, 就暂时搁置了. 直到我发现了这个:
阿里云香港的服务器, 一个小时才5分钱. 如果脚本直接跑在香港服务器上不就可以了咩, 按照这个价格, 我每天使用一个小时, 一个月也就不到两块(流量另付).
窥探
我的基本思路是这样的:
- 北京 ecs 定时任务, 创建并启动香港 ecs
- 在香港 ecs 上执行任务
- 任务执行完成后, 将香港 ecs 删除
说干就干, 查了一下阿里云提供的API
, 云服务商确实是方便, 基本所有操作都可以通过API
来执行. API
文档地址: https://next.api.aliyun.com/api/Ecs
其API
文档上每个语言的每个接口, 都有对应的 demo, 这点点个赞.
启动 ecs
启动 ecs 方法: runInstances
, 可以自定义参数, 不过个人推荐创建一个启动模板, 比较方便:
其中的UserData
参数 其实就是一个小脚本, 不过不能超过16kb. 自定义数据文档
我们就通过他, 在 ecs 创建之后自动执行任务.
通过下面命令, 可查看传入 ecs 的脚本内容(其实在文档中写的很清楚了):
curl http://100.100.100.200/latest/user-data
好, 我们启动的脚本需要执行以下操作:
- 初始化环境
- 将需要运行的项目拽下来
- 运行脚本
- 完成后将自己删除
我的脚本大概这样, 可供参考:
#!/bin/sh
# 先下载依赖
apt update
apt install -y git php curl
# 安装 composer
export HOME=/root
curl -sS https://getcomposer.org/installer -o /root/composer-setup.php
/usr/bin/php /root/composer-setup.php --install-dir=/usr/local/bin --filename=composer
# 下载项目
git clone xxx /var/workspace
# 安装vendor
cd /var/workspace
printf 'yes\n' | composer install
# 导入配置文件
echo '$confJson' > /var/workspace/cron/conf.json
# 运行命令...
# 运行脚本将自己删除
php /var/worspace/cron/delete_self.php
注意, 这里将删除自己的脚本单独拿出来了, 为什么不再任务脚本执行完成后直接删除自己呢? 如果因为某种不可知的原因, 任务脚本挂了, 会导致实例没有被正常删除, 这可都是白花花的银子啊.
如果你遇到UserData
有问题, 但是开一台新的 ecs 后, 重新运行又没问题. 此时, 可查看/var/log/cloud-init-output.log
文件进行排查, 记录了初始化脚本的运行结果.
删除 ecs
现在任务已经跑起来了, 但是跑完了之后还需要删除自己呀. 查看后发现了deleteInstances
方法, 但参数需要instanceId
, 如何获得当前运行实例的instanceId
呢? 找了一下文档中也有介绍
小提示, 查找语法: instance-Id site:https://help.aliyun.com/
直接定位目标页面.
访问地址:
# 获取当前实例 instanceId
curl http://100.100.100.200/latest/meta-data/instance-id
# 获取当前实例 regionId
curl http://100.100.100.200/latest/meta-data/region-id
获取当前实例 ID 后, 接下来就简单了, 把自己删除掉就好啦.
通过这种方式执行脚本, 实在是经济又实惠. 有需要的小伙伴不妨一试哦~