【问题标题】:Uploading Large HD Video Files to Amazon Web Services S3将大型高清视频文件上传到 Amazon Web Services S3
【发布时间】:2013-10-26 04:15:42
【问题描述】:

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

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    您可以在几乎任何您可以编写的代码中实现前端以使用原生 S3 分段上传...这是我推荐的方法,因为它具有稳定性。

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

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

    不过,您必须牢记的一件事是,分段上传显然从不超时,并且如果它们“从不”最终/完成或被客户端实用程序主动中止,您将支付未完成上传的已上传块的存储费用。因此,您希望实现一个自动化的后端进程,该进程定期调用ListMultipartUploads 来识别和中止那些无论出于何种原因从未完成或取消的上传,并中止它们。

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

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

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

    【讨论】:

      【解决方案2】:

      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 访问密钥和秘密,并将这两项提供给使用 S3Browser 的任何人。

      【讨论】:

        【解决方案3】:

        您可以使用Minio client“mc”。

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

        $ mc mirror localdir/ s3/remotedir
        

        您也可以查看minio-java 库。

        PS:我为该项目做出了贡献,并希望得到您的宝贵反馈和贡献。

        【讨论】:

          猜你喜欢
          • 2013-12-01
          • 2019-10-26
          • 2013-05-19
          • 2016-01-31
          • 1970-01-01
          • 1970-01-01
          • 2023-01-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多