今回は「Node.js を使って S3 へ ファイルアップロード、 S3 から ファイルダウンロード する方法」についてまとめます。
目次
- はじめに
- 前準備
- 認証情報の設定
- 環境変数
- アップロード
- ダウンロード
はじめに
今回はNode.jsのネイティブアプリからS3へアップロード/S3からダウンロードする方法を調べたのでその実装方法をまとめておきます。 ローカル開発するときは認証まわりの設定が必ようになる点、アップロードする際はファイルサイズが5GBを超えそうかどうかという点がポイントになります。
前準備
認証情報
アプリをEC2にアップロードする場合はEC2に適切なIAMロールを付与すればOKですが…
開発環境からテストしようと思うとローカルにあらかじめ認証情報ファイル( ~/.aws/credentials )を置いておく必要があります。
~/.aws/credentials
[default] aws_access_key_id = <YOUR_ACCESS_KEY_ID> aws_secret_access_key = <YOUR_SECRET_ACCESS_KEY>
もし複数プロファイルを指定する場合、環境変数 AWS_PROFILE にどのプロファイルを利用するかを設定してあげます。
環境変数
今回は以下の環境変数を設定して実行します。 コード見ればわかりますが一応まとめておきます。
S3_BUCKET_NAMES3_BUCKET_KEY_PREFIX
アップロード
S3は「1ファイル5TBまで」、「1度のPUT処理が5GBまで」という制限があるので、5GBを超えるときは分割アップロードするような処理に変える必要があります。
S3.upload() は自動で切り替えてくれるようなので、今回はこのメソッドを使ってアップロードします。
const fs = require("fs");
const path = require("path");
const AWS = require("aws-sdk");
AWS.config.update({ region: "ap-northeast-1" });
var s3 = new AWS.S3();
// S3へファイルアップロード
// 自動でマルチパートアップロードもやってくれる
// https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#upload-property
s3.upload({
Bucket: process.env.S3_BUCKET_NAME,
Key: path.posix.join(process.env.S3_BUCKET_KEY_PREFIX, "sample.png"),
Body: fs.createReadStream(path.join(__dirname, "./sample.png")),
ContentType: "image/png"
}, {
partSize: 100 * 1024 * 1024,
queueSize: 4
}, (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(JSON.stringify(data));
});
ダウンロード
ダウンロードはそのまま受け取る実装になっています(=大きなファイルはその分メモリーを消費する)。。。
丁寧にやるならファイルサイズ取得( headObject() )して分割ダウンロード( getObject() )だと思います。
const fs = require("fs");
const path = require("path");
const AWS = require("aws-sdk");
AWS.config.update({ region: "ap-northeast-1" });
var s3 = new AWS.S3();
// ファイルダウンロード
s3.getObject({
Bucket: process.env.S3_BUCKET_NAME,
Key: path.posix.join(process.env.S3_BUCKET_KEY_PREFIX, "sample.png"),
}, (err, data) => {
if (err) {
console.log(err);
return;
}
var writer = fs.createWriteStream(path.join(__dirname, "donwloaded.png"));
writer.on("finish", () => {
console.log("success");
})
writer.write(data.Body);
writer.end();
});
今回は「Node.js を使って S3 へ ファイルアップロード する方法」についてまとめました。 参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!
参考記事
- AWS - 共有認証情報ファイルから Node.js に認証情報をロードする
- Class List - upload(params = {}, [options], [callback]) ⇒ AWS.S3.ManagedUpload
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!