是否可以將文件直接上傳到 Amazon S3 並進行編輯?
我正面臨這個問題,我希望讓使用者將他們的文件直接上傳到我在 Amazon S3 上的儲存桶中。這一步可以很容易地完成,就像這裡描述的那樣。
但是如果我需要用 編輯每個文件
FFMPEG
怎麼辦?例如。
shell_exec('ffmpeg -i /sample.wav -acodec libmp3lame /sample.mp3');
目前我首先將文件儲存到我的伺服器,執行 shell 命令,然後我
putObject
將它們發送到 S3,但是有沒有更好的方法來完成這個,讓我的伺服器保持安靜?我的規格:
- EC2 與 LAMP 安裝執行 Ubuntu 14.04
- AWS 開發工具包 PHP
我對您的解決方案的理解使我認為您希望使用相同的 ubuntu 伺服器來執行上傳的媒體文件的轉碼。
問題是儲存在 S3 中的對象無法像普通文件系統上的文件那樣訪問,您可以從 S3 下載文件並在 Web 伺服器實例上處理它,但這將是一個複雜且可能效率低下的設置。
最好將轉碼過程與您的 ubuntu 伺服器分離,讓它以真正的雲方式發生。最好的解決方案是 S3 事件和 Lambda。
因此,根據我對您的案例的理解,我會為您的解決方案推薦以下內容:
- 創建一個具有適當權限的儲存桶以接收文件(最好不要公開,否則您的賬單可能會變得非常昂貴)
- 創建 S3 事件以在創建/放置/更新對象時觸發 Lambda(取決於您希望觸發的內容以及文件在 S3 上的放置方式)
- 使用 lambda 處理您的文件,或者讓 Lambda 啟動一個實例,該實例具有一個將完成工作的 UserData 腳本。
關於實例的 UserData,您可能希望它執行以下步驟:
- 下載 ffmpeg
- 安裝ffmpeg
- 從 s3 下載文件(你可以從 lambda 傳遞這個參數)
- 使用 ffmpeg 處理文件
- 將文件上傳到s3
- 使用 ec2 元數據服務查找實例自己的實例 ID
- 執行 aws cli 命令以終止提供已解析實例 ID 的實例。
您最好創建一個已經安裝了 ffmpeg 的 AMI,但您需要決定花 5 分鐘系統準備每個實例或支付 AMI 以使其始終可用是否更便宜。我想說的是,除非您的處理時間超過一個小時,或者您的案例需要盡快返回文件,否則您最好每次安裝 ffmpeg,因為 AWS 會按整小時計費,即使您只使用 15 分鐘。
對這種方法的建議:
您可能希望在創建新處理的文件時進行進一步的活動,那麼為什麼不使用 s3 事件來觸發另一個 Lambda 程序呢?:)
此外,為了幫助保持清潔,如果您的解決方案允許,請嘗試將您創建的文件上傳到 s3 下的不同密鑰路徑下,以放置上傳的文件。
備用選項:使用 Elastic Transcoder
另一種選擇是使用 AWS Elastic Transcoder 服務。您可以通過在更新 S3 儲存桶時觸發 lambda 並讓它處理該儲存桶中的文件,以相同的方式將作業發送到轉碼器。然後,Elastic Transcoder 可以通知 SNS 隊列,然後該隊列可以觸發電子郵件或另一個 Lambda 查詢來處理創建的文件。
Elastic Transcoder 將是一種更酷且可能更好的方法,但它需要更多的工作。
Elastic Transcoder 要求您創建一個管道,然後使用該管道創建一個作業。我將為您連結每個 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
另一種替代解決方案:使用 Amazon SQS
如果您希望在 ubuntu 實例上進行處理,而不是從 Lambda 啟動另一個實例,您可以使用 S3 事件觸發 lambda 以將作業發佈到 Amazon SQS。
然後,Amazon SQS 將讓您自己創建的代理輪詢 Amazon SQS 的作業,然後您可以參考 s3 中需要轉碼的文件。不過這相當複雜,我只是為了完整性而包含它,除非你真的需要在你已經擁有的 ubuntu 實例上執行這項工作。