node.jsでaws s3のデータを読み書きする

aws-sdkパッケージを使います。以下のコマンドでインストールします。

npm i aws-sdk

このドキュメントは https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html で見ることができます。適宜参照しましょう。

また、別途S3の読み書き権限のあるアクセスキー(とシークレットキー)を発行しておきます。

準備が終わったら、以下のように書き始めます。今後s3オブジェクトを操作することになります。

const aws = require("aws-sdk");

const S3_ACCESS_KEY = '...';
const S3_SECRET_KEY = '...';

const s3 = new aws.S3({
  apiVersion: '2006-03-01',
  accessKeyId: S3_ACCESS_KEY,
  secretAccessKey: S3_SECRET_KEY,
});

オブジェクトを列挙するための関数を作ってみます。

const listObjects = params => new Promise((resolve, reject) => {
  s3.listObjectsV2(params, (err, data) => {
    if (err) reject(err);
    else resolve(data.Contents);
  });
});

以下のようにすれば、'some-bucket'バケット内のオブジェクトを3つ列挙してくれます。並び順は辞書順のはずです。

listObjects({
  Bucket: 'some-bucket',
  MaxKeys: 3,
})
  .then((objectList) => {
    // 何らかの処理
  });

ここで、objectListはETag, Key, LastModified, Sizeなどをキーとして持つオブジェクトの配列です。

次に、バケット名・キー名からファイルを読み出す関数を作ってみます。ストリームを用いるケースもあると思いますが、今回は省略します。

const getObject = (bucket, key) => new Promise((resolve, reject) => {
  s3.getObject({
    Bucket: bucket,
    Key: key
  }, (err, data) => {
    if (err) reject(err);
    else resolve(data);
  });
});

以下のようにすれば、'some-bucket'内の、'some-key'という名前のオブジェクトのデータを取得できます。

getObject('some-bucket', 'some-key')
  .then((object) => {
    // 何らかの処理
  });

ここでobjectはBody, ETag, LastModified, ContentLengthなどをキーとして持つオブジェクトです。

そして最後に、バケットに新しいデータを追加する関数を作ってみます。

const putObject = (bucket, key, data) => new Promise((resolve, reject) => {
  s3.putObject({
    Body: data,
    Bucket: bucket,
    Key: key
  }, (err, data) => {
    if (err) reject(err);
    else resolve(data);
  });
});

以下のようにして、'some-bucket'内に'some-key'という名前のファイルを作成できます。中身は'some-content'となります。

putObject('some-bucket', 'some-key', Buffer.from('some-content'))
  .then(() => {
    // 何らかの処理
  });