繁体   English   中英

如何使用 lambda function 将文件从 s3 存储桶复制到 ec2 实例?

[英]How do I copy a file from s3 bucket to ec2 instance using lambda function?

我是aws的新手,所以这可能是基本的。 我有一个桶,我将在其中随机上传 mp4 文件。 发生这种情况时,我最终希望将其复制到我已经创建的 ec2 实例中的特定目录中。 一旦复制了这个,我想执行已经在实例中的特定 python 脚本(panorama.py)。 该程序需要视频作为输入,这就是为什么我首先要从存储桶中复制文件的原因。 该程序处理存储在特定目录中的视频并生成其 output(一些图像文件)。 我该如何 go 关于这个?

这是我到目前为止所做的:

  1. 为添加新对象创建了 S3 触发器通知
  2. 创建了一个 lambda function ,当桶接收到新文件时触发。
  3. 将bucket名称和bucket中的文件路径复制到lambda function中的两个变量中。
  4. 在 lambda function 中添加了代码来启动我的实例。
  5. 在运行 py 文件的实例中创建了 shell 脚本。
  6. 修改了用户数据文件以运行此 shell 脚本。

我想知道的是如何在执行 python 文件之前将该特定文件复制到本地目录。 我可以使用一些 ssh 命令或其他东西将文件从 lambda function 本身复制到 ec2 实例吗? 或者我应该在执行 python 程序之前在用户数据中写入命令? 如果是这样,我如何将存储桶的名称和文件路径传递给用户数据? 我在另一个论坛上读到了一些关于 SQS 的内容,但我不知道我究竟是如何做到这一点的。 我可以在实例启动之前复制我的文件吗? 最后,一旦 python 程序的处理完成,我想将 output 文件发送回某个文件夹中的存储桶,然后停止实例。

此外,仅当将 object 添加到存储桶时,实例不需要启动。 我不介意保持实例持续运行。 但是,这意味着我不能使用“用户数据”对吗? 所以我认为这不是一个好的解决方案。 如果也有办法做到这一点,我可以接受

到目前为止,这是我的 lambda function 代码

import boto3
import uuid
from urllib.parse import unquote_plus
import xml.etree.ElementTree as ET

region = '********'
instances = ['*******']
ec2 = boto3.client('ec2', region_name= region)

def lambda_handler(event, context):
    print(f"Received raw event: {event}")
    
    # Bucket Name where file was uploaded
    source_bucket_name = event['Records'][0]['s3']['bucket']['name']

    # Filename of object (with path)
    file_key_name = event['Records'][0]['s3']['object']['key']
    ec2.start_instances(InstanceIds=instances)
    
    
    print('started the instance: ' + str(instances))

我建议从您的 ec2 执行代码以从您的 S3 存储桶中读取,而不是尝试使用 lambda 来执行 SSH/SCP。

流程可能如下所示:

  • Object 击中 S3
  • S3桶事件触发Lambda启动EC2
  • Lambda 还将新对象的完整文件路径写入 S3 中的“new_files.txt”
  • 在 EC2 启动时使用 bash 脚本执行 python 脚本和 boto3 SDK 以编程方式从这个指定的“基于时间戳的路径的新文件.txt”(或任何其他逻辑等)读取此指定的“new_files.txt”(或任何其他逻辑)。

另一种选择是通过 bash 使用 AWS CLI 命令,但这听起来可能更乏味,具体取决于您最熟悉的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM