AWS S3 バケットからオブジェクトを取得します。
node js にて AWS SDKを利用します。
前提
AWS SDK をインストールして下さい。
npm install @aws-sdk/client-s3
ファイル構成
index.mjs から GetListObject.mjs を呼び出します。
GetListObject.mjs
GetListObject は S3バケットからオブジェクトを取得します。
nodeを使用するので AWS SDK for javascript を使用します。
ListObjectsV2Commandを使用します。
import { S3Client, ListObjectsV2Command} from "@aws-sdk/client-s3";
class GetListObject {
#client;
constructor() {
// S3 クライアントを生成する。
const S3ClientInput = {
region: 'ap-northeast-1',
credentials: {
accessKeyId: 'アクセスキー',
secretAccessKey:'シークレットアクセスキー',
},
}
this.#client = new S3Client(S3ClientInput);
}
async exec(prefix = null, continuationToken = null) {
// S3からオブジェクトを取得する為の、準備を行う。
const input = {
Bucket: 'testdennie01',
Prefix: prefix,
ContinuationToken: continuationToken,
};
const command = new ListObjectsV2Command(input);
// S3からの取得結果を初期化する。
let results = {
result: true,
data: null,
continue: false,
};
// S3からオブジェクトを取得する。
let s3data = {};
try {
s3data = await this.#client.send(command);
} catch (e) {
results.result = false;
return results;
}
// 取得結果(オブジェクト一覧情報)を取得する。
if('Contents' in s3data) {
results.data = s3data.Contents;
} else {
results.result = false;
return results;
}
// オブジェクトが1000件以上存在する場合、以下を行う。
if('IsTruncated' in s3data) {
if(s3data.IsTruncated){
results.continue = true;
results.ContinuationToken = s3data.NextContinuationToken;
}
}
return results;
}
}
export default new GetListObject();
ListObjectsV2Commandは1000件までオブジェクトを取得します。
1000件以上オブジェクトが存在する場合、ListObjectsV2Commandのレスポンスの IsTruncated が true になります。
この場合、NextContinuationToken にトークンが設定されるので、これを使用して再度バケットからオブジェクトを取得しにいくと未取得の箇所からオブジェクトを取得できます。
index.mjs
GetListObjectを呼び出します。未取得のオブジェクトが存在する場合、再度GetListObjectを呼び出します。
import GetListObject from './GetListObject.mjs'
const prefix = null;
let reTryCnt = 0;
let continuationToken = null;
while (reTryCnt <= 2) {
// S3からオブジェクトを取得する。
console.log("S3オブジェクト取得開始" + reTryCnt + "回目。");
let results = await GetListObject.exec(prefix, continuationToken);
console.log("S3オブジェクト取得終了" + reTryCnt + "回目。");
// 実行結果がエラーの場合、もう一度S3からオブジェクトを取得する。
if(!results.result){
console.log('S3のオブジェクト取得に失敗しました。');
reTryCnt++;
continue;
}
// 実行結果が取得できたので、リトライカウントをリセットする。
console.log('S3のオブジェクト取得に成功しました。');
reTryCnt = 0;
// オブジェクトが存在しない場合、S3からオブジェクトの取得をやめる。
if(results.data.length === 0){
console.log('S3のオブジェクトが存在しないので、処理を終了します。');
break;
}
// オブジェクト情報の一覧を表示する。
console.log("取得したオブジェクト情報の一覧を表示します。");
console.log(JSON.stringify(results.data, null, '\ \ '));
// 1000個までオブジェクトを取得できる。
// 全てオブジェクトをした場合、S3からオブジェクトの取得をやめる。
if(!results.continue){
console.log('S3のオブジェクトを全て取得しました。');
break;
}
// 取得していないオブジェクトがある場合、再度、S3からオブジェクトを取得する。
console.log('取得出来ていないS3オブジェクトを取得します。');
continuationToken = results.NextContinuationToken;
}