Naveen によって概説されているプロセスは正しいですが、zip 内の ffmpeg バイナリを含め、ラムダ関数内でアクセスするなど、かなり面倒な詳細については触れていません。
私はちょうどこれを経験しました、それは次のようになりました:
/dist
圧縮されたラムダ関数パッケージに ffmpeg 静的バイナリを含めます (ビルドするたびにこれをコピーする gulp タスクがあります)。
関数が呼び出されたら、バイナリをディレクトリに移動し、/tmp/
自分chmod
自身にアクセスできるようにします(2017年2月更新:これは不要になったと報告されています、re:@loretoparisi
および@allen
の回答)。
- PATH を更新して、ffmpeg 実行可能ファイルを含めます (私はfluent-ffmpegを使用しました。これにより、 2 つの環境変数を設定して、より簡単に処理できます。
詳細が必要な場合はお知らせください。この回答を更新できます。
コピーと chmod (ステップ 2) は明らかに理想的ではありません....誰かがこれを処理するためのより良い方法を見つけたかどうか、またはこれがこのアーキテクチャ スタイルの典型であるかどうかを知りたいです。
(2回目の更新、最初の更新b / cの前にそれを書くほうがより関連性があります):
@Allen が指摘したように、copy + chmod の手順は不要になりました。この時点では、/var/task/ から直接 Lambda 関数で ffmpeg を実行しています。バイナリを Lambda にアップロードする前に必ず確認してくださいchmod 755
(@Allen が指摘したように)。
私はもう fluent-ffmpeg を使って仕事をしていません。むしろ、PATH を更新して を含め、process.env['LAMBDA_TASK_ROOT']
単純な bash スクリプトを実行しています。
Lambda 関数の上部:
process.env['PATH'] = process.env['PATH'] + "/" + process.env['LAMBDA_TASK_ROOT']
ffmpeg を使用する例: lambda-pngs-to-mp4。
多数の便利なラムダ コンポーネントの場合: lambduh。
以下の更新は後世のために残されましたが、もはや必要ありません:
詳細を更新:
ここで静的 ffmpeg バイナリをダウンロードしました。Amazon では、EC2 を起動してそこで使用するバイナリを構築することをお勧めしています。これは、その環境が Lambda が実行される条件と同じになるためです。おそらく良いアイデアですが、より多くの作業が必要で、この静的ダウンロードがうまくいきました。
プロジェクトのアーカイブ対象フォルダーffmpeg
にバイナリのみをプルしました。/dist
zip をラムダにアップロードすると、.zip に保存され/var/task/
ます。なんらかの理由で、その場所でバイナリを使用しようとするとアクセスの問題が発生し、そこにあるファイルのアクセス許可を編集しようとするとさらに多くの問題が発生しました。簡単な回避策は、バイナリをそこに移動し、そこ/tmp/
にchmod
パーミッションを設定することです。
Node では、シェルを介してchild_process
. 私がしたことは次のようになります。
require('child_process').exec(
'cp /var/task/ffmpeg /tmp/.; chmod 755 /tmp/ffmpeg;',
function (error, stdout, stderr) {
if (error) {
//handle error
} else {
console.log("stdout: " + stdout)
console.log("stderr: " + stderr)
//handle success
}
}
)
これだけで、ラムダ関数で実行可能な ffmpeg バイナリが得られるはずですが、それでも $PATH にあることを確認する必要があります。
私は流暢な ffmpeg を放棄し、ノードを使用して ffmpeg コマンドを起動し、ノードから bash スクリプトを起動するだけにしたので/tmp/
、パスにラムダ関数の先頭に追加する必要がありました。
process.env.PATH = process.env.PATH + ':/tmp/'
fluent-ffmpeg を使用する場合は、次の方法で ffmpeg へのパスを設定できます。
process.env['FFMPEG_PATH'] = '/tmp/ffmpeg';
やや関連/恥知らずなセルフプラグ: 私は、Lambduhという名前で、構成可能なモジュールから Lambda 関数を簡単に構築できるようにする一連のモジュールに取り組んでいます。これらをまとめて時間を節約できます。簡単な例: このシナリオをlambduh-executeで処理するのは、次のように簡単です。
promises.push(execute({
shell: "cp /var/task/ffmpeg /tmp/.; chmod 755 /tmp/ffmpeg",
})
promises
実行する promise の配列はどこにありますか。