是否可以直接将file upload到Amazon S3并进行编辑?

我正面临着这个问题,我希望让用户直接上传文件到Amazon S3上的存储桶。 这一步可以像这里所描述的那样轻松完成。

但是如果我需要用FFMPEG编辑每个文件呢?

例如。

 shell_exec('ffmpeg -i /sample.wav -acodec libmp3lame /sample.mp3'); 

目前,我首先将文件存储到我的服务器,运行shell命令,然后使用putObject将它们发送到S3,但有没有更好的方法来完成这一点,让我的服务器安静?

我的规格:

  • 运行Ubuntu 14.04的LAMP安装EC2
  • AWS开发工具包PHP

我对你的解决scheme的理解让我觉得你希望使用你已经有的同样的Ubuntu服务器来执行你上传的媒体文件的转码。

问题是存储在S3中的对象不能像普通文件系统上的文件那样访问,您可以从S3下载文件并在Web服务器实例上处理它,但这将是一个复杂而且可能效率低下的设置。

将代码转换过程从你的Ubuntu服务器中分离出来,让它以真正的云端风格发生,会更好。 最好的解决scheme是S3事件和Lambda。

所以根据我对您的使用案例的理解,我将为您的解决scheme推荐:

  1. 创build一个适当的权限接收文件的桶(最好不要公开或者你的账单可能会相当昂贵)
  2. 当创build/放置/更新对象时,创buildS3事件以触发Lambda(取决于您希望触发的内容以及S3如何放置文件)
  3. 使用lambda来处理您的文件,或让Lambda启动一个具有UserData脚本的实例来完成这项工作。

关于实例的UserData,下面是您可能希望执行的步骤:

  1. 下载ffmpeg
  2. 安装ffmpeg
  3. 从s3下载文件(你可以从lambda传递这个参数)
  4. 使用ffmpeg处理文件
  5. 将file upload到s3
  6. 使用ec2元数据服务来查找实例自己的实例ID
  7. 运行aws cli命令终止提供parsing的实例ID的实例。

创build一个已经安装了ffmpeg的AMI可能会更好,但是您需要决定是花费5分钟还是花费5分钟的时间来对每个实例进行系统化处理或支付AMI以便随时使用。 我会说,除非你的处理时间超过一个小时,或者你的用例需要尽快的返回文件,否则你最好每次安装ffmpeg作为整个AWS账单,即使你只用了15分钟。

这种方法的build议:

当新创build的文件被创build时,您可能希望进行进一步的活动,那么为什么不使用s3事件来启动另一个Lambda进程呢? 🙂

此外,为了保持清洁,如果您的解决scheme允许,请尝试将您创build的file upload到s3,然后将其放在上传文件的不同位置。

备用选项:使用弹性代码转换器

另一种select是使用AWS Elastic Transcoder服务。 您可以通过在更新S3存储桶时触发lambda来以相同的方式将作业发送到代码转换器,并处理该存储桶中的文件。 弹性代码转换器然后可以通知SNS队列,然后可以触发电子邮件或另一个Lambda查询来处理创build的文件。

弹性代码转换器将是一个更酷,可能更好的方法,但它将需要更多的工作。

Elastic Transcoder需要您创build一个pipe道,然后使用该pipe道创build一个作业。 我会链接你的每个JavaScript SDK。

CreatePipline http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ElasticTranscoder.html#createPipeline-property

CreateJob http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ElasticTranscoder.html#createJob-property

替代替代解决scheme:使用Amazon SQS

如果您希望在ubuntu实例上进行处理,而不是从Lambda旋转另一个实例,则可以使用S3事件来触发lambda将作业发布到Amazon SQS。

然后,Amazon SQS将让您自己创build的代理为Amazon SQS轮询作业,然后让作业参考s3中需要转码的文件。 这是相当复杂的,但我只包括它的完整性,除非你真的需要在你已经拥有的Ubuntu实例上执行这个工作。