理系学生日記

おまえはいつまで学生気分なのか

AWS SDK for JavaScript v3のGetObjectCommand、TypeScriptで使いにくくないか?

S3上にあるオブジェクトの内容をTypeScriptで読み込みたい、こういうユースケースは多数あります。

自身としては今回初めて、AWS SDK for JavaScript v3の@aws-sdk/client-s3を使って実装してみました。 そこで感じたのは、GetObjectCommandまわりのインタフェースの使いづらさです。 これって、回避策はあるものなのでしょうか?

問題

S3上のオブジェクトのBodyを取得しようとする場合、以下のようなコードになるのではないでしょうか。

  const s3client = new S3Client({
    region
  });
  const { Body } = await s3client.send(
    new GetObjectCommand({
      Bucket: bucket,
      Key: key,
    })
  );

問題は、このときのBodyの型がReadable | ReadableStream | Blobとして定義されていることなんですよね。

この手の処理は冒頭記述したように多数のユースケースがあるわけですが、毎回どの型が返却されたのかをチェックし、その型毎に処理を切り替えなければならないでしょうか。 このインタフェース本気かと正直感じました。

この問題、以下のissueで白熱した議論が存在しています。

It's quite unfortunate that everybody has to go through these hoops to get the content out of the response though. Especially considering that we have to do type checking with things like if (resp.Body instanceof Readable), or declare special interfaces to avoid differences between browser/Node.

S3.GetObject no longer returns the result as a string · Issue #1877 · aws/aws-sdk-js-v3 · GitHub

結局どうした

ぼくが使っているのはNode.jsなのですが、この場合はReadableしか返却されないはずです。たぶん。 このため、以下のように決め打ちで騙し騙し使っています。

(Body as Readable).pipe(parser);