1. ホーム
  2. node.js

[解決済み] s3.upload()にストリームをパイプする

2022-07-21 23:55:07

質問

現在、node.jsのプラグインである s3-アップロードストリーム という node.js プラグインを使用して、非常に大きなファイルを Amazon S3 にストリーミングしています。これは、マルチパート API を使用し、ほとんどの場合、非常にうまく動作します。

しかし、このモジュールは古くなってきており、私はすでに修正を加えなければなりませんでした (作者はこのモジュールを非推奨としました)。 今日、私は Amazon で別の問題にぶつかり、著者の推奨に従って、私のアップロードを達成するために公式の aws-sdk を使用し始めたいと思います。

BUT。

へのパイピングは公式SDKではサポートされていないようです。 s3.upload() . s3.uploadの性質上、S3コンストラクタの引数として読み込み可能なストリームを渡さなければなりません。

私は、さまざまなファイル処理を行うおよそ120以上のユーザーコードモジュールを持っており、それらの出力の最終的な宛先については不可知論者である。エンジンは彼らにパイプ可能な書き込み可能な出力ストリームを渡し、彼らはそれにパイプします。 私は彼らに AWS.S3 オブジェクトを渡して upload() を呼び出すように依頼します。 私が使った理由は s3-upload-stream を使ったのは、それがパイピングをサポートしていたからです。

aws-sdkを s3.upload() にストリームをパイプできるような方法はありますか?

どのように解決するのですか?

S3をラップする upload() 関数をnode.jsの stream.PassThrough() ストリームを使用します。

以下はその例です。

inputStream
  .pipe(uploadFromStream(s3));

function uploadFromStream(s3) {
  var pass = new stream.PassThrough();

  var params = {Bucket: BUCKET, Key: KEY, Body: pass};
  s3.upload(params, function(err, data) {
    console.log(err, data);
  });

  return pass;
}