[Node][小ネタ] S3のURLからバケット名、キーなどを取り出す

Nodeで形式が決まったS3のURLのパースは標準ライブラリのurl.URLを使うことで簡単に行えます
2020.04.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

S3上のオブジェクトのURL(例: s3://bucket/some_object.key) からバケット名とキーを取り出したいことが稀によくあります。JavaであればAWS SDKにAmazonS3URI という便利クラスがあるのですが、Node SDKにはこれに相当するAPIは存在しないようです。Nodeでもどうにか簡単にできないかと試してみました。

標準ライブラリのurlを使う

出オチ感ありますが、以下のようにurl.URLを使うことでパースできます。 hostをバケット名、pathnameから先頭のスラッシュを削除したものをキーと読み替えればひとまず目的は達します。

const url = require('url')
new url.URL('s3://bucket/some_obj.key')
/*
URL {
  href: 's3://bucket/some_obj.key',
  origin: 'null',
  protocol: 's3:',
  username: '',
  password: '',
  host: 'bucket',
  hostname: 'bucket',
  port: '',
  pathname: '/some_obj.key',
  search: '',
  searchParams: URLSearchParams {},
  hash: ''
}
*/

HTTPSの場合

プロトコルがHTTPSのURL(https://<bucket-name>.amazonaws.com)の場合は素直にparse-s3-urlを使うか、hostを解析するのがいいと思います。