S3 でディレクトリ一覧を取得する

S3 には厳密にディレクトリという概念はないけれど、例えば api という Prefix 配下に以下のように複数のディレクトリがあった場合に、この api 配下のディレクトリ名一覧(v1.0.0v1.0.1)を取得するにはどうするか。

  • BucketName/api/v1.0.0/
  • BucketName/api/v1.0.1/
  • BucketName/api/v1.1.0/

List Objects コマンドを使ってできるだろうと思いつつも、サクッとはいかなかったのでメモ。

aws コマンドでやる場合

$ aws s3api list-objects --bucket BucketName --prefix api/v --delimiter /
{
    "CommonPrefixes": [
        {
            "Prefix": "api/v1.0.0/"
        },
        {
            "Prefix": "api/v1.0.1/"
        },
        {
            "Prefix": "api/v1.1.0/"
        }
    ]
}

boto3 を使ってやる場合

s3client = boto3.client('s3')
result = s3client.list_objects_v2(Bucket=s3_bucket, Prefix='api/v', Delimiter='/')
for o in result.get('CommonPrefixes'):
    print(o.get('Prefix'))  # "api/v1.0.0/" のように末尾にスラッシュが付いた文字列

参考: lambdaでboto3を使いs3を階層的に探索する | hacknote

Last updated on April 10, 2017