今回は「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_NAME
S3_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 へ ファイルアップロード する方法」についてまとめました。 参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!
参考記事