Storj DCSのS3互換のサービスを使用してデータを扱ってみる – AWS SDK –

2022.04.27

前回の記事で、AWS CLIを利用したStorj DCSのS3互換のサービス(GatewayMT)にアクセスし、Storj DCSに対する操作(アップロードやファイルリスト)を試してみました。

今回はAWS CLIではなく、AWS SDKを使ってStorj DCSに対する操作を行ってみます。

準備

こちらのAWS公式ドキュメントに記載されているシナリオをベースにしていきます。

上記のシナリオはNode.jsコード例なので、Node.jsをインストールをしておきます。

S3 Gateway credentialsの作成

前回の記事でも記載していましたが、StorjでホストされているGatewayMTを使用するためのcredentialを作成する必要があります。

公式Doc

aws-sdkのインストール

npm install --save aws-sdk

試してみる

ライブラリを読み込んで

import S3 from "aws-sdk/clients/s3";

MTクレデンシャルを使用してクライアントオブジェクトを作成する必要があります。

const s3 = new S3({
  accessKeyId,
  secretAccessKey,
  endpoint,
  s3ForcePathStyle: true,
  signatureVersion: "v4",
  connectTimeout: 0,
  httpOptions: { timeout: 0 }
});

accessKeyId, secretAccessKey, endpoint がS3 Gateway credentialsを作成したときに払い出された内容になります。

アクセスキーとシークレットキーを共有認証情報ファイル(~/.aws/credentials / C:\Users\USER_NAME\.aws\credentials) に保存している場合、 以下のように認証情報をロードすることも可能です。

var AWS = require('aws-sdk');
var credentials = new AWS.SharedIniFileCredentials({profile: '<保存したプロファイル名>>'});
AWS.config.credentials = credentials;

const accessKeyId = AWS.config.credentials.accessKeyId
const secretAccessKey = AWS.config.credentials.secretAccessKey

const s3 = new AWS.S3({
    accessKeyId,
    secretAccessKey,
    endpoint,
    s3ForcePathStyle: true,
    signatureVersion: "v4",
    connectTimeout: 0,
    httpOptions: { timeout: 0 }
});

共有認証情報ファイルから Node.js に認証情報をロードする

バケットのリストを表示

Amazon S3サービスオブジェクトの listBuckets メソッドを呼び出して、バケットのリストを取得します。 コード自体は、AWSのドキュメントに書かれていたものをそのまま使ってみます。

s3.listBuckets(function(err, data) {
  if (err) {
    console.log("Error", err);
  } else {
    console.log("Success", data.Buckets);
  }
});

このコードを実行すると、

$ node script.js
Success [
  { Name: 'demo-bucket', CreationDate: 2022-04-22T04:32:48.327Z },
  { Name: 'mr-bucket', CreationDate: 2022-04-22T04:52:28.931Z }
]

といったように、バケットのリストが返ってきます。

バケットの作成

Amazon S3サービスオブジェクトのcreateBucket メソッドを呼び出して、バケットを新規作成します。

同じようにコード自体は、AWSのドキュメントに書かれていたものをそのまま使ってみます。

var bucketParams = {
  Bucket : 'New Bucket name'
};

s3.createBucket(bucketParams, function(err, data) {
  if (err) {
    console.log("Error", err);
  } else {
    console.log("Success", data.Location);
  }
});

このコードを実行すると、

$ node script.js
Success /sdk-bucket

といった感じで作成されたバケットが返ってきました。

バケットのリストを表示で書いたコードを実行したらリストに一つ増えているはずです。

ファイルのアップロード

Amazon S3サービスオブジェクトのupload メソッドを呼び出して、クライアントPCにあるファイルをアップロードしてみます。

同じくコード自体は、AWSのドキュメントに書かれていたものをそのまま使ってみます。

var uploadParams = {Bucket: '<<バケット名>>', Key: '', Body: ''};
var file = '<<アップロードファイルのパス>>';

var fs = require('fs');
var fileStream = fs.createReadStream(file);
fileStream.on('error', function(err) {
  console.log('File Error', err);
});
uploadParams.Body = fileStream;
var path = require('path');
uploadParams.Key = path.basename(file);

// call S3 to retrieve upload file to specified bucket
s3.upload (uploadParams, function (err, data) {
  if (err) {
    console.log("Error", err);
  } if (data) {
    console.log("Upload Success", data.Location);
  }
});

このコードを実行すると、

$ node script.js               
Upload Success https://PATH

アップロード後のURLが返ってきます。

Storjのコンソールを確認してみると

アップロードしたファイルがあることがわかります。

オブジェクトを一覧表示

Amazon S3 サービスオブジェクトの listObjects メソッドを呼び出して、オブジェクト (ファイル) のリストを表示させます。

同じくコード自体は、AWSのドキュメントに書かれていたものをそのまま使ってみます。

var bucketParams = {
  Bucket : 'BUCKET_NAME',
};

// Call S3 to obtain a list of the objects in the bucket
s3.listObjects(bucketParams, function(err, data) {
  if (err) {
    console.log("Error", err);
  } else {
    console.log("Success", data);
  }
});

このコードを実行すると、

$ node script.js
Success {
  IsTruncated: false,
  Marker: '',
  Contents: [
    {
      Key: 'stroj-logo.png',
      LastModified: 2022-04-27T01:55:23.470Z,
      ETag: '"ad764deae2157c77a431c86d3eee0508"',
      ChecksumAlgorithm: [],
      Size: 19530,
      StorageClass: 'STANDARD',
      Owner: [Object]
    }
  ],
  Name: 'sdk-bucket',
  Prefix: '',
  Delimiter: '',
  MaxKeys: 1000,
  CommonPrefixes: []
}

といったようなオブジェクトのリストが返ってきます

オブジェクトの削除

Amazon S3 サービスオブジェクトの deleteObject メソッドを呼び出して、オブジェクト (ファイル) を削除してみます。

var bucketParams = {
  Bucket : 'BUCKET_NAME',
  Key:'OBJECT_KEY'
};

s3.deleteObject(bucketParams, function(err, data) {
  if (err) {
    console.log("Error", err);
  } else {
    console.log("Success", data);
  }
});

このコードを実行すると、

$ node script.js
Success {}

空のデータが返ってきます(削除成功)

バケットの削除

Amazon S3 サービスオブジェクトの deleteBucket メソッドを呼び出して作成したバケットを削除してみます。

同じくコード自体は、AWSのドキュメントに書かれていたものをそのまま使ってみます。

var bucketParams = {
  Bucket : 'BUCKET_NAME'
};

// Call S3 to delete the bucket
s3.deleteBucket(bucketParams, function(err, data) {
  if (err) {
    console.log("Error", err);
  } else {
    console.log("Success", data);
  }
});

このコードを実行すると、

$ node script.js
Success {}

空のデータが返ってきます(削除成功)

ちなみにバケットにオブジェクトがある状態で削除を行うと、S3と同じくエラーとなります。

node script.js
Error BucketNotEmpty: The bucket you tried to delete is not empty
~~~
~~~
~~~

S3互換のゲートウェイサービスを利用することで、S3を扱っていたコードをあまり変更せずそのまま使えるので、ストレージの移転をする必要がある といった時には役に立つかと思います。

参考

Quickstart - AWS SDK and Hosted Gateway MT