🦕
【Deno】SDK for JavaScript(v3)でS3操作する
はじめに
Deno 環境で SDK for JavaScript(v3)を使って S3 を操作している例が少ないため、実際に操作した際のプログラムを残しておきます。
まず、結論ですが、Amazon S3 code examples for the SDK for JavaScript (v3)を参照し、プログラムを作成することで問題なく S3 操作可能でした。
実行
環境
本プログラムの実行環境は以下の通りです。
- Deno
v1.45.2
- TypeScript
deno.jsonc
のimports
は以下です。
{
// 他省略...
"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