こうこく
作 ▸

Node.jsでAmazon S3バケットのファイル一覧を抽出して全ファイルを取得するサンプル

AWSのS3を使うことになりました。リファレンス読んでNode.jsで書いてみました。

※記事タイトル「ファイル」って言ってますが、「オブジェクト」って言うのが正しいんだと思います。

Windows10上でやりました。Node.jsのバージョンは8.10.0です。

前提

アクセスキーの準備が必要です。

以下の記事に書いてあるので、分からない人は読んでみてください。

Node.jsでAmazon SQSをロングポーリングするサンプル - キリウ君が読まないノート

サンプル

サンプルを実行するためにカラのフォルダを作って、npm で aws-sdk をインストールします。

npm install --save-dev aws-sdk

このフォルダの中に以下のソースコードを index.js として設置し、node コマンドで実行します。

実行すると、S3バケット『mybucket』の全ファイルの1行目の内容がコンソールに出力されます。

index.js
'use strict';

const aws = require('aws-sdk');
aws.config.update({	
	region: 'ap-northeast-1',  // ここでは東京リージョンを入力
});
const s3 = new aws.S3();

(async() => {
	// 全てのオブジェクトキーを走査してキーリストを作る
	let keyList = [];
	for (let continuationToken = null;;) {
		// パラメータ作成
		const params = {
			Bucket: 'mybucket',  // バケット名
		};
		if (continuationToken) {
			// 読み込み開始位置 (ContinuationToken) がある場合はパラメータに追加
			params.ContinuationToken = continuationToken;
		}
		
		// オブジェクトのリストを取得
		const res = await s3.listObjectsV2(params).promise();
		
		// オブジェクトキー (Key属性) だけ取り出してキーリストに追加
		res.Contents.map(v => v.Key).forEach(v => {
			keyList.push(v);
		});
		
		// listObjectsV2 が一度に取得できるのは1000件まで
		// リストが切り詰められている場合は IsTruncated がtrueになる
		if (!res.IsTruncated) {
			break;
		}
		
		// 次の読み込み開始位置を保存
		continuationToken = res.NextContinuationToken;
	}
	
	// 全てのオブジェクトを処理
	for (let key of keyList) {
		// オブジェクトを取得
		const res = await s3.getObject({
			Bucket: 'mybucket',
			Key: key
		}).promise();
		
		// ファイル本文 (Buffer) をUTF-8でデコード
		const body = res.Body.toString('utf8');
		
		// 1行目だけコンソールに出力
		console.log(key + ' ->', body.split('\n')[0].trim());
	}
})();

オブジェクト一覧の取得には listObjectsV2() を使いました。listObjects() の方は、次ページの取得方法がよくわからなかったので、使いませんでした。

オブジェクト一覧は一度に1000件までしか取得できないので、このサンプルでは、全ファイルを取得できるようにループ処理してます。

メモ

公式のAWS SDK for JavaScriptリファレンス。

Class: AWS.S3 ― AWS SDK for JavaScript

この記事に何かあればこちらまで (非公開)