新しいことにはウェルカム

[技術] [電子工作] [ガジェット] [ゲーム] のメモ書き

AWS S3でディレクトリ一覧をJSONで取得する方法




下記のようなディレクトリ構造において、バケット直下や、「dir_A1/dir_B1」直下のディレクトリ一覧をJSONで取得する方法。

  • s3://bucket_1/
    • dir_A1/
      • dir_B1/
        • dir_C1/
        • dir_C2/
        • dir_C3/
    • dir_A2/
    • dir_A3/

バケット直下の場合

$ aws s3api list-object-v2 --bucket 'bucket_1' --prefix '' --delimiter '/' --output json
{
    "CommonPrefixes": [
        {
            "Prefix": "dir_A1/"
        },
        {
            "Prefix": "dir_A2/"
        },
        {
            "Prefix": "dir_A3/"
        }
    ]
}

サブディレクトリ直下の場合

$ aws s3api list-object-v2 --bucket 'bucket_1' --prefix 'dir_A1/dir_B1/' --delimiter '/' --output json
{
    "CommonPrefixes": [
        {
            "Prefix": "dir_A1/dir_B1/dir_C1/"
        },
        {
            "Prefix": "dir_A1/dir_B1/dir_C2/"
        },
        {
            "Prefix": "dir_A1/dir_B1/dir_C3/"
        }
    ]
}

「prefix」で調べたいディレクトリのパスを指定し(最後の「/」は含む)、「delimiter」に「/」を設定します。

すると、「prefix」で始まり、次の「delimiter」文字が出てくるまでのパス文字の一覧が、「CommonPrefixes」に格納されるので、それをもってディレクトリ一覧とします。

aws s3 lsコマンドでも似たような一覧は取得できるのですが、aws s3コマンドはJSON出力ができないので、aws s3apiコマンドを使用しました。

SDKを使う場合でも、「list-objects-v2」に該当するコマンドで同じパラメータを指定すれば、同じ結果を得ることができます。

その他

最初、aws s3 ls ~でサクッとできるかと思ったのですが、意外に手間がかかるんですね。

本当はディレクトリというものはなく、バケットは、key(=パス)と中身(=ファイル)の「key-value」の集まりで、keyを「/」で区切ってディレクトリっぽく見せているだけのようです。

なので、厳密にはディレクトリ一覧ではなく、「CommonPrefixes」から分かるように、prefixの集まりになります。