Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

AWS SDK for JavaScript v3 を使って、S3 から取ってきて S3 に置く

JavaScript 版の AWS SDK は v3 が出ていて、たとえば、AWS Lambda で Node.js 18.x をランタイムに選択した場合 SDK を使うならこれがデフォルトになっている。

公式ページ: https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/

AWS SDK v3 を使うときの S3 から取ってきて保存したり、S3 にアップロードしたりするときのメモ。

ちなみに ReadableStream の使い方含めよくわからなかったところは Bing のチャット AI に助けてもらった。AI すごい。

公式サンプルコード: https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v3/developer-guide/javascript_s3_code_examples.html

import { createWriteStream, createReadStream } from "fs";
import { S3Client, GetObjectCommand, PutObjectCommand } from "@aws-sdk/client-s3";
const s3Client = new S3Client({ region: "ap-northeast-1" });

async function run() {
    const data = await s3Client.send(new GetObjectCommand({
        Bucket: "mybucket",
        Key: "foo/bar/gazou.png",
    }));
    const writeStream = createWriteStream("/tmp/gazou.png");
    data.Body.pipe(writeStream);
    await new Promise((resolve, reject) => { // これが必要
        writeStream.on("finish", resolve);
        writeStream.on("error", reject);
    });

    // todo: process

    const readStream = createReadStream("/tmp/kakou.png");
    await s3Client.send(new PutObjectCommand({
        Bucket: "mybucket",
        Key: "foo/bar/kakou.png",
        Body: readStream,
    }));
}

run();