Loading
BLOG 開発者ブログ

2022年3月31日

node.jsでS3のファイルをあれこれする

コンソール上でファイルをいじるのではなく、node.jsでS3のファイル操作をする必要があり、
その際にやり方について色々調べたので、その方法について、書き残していきます。

目次

はじめに
動作環境
AWSのロールについて
操作方法
最後に

 

はじめに

こんにちは、クラウドソリューショングループ、takagirです。

クラウド技術が発展して、AWSなどの便利なツールが増えました。S3などを用いて、クラウド上にいろいろなファイルや、必要な素材となる画像やpdfが配置できると、共有が楽ですよね。
ですが、ただコンソールからファイルをいじれるだけでは、ただの保存、共有用のストレージになってしまいます。
そんなクラウドストレージから、プログラムで実際にファイルの読み込みを行って、画面に表示させたり、内容を使用できたら楽だと思いませんか?
今回はAWSのクラウドストレージである、S3内のファイルをnode.jsのプログラムから操作する方法についてまとめていきます。

 

動作環境

動作確認で使用した環境は以下の通りです。
なおローカル環境で実行するため、AWSアクセスキーの発行が必要になります。

$ node –version
v14.15.1
$ npm –version
6.14.8
$ npm info aws-sdk version
2.1103.0

 

AWSのロールについて

本記事で説明する操作ですが、これはあくまで1ユーザーとしてS3を操作するので、そもそもS3を操作する権限がないと、Access deniedされてしまいます。
なので、S3の操作権限があるアカウントを用意する必要があります。
IAMでAmazonS3FullAccessの権限を含むロールを付与したアカウントを用意してください。

またそのアカウントの有効なアクセスキーとシークレットアクセスキーのペアを用意してください。

 

操作方法

ここからはコードを交えながら、説明していきます。
今回紹介する操作は、「アカウント情報の設定」「S3上のファイル一覧確認」「ファイルのアップロード」「ファイルのダウンロード」の4つになります。

1.アカウント情報の設定

まずは情報を設定していきます。

const AWS = require('aws-sdk');
AWS.config.loadFromPath('./rootkey.json');

const AWS = require(‘aws-sdk’);でまずインストールしたaws-sdkを読み込みます。
その後はAWS.config.loadFromPathでAWSのアクセスキーを読み込みます。
今回はrootkey.jsonというファイルにJSON形式でアクセスIDとシークレットキー、S3のリージョンを記載すること方法を想定します。
rootkey.jsonの中はこのようになっています。

{
  "aws_access_key_id": "アクセスキー",
  "aws_secret_access_key": "シークレットアクセスキー"
  "region": "リージョン"
}

パスについてはrootkey.jsonの位置に合わせて変更してください。
またコード内で以下のようにconfig.updateでconfigの内容を更新することも可能です。

AWS.config.update({
  "aws_access_key_id": "アクセスキー",
  "aws_secret_access_key": "シークレットアクセスキー"
  "region": "リージョン"
});

続いてバケットの情報を設定します。
設定する情報としては主にバケット名(bucket)とファイル、またはフォルダ名(key)になります。
これを設定することで、どのバケットのどのファイルやフォルダを探すのかを決めます。

// バケットの情報を設定。
let bucketParams = {
  Bucket : 'BUCKETNAME',
  Key: filePath//必要な場合と必要ない場合がある。
};

ここまでが一通りの設定になります。
なお、アクセス情報がちゃんと設定できているかについては以下のコードで試すことが可能です。

//認証情報が設定できてるか確認
AWS.config.getCredentials(function(err) {
  if (err) {
    console.log("Error");
  }else {
    console.log("Success");
  }
});

2.S3上のファイル一覧確認

それでは次にS3の中身を操作する部分について説明していきます。
まずはバケット内に何があるのかを確認する方法です。

let bucketParams = {
  Bucket : 'BUCKETNAME',
};
let s3 = new AWS.S3();
// バケット内のファイルをリストで全返却
s3.listObjects(bucketParams, function(err, data) {
  if (err) {
    console.log("Error", err);
  } else {
    console.log("Success", data);
  }
});

今回の場合はファイル名(key)を指定する必要はありません。
これで成功した場合は設定したバケット名のバケットの中にあるフォルダ名やファイルすべての名称やパスの情報が取得できます。
これでS3のバケットの中身が確認できました。

3.ファイルのアップロード

では次は、ファイルのアップロードです。

//アップロード
let bucketParams = {
Bucket: "BUCKETNAME",
Key: "test.jpg" //アップロードする名称
};
var file = fs.readFileSync("./test.jpeg");//アップロードしたいファイルの指定
bucketParams.Body = file;
s3.putObject(bucketParams, function(err, data) {
  if (err){
    console.log(err, err.stack);
  }else{
    console.log(data);
  }
});

アップロードでは、bucketParams内で、ファイル名(key)を指定する必要があります。ここで指定した名称で、S3上にアップロードされます。
また、fs.readFileSyncを用いて、アップロードしたいファイルを読み込みます。読み込んだファイルデータはbucketparamsのbody部分に入れて下さい。
ここまでで必要なデータが登録できたので、putObjectを用いてアップロードします。
これで指定したバケットに、keyで指定した名称でファイルがアップロードできます。

4.ファイルのダウンロード

最後はダウンロードです。

// ダウンロード
let bucketParams = {
  Bucket : "BUCKETNAME",
  Key: FILEPATH//ダウンロードしたいファイルのS3上のパス
};
s3.getObject(bucketParams, (err, data) => {
  if (err) {
    console.log(err);
    return;
  }

  var writer = fs.createWriteStream( FILENAME );
  writer.on("finish", () => {
    console.log("success");
  })
      
  writer.write(data.Body);
  writer.end();
});

ダウンロードでは、bucketParams内で、パス(key)を指定する必要があります。ここで指定したパスの位置にあるS3上のファイルをダウンロードします。
その後getObjectを用いてストリーム形式でファイルをダウンロードします。
ダウンロード時のファイル名についてはfs.createWriteStream()内で指定します。

以上が今回紹介するS3の操作になります。

 

最後に

読んでくださりありがとうございました。

クラウド技術を使えると色々なものが楽になりますね。

 

以上で本記事を終わります。

改めて読んでいただいてありがとうございました。

 

watanabe.tのブログ

クラウドソリューショングループ所属

昔はモバイルアプリ開発を、今はGCP, AWS, Firebaseなどのクラウド周りの提案/開発を行っているエンジニアです。

AWS認定ソリューションアーキテクト取得しました!