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(() => { // 何らかの処理 });