当前位置: 首页 > 知识库问答 >
问题:

如何使用lambda函数将一个文件从s3 bucket复制到ec2实例?

汪兴为
2023-03-14

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

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

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

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

而且,不要求实例仅在对象添加到bucket时才启动。我也不介意让实例持续运行。然而,这将意味着我不能使用'userdata'对吗?所以我觉得这不是个好办法。如果有办法的话,我也可以这么做

这是到目前为止我的lambda函数代码

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))

共有1个答案

詹联
2023-03-14

我建议执行ec2中的代码来读取S3 bucket中的内容,而不是试图利用lambda来执行SSH/SCP。

流程可能如下所示:

  • 对象命中S3
  • S3 bucket事件触发Lambda启动EC2
  • lambda还将新对象的完整文件路径写入S3中的“new_files.txt”
  • 在EC2启动时使用bash脚本执行带有boto3 SDK的python脚本,以便从指定的“new_files.txt”(或通过基于时间戳等的键路径的任何其他逻辑)读取并以编程方式从S3获取。

另一个选择是通过bash使用AWS CLI命令,但这听起来可能更加乏味,这取决于您最喜欢使用什么。

 类似资料:
  • 我正试图使用我的Mac终端将一个文件从下载(我在线下载的phpMyAdmin)scp到我的Amazon EC2实例。 谁能告诉我如何解决我的问题吗? 附言。有一个类似的帖子:scp(安全副本)到ec2实例没有密码,但它没有回答我的问题。

  • 如何使用java将文件从一个文件夹复制到另一个文件夹?我试图使用 如果目标文件夹不包含具有相同名称的文件,则此操作有效。如果我尝试将文件粘贴到文件夹中,它会引发IOException。然而,有什么办法可以解决这个问题吗?可能我只想将自动重命名为pasteItem(1)或类似名称的文件粘贴。请建议。 事实上,如果同名文件已经存在,我将为该文件获得一个新名称。我不知道如何复制文件,然后重命名。如果我先

  • 问题内容: 我想使用JDBC将数据从文件复制到PostgreSQL DB。我正在使用JDBC语句对象将文件复制到DB中。非常慢。 我知道我们也可以使用copy out命令将文件复制到DB。但是,我该如何使用JDBC。即使是很好的参考资料,如果使用JDBC复制实例,也将有所帮助。 PS:预先感谢 问题答案: 这有效…

  • 问题内容: 说我在目录中还有一个文件。如何替换为使用?我在Windows XP上,跨平台的解决方案会很棒,但是Windows是首选。 问题答案: 您可以使用以下 功能: 在其手册页中引用了几个相关的句子: 将文件源的副本复制到dest。 如果目标文件已经存在,它将被覆盖。

  • 问题内容: 我想将文件从Java中的一个位置复制到另一位置。做这个的最好方式是什么? 这是我到目前为止的内容: 这不会复制文件,执行此操作的最佳方法是什么? 问题答案: 您可以使用此(或任何变体): 另外,我建议您使用或代替使其兼容于多个操作系统. 由于您不确定如何临时存储文件,因此请查看: 要将a 个文件移动到单个目录中:

  • 如何将一个文本文件复制到另一个文本文件中?我试过这个: 这只是在中留下以下值:。 我做错了什么?