上传时启动 AWS 实例

Launch AWS instance on upload

我想在一个小型 AWS 实例(例如 t2.micro)上托管一个网站,每当用户上传要处理的数据时,该实例就会启动一个较大的实例(例如 m5.2xlarge)。我还希望较大的实例在处理完成后关闭。是否有 AWS 服务或其他解决方法可以做到这一点?较大的实例只会每隔几天触发一次。

在完成任务后停止实例的最简单方法是向操作系统发出shutdown命令。默认行为是停止 EC2 实例。

启动 实例的最简单方法是通过命令行或 SDK 调用 StartInstances() 命令。棘手的部分是告诉实例应该处理哪些数据。此外,考虑如果在处理第一个文件时上传另一个数据文件会发生什么情况——它应该关闭,还是应该处理新文件?

我会推荐:

  • 如果文件上传到 S3,则使用 AWS Lambda 函数启动较大的实例(不需要较小的实例)
  • 如果文件上传到较小的实例,则该实例应该:
    • 将消息推送到包含要处理的数据的 Amazon SQS 队列(或将文件复制到 S3,然后让消息指向 S3 中的对象)
    • 调用StartInstances()启动更大的实例
  • 然后较大的实例应该进入一个循环,它将:
    • 从 Amazon SQS 队列中检索消息
    • 处理数据
  • 如果SQS队列为空,则通过操作系统关闭实例

参见:Auto-Stop EC2 instances when they finish a task - DEV

您还可以在启动期间将实例指向正确的 S3 存储桶。只需为 UserData 参数提供一个脚本:

# Point to bucket.
parent = 'my-awesome-s3-bucket'
startup_script = '''#!/bin/bash
bucket=<PARENT_NAME>
aws s3 cp s3://$bucket /home/ubuntu --recursive
'''
startup_script = startup_script.replace('<PARENT_NAME>', parent)

# Launch instance.
try:    
    response = ec2.run_instances(
        InstanceType='m4.2xlarge',
        KeyName='aws3',
        SecurityGroups=['launch-wizard-12'],
        MinCount=1,
        MaxCount=1,
        UserData=startup_script
    )