Node.js で S3 へファイルアップロード/ダウンロードする方法

0 件のコメント

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

参考記事

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!