Node.js で大容量ファイルを効率的にアップロード | s3-upload-stream を活用
Node.js で Amazon S3 にストリームをパイプする方法
Node.js と AWS SDK を使って、ストリームを直接 Amazon S3 バケットへアップロードする方法について解説します。この方法は、大容量ファイルのアップロードに特に有効で、メモリ使用量を抑え、処理を効率化することができます。
手順
- 必要なライブラリのインストール
npm install aws-sdk s3-upload-stream
- S3 バケットの設定
const AWS = require('aws-sdk');
const S3 = new AWS.S3({
region: 'YOUR_REGION', // S3 バケット所在的リージョン
accessKeyId: 'YOUR_ACCESS_KEY_ID', // AWS アクセスキー ID
secretAccessKey: 'YOUR_SECRET_ACCESS_KEY' // AWS 秘密アクセスキー
});
- ストリームの作成
アップロードするファイルのストリームを作成します。これは、fs.createReadStream()
や他のストリームソースを使用することができます。
const fs = require('fs');
const stream = fs.createReadStream('YOUR_FILE_PATH');
- S3 アップロードの設定
S3 アップロードに必要なパラメータを設定します。
const params = {
Bucket: 'YOUR_BUCKET_NAME', // アップロード先の S3 バケット名
Key: 'YOUR_FILE_KEY', // S3 オブジェクトキー
Body: stream // アップロードするストリーム
};
- ストリームを S3 にパイプする
s3-upload-stream
ライブラリを使用して、ストリームを S3 に直接パイプします。
const s3UploadStream = require('s3-upload-stream');
const upload = s3UploadStream(S3);
upload(params, (err, data) => {
if (err) {
console.error(err);
return;
}
console.log('ファイルがアップロードされました:', data.Location);
});
補足
- エラー処理とプログレスバーの追加を検討しましょう。
- 複数のパートに分けてアップロードする必要がある大容量ファイルの場合は、
multipart
オプションを使用することができます。 - この方法は、Node.js 8 以降でのみ動作します。
上記以外にも、Node.js で Amazon S3 にファイルをアップロードする方法があります。ご自身のニーズに合った方法を選択してください。
Node.js で Amazon S3 にストリームをパイプするサンプルコード
const AWS = require('aws-sdk');
const S3 = new AWS.S3({
region: 'YOUR_REGION', // S3 バケット所在的リージョン
accessKeyId: 'YOUR_ACCESS_KEY_ID', // AWS アクセスキー ID
secretAccessKey: 'YOUR_SECRET_ACCESS_KEY' // AWS 秘密アクセスキー
});
const fs = require('fs');
const s3UploadStream = require('s3-upload-stream');
const upload = s3UploadStream(S3);
const filePath = 'YOUR_LOCAL_FILE_PATH'; // アップロードするローカルファイルパス
const bucketName = 'YOUR_S3_BUCKET_NAME'; // S3 バケット名
const objectKey = 'YOUR_S3_OBJECT_KEY'; // S3 オブジェクトキー
const params = {
Bucket: bucketName,
Key: objectKey,
Body: fs.createReadStream(filePath)
};
upload(params, (err, data) => {
if (err) {
console.error(err);
return;
}
console.log('ファイルがアップロードされました:', data.Location);
});
説明
- 最初に、必要なライブラリをインポートします。
- S3 クライアントを作成するために、
AWS.S3
クラスをインスタンス化します。 - アップロードするローカルファイルのパス、S3 バケット名、S3 オブジェクトキーを定義します。
fs.createReadStream()
を使用して、アップロードするファイルのストリームを作成します。s3UploadStream
ライブラリを使用して、S3 アップロード用のストリームを作成します。upload()
メソッドを使用して、ストリームを S3 にアップロードします。- アップロードが成功すると、
data.Location
にアップロードされたファイルの URL が含まれます。
- このサンプルコードはあくまでも基本的な例です。ご自身のニーズに合わせて変更する必要があります。
Node.js で Amazon S3 にストリームをアップロードするその他の方法
AWS SDK には、S3.upload()
メソッドが用意されており、ストリームを含む様々なデータソースからオブジェクトをアップロードすることができます。
const AWS = require('aws-sdk');
const S3 = new AWS.S3({
region: 'YOUR_REGION',
accessKeyId: 'YOUR_ACCESS_KEY_ID',
secretAccessKey: 'YOUR_SECRET_ACCESS_KEY'
});
const stream = fs.createReadStream('YOUR_LOCAL_FILE_PATH');
const params = {
Bucket: 'YOUR_S3_BUCKET_NAME',
Key: 'YOUR_S3_OBJECT_KEY',
Body: stream
};
S3.upload(params, (err, data) => {
if (err) {
console.error(err);
return;
}
console.log('ファイルがアップロードされました:', data.Location);
});
multer ライブラリを使用する
multer
は、Node.js でマルチパートデータの処理を容易にするライブラリです。 ストリーミングアップロードを含む、様々な種類のファイルアップロードをサポートしています。
const multer = require('multer');
const upload = multer({ dest: '/tmp/' });
const AWS = require('aws-sdk');
const S3 = new AWS.S3({
region: 'YOUR_REGION',
accessKeyId: 'YOUR_ACCESS_KEY_ID',
secretAccessKey: 'YOUR_SECRET_ACCESS_KEY'
});
app.post('/upload', upload.single('file'), (req, res, next) => {
const file = req.file;
const stream = fs.createReadStream(file.path);
const params = {
Bucket: 'YOUR_S3_BUCKET_NAME',
Key: file.originalname,
Body: stream
};
S3.upload(params, (err, data) => {
if (err) {
console.error(err);
return next(err);
}
fs.unlink(file.path, (err) => {
if (err) {
console.error(err);
return next(err);
}
res.json({ message: 'ファイルがアップロードされました:', location: data.Location });
});
});
});
const busboy = require('busboy');
const AWS = require('aws-sdk');
const S3 = new AWS.S3({
region: 'YOUR_REGION',
accessKeyId: 'YOUR_ACCESS_KEY_ID',
secretAccessKey: 'YOUR_SECRET_ACCESS_KEY'
});
const bb = busboy();
bb.on('file', (fieldname, stream, filename) => {
const params = {
Bucket: 'YOUR_S3_BUCKET_NAME',
Key: filename,
Body: stream
};
S3.upload(params, (err, data) => {
if (err) {
console.error(err);
return;
}
console.log('ファイルがアップロードされました:', data.Location);
});
});
req.pipe(bb);
各方法の比較
方法 | メリット | デメリット |
---|---|---|
s3-upload-stream | シンプルで使いやすい | 大容量ファイルのアップロードには非効率的である可能性がある |
AWS SDK S3.upload() | 汎用性が高い | マルチパートアップロードを明示的に処理する必要がある |
multer | マルチパートデータの処理に最適 | 設定が複雑になる可能性がある |
busboy | 低レベルな制御が可能 | 学習曲線がやや高い |
どの方法が最適かは、プロジェクトの要件と開発者の好み
node.js amazon-web-services amazon-s3