今回は「Node.js を使って S3 へ ファイルアップロード、 S3 から ファイルダウンロード する方法」についてまとめます。
目次
- はじめに
- 前準備
- 認証情報の設定
- 環境変数
- アップロード
- ダウンロード
はじめに
今回はNode.jsのネイティブアプリからS3へアップロード/S3からダウンロードする方法を調べたのでその実装方法をまとめておきます。 ローカル開発するときは認証まわりの設定が必ようになる点、アップロードする際はファイルサイズが5GBを超えそうかどうかという点がポイントになります。
前準備
認証情報
アプリをEC2にアップロードする場合はEC2に適切なIAMロールを付与すればOKですが…
開発環境からテストしようと思うとローカルにあらかじめ認証情報ファイル( ~/.aws/credentials
)を置いておく必要があります。
~/.aws/credentials
1 2 3 | [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()
は自動で切り替えてくれるようなので、今回はこのメソッドを使ってアップロードします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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()
)だと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 の フォロー」 お願いします!!