【问题标题】:AWS Boto - Start instance, Deploy Docker Image, Run and TerminateAWS Boto - 启动实例、部署 Docker 映像、运行和终止
【发布时间】:2018-03-19 21:04:58
【问题描述】:

我有一个网络爬虫,它是一个 Docker 映像。我想使用 boto 创建一个 EC2 实例,部署我的爬虫,运行爬虫,然后在它完成后终止实例。

我目前的想法是这样的:

  • 使用包含 Docker 的 AWS 映像启动新的 EC2 实例。
  • 使用诸如 Fabric 之类的东西通过 SSH 连接到实例并安装 Docker 映像。
  • 使用相同的 SSH 连接运行我的命令来启动爬虫
  • 让网络爬虫在完成时删除它自己的实例。

一些细节:

  • 我真的需要使用 Fabric 之类的工具通过 SSH 连接到我的实例并运行命令吗?
  • 如何选择当前正在运行脚本的实例? self 实例,如果你喜欢的话。
  • 有更好的方法吗?

【问题讨论】:

  • 您可以使用 userdata 在 EC2 实例中运行您的脚本。要获取实例 ID,请查询实例元数据 (curl http://169.254.169.254/latest/meta-data/instance-id)。您需要将 IAM 角色附加到具有 ec2:TerminateInstances 权限的 EC2 实例。

标签: python amazon-web-services boto boto3


【解决方案1】:

我的建议是创建一个简单的 HTTP API 并直接调用它。以编程方式进行 SSH-ing 通常很尴尬。这是我会做的:

  1. 实现 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)
    
  2. 在启动时启动 docker 容器。为此,请在启动实例时添加用户数据,例如: #!/bin/bash docker run -p 80:<PORT> <image>:<tag>

您现在可以通过调用端点随时启动爬虫。

要在停止时删除实例,可以从cmets中提到的/latest/meta-data/instance-id获取实例id,然后使用boto3,例如:

# Boto 3
import boto3
ec2 = boto3.resource('ec2')
ec2.instances.filter(InstanceIds=ids).terminate()

【讨论】:

  • 如果我需要始终在实例上托管一个烧瓶应用程序,这意味着我必须为实例支付 24/7 的启动和运行费用。关键是我不想让它一直运行。还是我误解了你在哪里放置烧瓶应用程序?
  • 这里的想法是只使用flask应用程序来启动爬虫(它取代了SSH)。您仍然需要另一台机器来启动 EC2 实例(您可能会使用自己的)。您可以创建一次 EC2 实例,然后将配置导出为 JSON,然后您可以使用 AWS CLI 再次启动相同类型的实例。
猜你喜欢
  • 2015-08-26
  • 2015-03-18
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 2019-08-03
  • 1970-01-01
相关资源
最近更新 更多