🦕

【Deno】SDK for JavaScript(v3)でS3操作する

2024/07/20に公開

はじめに

Deno 環境で SDK for JavaScript(v3)を使って S3 を操作している例が少ないため、実際に操作した際のプログラムを残しておきます。
まず、結論ですが、Amazon S3 code examples for the SDK for JavaScript (v3)を参照し、プログラムを作成することで問題なく S3 操作可能でした。

実行

環境

本プログラムの実行環境は以下の通りです。

  • Deno v1.45.2
  • TypeScript

deno.jsoncimportsは以下です。

{
  // 他省略...
  "imports": {
    "$dotenv": "https://deno.land/std@0.224.0/dotenv/mod.ts",
    "$s3": "npm:@aws-sdk/client-s3@3.616.0"
  }
}

プログラム&実行

今回は.envに AWS の認証情報を記載しています。

AWS_ACCSS_KEY_ID=foo
AWS_SECRET_ACCESS_KEY=baz

今回はListBucketsCommandを使って S3 のバケット一覧を取得しています。
main.tsは以下の通りです。

import { load } from "$dotenv";
import { ListBucketsCommand, S3Client } from "$s3";

const env = await load();

const AWS_SECRET_ACCESS_KEY = env.AWS_SECRET_ACCESS_KEY;
const AWS_ACCESS_KEY_ID = env.AWS_ACCESS_KEY_ID;

const client = new S3Client({
  region: "ap-northeast-1",
  credentials: {
    accessKeyId: AWS_ACCESS_KEY_ID,
    secretAccessKey: AWS_SECRET_ACCESS_KEY,
  },
});

const command = new ListBucketsCommand({});
const { Buckets } = await client.send(command);

console.log("Buckets:");
console.log(Buckets?.map((bucket) => bucket.Name));

実行は以下の通りです。

$ deno run --allow-all main.ts

S3 のバケット一覧が標準出力されます。

ファイルのアップロード -PutObject-

PutObjectCommandを使ってファイルをアップロードすることも可能です。

import { PutObjectCommand } from "$s3";

// S3Clientのインスタンス化は省略
// 上記を参照ください

// 適切なファイルパスを指定
const text = await Deno.readTextFile("./test.txt");

const command = new PutObjectCommand({
  Bucket: "test-s3",
  Key: "test.txt",
  Body: text,
  ContentType: "text/plain",
});

try {
  const response = await client.send(command);
  console.log(response);
} catch (error) {
  console.error(error);
}

オブジェクトのダウンロード -GetObject-

GetObjectCommandを使ってオブジェクトをダウンロードすることも可能です。

import { GetObjectCommand } from "$s3";

// S3Clientのインスタンス化は省略
// 上記を参照ください

const command = new GetObjectCommand({
  Bucket: "test-s3",
  Key: "test.txt",
});

try {
  const response = await client.send(command);
  const body = await response.Body;

  if (body == null) {
    console.error("Body is undefined.");
  }

  const str = await response.Body.transformToString();

  // 適切なファイルパスを指定
  await Deno.writeTextFile("./test-from-s3.txt", str)
    .then(() => {
      console.log("File written.");
    })
    .catch((err) => {
      console.error(err);
    });
} catch (err) {
  console.error(err);
}

参考記事

Discussion