将大型高清视频文件上传到Amazon Web Services S3

时间:2013-10-17 15:17:56

标签: amazon-web-services amazon-s3 amazon-ec2 upload amazon-elastic-transcoder

终极目标:将大型视频文件(< 200MB-3GB)从内容制作者的计算机上传到AWS S3存储桶以使用Elastic Transcoder服务。

  • 内容制作人将是专业用户,因此他们的一些额外工作不是一个巨大的负担。但是,对他们(和我)来说尽可能简单是理想的。如果可以使用Web表单启动,那将是最好的。
  • 不会有数百个内容制作者,因此可以花费额外的时间或精力为每个内容制作者设置某种帐户或流程。虽然自动化是王道。
  • 有人说你可以使用某种Java Applet或Silverlight。
  • 我想到的一件事是使用SFTP首先上传到EC2然后它将被移动到S3。但这听起来像是一种让它变得安全的痛苦。
  • 经过一番研究后,我发现S3允许跨源资源共享。所以这可以允许直接上传到S3。但是,对于大文件来说这有多稳定?
  • 看起来S3也允许多部分上传。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

您可以在几乎所有可以编写代码的前端实现前端S3本段S3上传...由于稳定性,这是我建议的方法。

通过分段上传,“你”(意思是开发人员,而不是最终用户,我建议)选择一个零件尺寸,每个零件至少5MB,文件不能大于10,000“零件”,每个都精确相同的大小(在上传开始时选择的“你”,除了最后一部分,但最后会留下很多字节...所以上传文件的最终大小取决于你选择的部分尺寸。

“part”的大小基本上变成了你的可重启/可重试块大小(win!)...所以你的前端实现可以无限重新发送一个失败的部分,直到它正确通过。部件甚至不必按顺序上传,它们可以并行上传,如果您多次上传相同的部件,则较新的部件将替换较旧的部件,并且对于每个块,S3返回您比较的校验和到你当地计算的。在完成上载之前,该对象在S3中不可见。当你完成上传时,如果S3没有获得所有部分(应该是因为它们在上传时都被确认了),那么finalize调用将失败。

但是,您必须记住的一件事是,多部分上传显然从不超时,如果它们“永远”不是最终确定/完成也不是由客户端实用程序主动中止,您将支付上传的不完整上传块的存储空间。因此,您希望实现一个自动后端流程,该流程定期调用ListMultipartUploads来识别和中止那些因任何原因从未完成或取消的上传,并将其中止。

我不知道这对您的整体问题有何帮助,但开发自定义前端工具应该不是一件复杂的事情 - S3 API非常简单。我可以这么说,因为我开发了一个实用程序来执行此操作(供我内部使用 - 这不是产品插件)。我有一天可能会将其作为开源发布,但它可能不适合您的需求 - 它本质上是一个命令行实用程序,可以由自动/预定进程用于流(“管道”)程序的输出直接进入S3作为一系列多部分(文件很大,所以我的默认部分大小是64MB),当输入流被生成输出的程序关闭时,它会检测到并完成上传。 :)我使用它来传输实时数据库备份,通过压缩程序直接传输到S3,因为它们生成,而不需要任何硬盘驱动器上的任何地方存在这些大量文件。

在我看来,您希望为您的客户提供顺畅的体验,并高度赞扬S3多部分角色,如果您知道如何在任何中编码,可以生成桌面或浏览器 - 基于用户界面,可以读取本地桌面文件系统,并具有用于HTTP和SHA / HMAC的库,然后您可以编写一个客户端来执行此操作,其外观和感觉完全符合您的需要。

您不需要在AWS中为每个客户端手动设置任何内容,只要您有一个后端系统为您验证客户端实用程序,可能是通过SSL连接发送到的用户名和密码。应用程序在Web服务器上,然后为客户端实用程序提供客户端实用程序可用于上载的自动生成的临时AWS凭据。

答案 1 :(得分:1)

S3Browser之类的东西可行。它有一个GUI,一个命令行,可以处理大文件。您可以使用IAM创建组,使用策略授予该组对特定S3存储桶的访问权限,然后将IAM用户添加到该组。

您的IAM组策略如下所示:

{
    "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion",
        "s3:GetObject",
        "s3:GetObjectAcl",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionAcl",
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:PutObjectAclVersion"
      ],
      "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*",
      "Condition": {}
    }
  ]
}

将IAM用户添加到此组将允许他们使用S3Browser并且只具有对YOUR_BUCKET_NAME的读写权限。但是,他们会看到您的其他存储桶的列表,只是无法读取/写入它们。您还需要为每个IAM用户生成AWS Access Key和Secret,并将这两个项目提供给使用S3Browser的用户。

答案 2 :(得分:1)

您可以使用Minio client“mc”。

您可以使用简单命令将本地文件夹镜像到S3存储桶。在cron上添加它可以自动执行从本地到远程S3 buck的同步。

$ mc mirror localdir/ s3/remotedir

或者,您可以查看minio-java库。

PS:我为该项目做出贡献&我很乐意得到你宝贵的反馈意见贡献。