web-dev-qa-db-ja.com

ファイルをAmazonS3に直接アップロードして編集することは可能ですか?

私はこの問題に直面しています。ユーザーが自分のファイルをAmazonS3のバケットに直接アップロードできるようにしたいと思います。このステップは、説明されているように簡単に実行できます ここ

しかし、各ファイルをFFMPEGで編集する必要がある場合はどうなりますか?

例えば。

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

現在、最初にファイルをサーバーに保存し、シェルコマンドを実行してから、putObjectを使用してファイルをS3に送信しますが、サーバーを静かにして、これを実現するためのより良い方法はありますか?

私のスペック:

  • Ubuntu14.04を実行しているLAMPインストールを備えたEC2
  • AWS SDK PHP
2
NineCattoRules

あなたのソリューションを理解していると、アップロードしたメディアファイルのトランスコーディングも実行する必要があるのと同じubuntuサーバーを使用したいと思うようになります。

問題は、S3に保存されているオブジェクトに通常のファイルシステムのファイルのようにアクセスできないことです。S3からファイルをダウンロードしてWebサーバーインスタンスで処理できますが、これは複雑で非効率的な設定になる可能性があります。

トランスコーディングプロセスをubu​​ntuサーバーから切り離し、真のクラウドスタイルで実行できるようにすることをお勧めします。これに対する最善の解決策は、S3イベントとラムダです。

したがって、ここでのユースケースの理解に基づいて、ソリューションに推奨するものを示します。

  1. ファイルを受信するための適切な権限を持つバケットを作成します(これを公開しないことをお勧めします。公開しないと、請求額が非常に高くなる可能性があります)
  2. オブジェクトが作成/配置/更新されたときにLambdaをトリガーするS3イベントを作成します(トリガーする対象とファイルがS3に配置される方法によって異なります)
  3. Lambdaを使用してファイルを処理するか、Lambdaに作業を実行するUserDataスクリプトを持つインスタンスを開始させます。

インスタンスのUserDataに関して、実行させたい手順は次のとおりです。

  1. ffmpegをダウンロード
  2. ffmpegをインストールします
  3. s3からファイルをダウンロードします(ラムダからこの引数を渡すことができます)
  4. ffmpegを使用してファイルを処理します
  5. ファイルをs3にアップロードします
  6. ec2メタデータサービスを使用して、インスタンス自体のインスタンスIDを検索します
  7. 解決されたインスタンスIDを指定してインスタンスを終了するには、awscliコマンドを実行します。

すでにffmpegがインストールされているAMIを作成する方が良いかもしれませんが、各インスタンスのsysprepを5分費やすのが安いのか、AMIを常に手元に置いておくのにお金を払うのが安いのかを判断する必要があります。処理に1時間以上かかる場合や、ユースケースでファイルをできるだけ早く返送する必要がある場合を除いて、15分しか使用しない場合でも、AWSが1時間請求するため、毎回ffmpegをインストールすることをお勧めします。

このアプローチの推奨事項:

新しく処理されたファイルが作成されたときに、さらにアクティビティを実行したい場合があるので、s3イベントを使用して別のLambdaプロセスを起動してみませんか? :)

また、物事をきれいに保つために、ソリューションで許可されている場合は、アップロードしたファイルを配置する場所とは異なるキーパスの下で、作成したファイルをs3にアップロードしてみてください。

代替オプション:Elastic Transcoderを使用

別のオプションは、AWS ElasticTranscoderサービスを利用することです。 S3バケットが更新されたときにラムダをトリガーし、そのバケット内のファイルを処理させることで、同じ方法でジョブをトランスコーダーに送信します。その後、Elastic TranscoderはSNSキューに通知し、SNSキューは、作成されたファイルを処理するために電子メールまたは別のLambdaクエリをトリガーできます。

Elastic Transcoderはよりクールで、おそらくより良いアプローチですが、もう少し作業が必要になります。

Elastic Transcoderでは、パイプラインを作成してから、そのパイプラインを使用してジョブを作成する必要があります。それぞれのJavaScriptSDKをリンクします。

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

別の代替ソリューション:Amazon SQSを使用する

Lambdaから別のインスタンスを起動するのではなく、ubuntuインスタンスで処理を実行する場合は、S3イベントを使用してラムダをトリガーし、AmazonSQSにジョブを公開できます。

次に、Amazon SQSは、独自に作成したエージェントがAmazon SQSにジョブをポーリングさせ、トランスコーディングが必要なs3内のファイルを参照できるようにします。ただし、これはかなり複雑であり、完全を期すためにのみ含めています。実際にこの作業を既に持っているubuntuインスタンスで実行する必要がない限り。

1