私はこの問題に直面しています。ユーザーが自分のファイルをAmazonS3のバケットに直接アップロードできるようにしたいと思います。このステップは、説明されているように簡単に実行できます ここ 。
しかし、各ファイルをFFMPEG
で編集する必要がある場合はどうなりますか?
例えば。
Shell_exec('ffmpeg -i /sample.wav -acodec libmp3lame /sample.mp3');
現在、最初にファイルをサーバーに保存し、シェルコマンドを実行してから、putObject
を使用してファイルをS3に送信しますが、サーバーを静かにして、これを実現するためのより良い方法はありますか?
私のスペック:
あなたのソリューションを理解していると、アップロードしたメディアファイルのトランスコーディングも実行する必要があるのと同じubuntuサーバーを使用したいと思うようになります。
問題は、S3に保存されているオブジェクトに通常のファイルシステムのファイルのようにアクセスできないことです。S3からファイルをダウンロードしてWebサーバーインスタンスで処理できますが、これは複雑で非効率的な設定になる可能性があります。
トランスコーディングプロセスをubuntuサーバーから切り離し、真のクラウドスタイルで実行できるようにすることをお勧めします。これに対する最善の解決策は、S3イベントとラムダです。
したがって、ここでのユースケースの理解に基づいて、ソリューションに推奨するものを示します。
インスタンスのUserDataに関して、実行させたい手順は次のとおりです。
すでに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インスタンスで実行する必要がない限り。