我有一个 Docker Image 网络爬虫。我想使用 boto 创建一个 EC2 实例,部署我的爬虫,运行爬虫,然后在它完成后终止实例。
我目前的想法是这样的:
- 使用包含 Docker 的 AWS 镜像启动新的 EC2 实例。
- 使用 Fabric 之类的工具通过 SSH 连接到实例并安装 Docker 镜像。
- 使用相同的 SSH 连接运行我的命令以启动爬虫
- 让网络爬虫在完成时删除自己的实例。
一些细节:
- 我真的需要使用像 Fabric 这样的工具来通过 SSH 连接到我的实例并运行命令吗?
- 如何选择当前运行脚本的实例?
self实例(如果您愿意)。 - 有更好的方法吗?
请您参考如下方法:
我的建议是创建一个简单的 HTTP API 并直接调用它。以编程方式进行 SSH 连接通常很尴尬。这是我会做的:
实现用于启动爬虫的 HTTP 端点。您将需要一个框架来执行此操作,例如像 Flask 这样的框架:
from flask import Flask, request, Response # Initialize the Flask application app = Flask(__name__) @app.route('/api/start_crawler', methods=['POST']) def segmentation_endpoint(): r = request # r is now the request object. You can use it to pass additional info # implement the starting of the crawler here # start flask app app.run(host="0.0.0.0", port=5000)在启动时启动 docker 容器。为此,请在启动实例时添加用户数据,例如:
#!/bin/bash docker run -p 80:<PORT> <image>:<tag>
您现在可以通过调用端点随时启动爬虫。
要在停止时删除实例,您可以从/latest/meta-data/instance-id中获取实例ID。如评论中所述,然后使用 boto3,例如:
# Boto 3
import boto3
ec2 = boto3.resource('ec2')
ec2.instances.filter(InstanceIds=ids).terminate()
