5

私の目標は、gzip で圧縮された大きなテキスト ファイルを作成し、S3 に配置することです。

ファイルの内容は、別のソースからループで読み取ったブロックで構成されています。

このファイルのサイズのため、すべてのデータをメモリに保持することはできないため、S3 と ZIP に同時に直接ストリーミングする必要があります。

このトリックを Node.JS の正規で実行する方法は理解してfsいますが、AWS Lambda の S3 で同じトリックを実行できるかどうかについて混乱していますか? s3.putObject を消費できること はわかっていますが、操作streamObjectを実行するときにこのストリームはすでにファイナライズされている必要があるように思われます。これputObjectにより、許可されたメモリを超える可能性があります。

4

1 に答える 1

7

NodeJs aws-sdkのマルチパートアップロード機能を使用して、ファイル (>5mb) をチャンクで S3 バケットにストリーミングできます。

これは、大きなファイルをバケットにストリーミングするのに役立つだけでなく、(ファイル全体ではなく) 失敗したチャンクを再試行し、個々のチャンクのアップロードを並列化することもできます(複数のアップロード ラムダを使用します。これは、サーバーレス ETL セットアップで役立つ可能性があります)。例)。それらを追跡し、すべてがアップロードされたらプロセスを完了する限り、到着する順序は重要ではありません.

マルチパート アップロードを使用するには、次のことを行う必要があります。

  1. を使用してプロセスを初期化しcreateMultipartUpload、返されたものを保存しUploadIdます(チャンクのアップロードに必要です)
  2. 入力ストリームからのデータを処理する変換ストリームを実装する
  3. データを S3 にプッシュするために使用する前に、十分な大きさのチャンクでデータをバッファリングするPassThroughストリームを実装します (ステップ 1 で返された下) 。uploadPartUploadId
  4. 返されたものとチャンクのETagsアップロードPartNumbersからの追跡
  5. 追跡されたものを使用してETagsPartNumbersS3 でファイルをアセンブル/ファイナライズします。completeMultipartUpload

iso.orgからファイルをストリーミングし、gzip を介して S3 バケットにパイプする実際のコード例の要点を次に示します。バケット名を変更し、ノード 6.10 で 512 MB のメモリを使用してラムダを実行することを忘れないでください。外部依存関係がないため、コードを Web GUI で直接使用できます。

: これは、デモンストレーション目的でまとめた概念実証にすぎません。失敗したチャンクのアップロードの再試行ロジックはなく、エラー処理はほとんど存在しないため、文字通りコストがかかる可能性があります (たとえば、プロセス全体をキャンセルしてアップロードされたチャンクabortMultipartUploadをクリーンアップするときに呼び出す必要があります。ファイルはアセンブルされませんでした)。アップロード ジョブをキューに入れたり、バックプレッシャストリーム メカニズムを利用したりする代わりに、入力ストリームが一時停止されています。

于 2017-10-19T14:28:45.927 に答える