Techioz Blog

S3 Ruby SDK はプレフィックス直下のオブジェクトのみをリストしますか?

概要

S3 バケット内のプレフィックスの下にある単一レベルのオブジェクトを取得しようとしています。バケット内には大量のオブジェクトがあるため、特定のプレフィックスの下にある各フォルダーを反復処理したいと考えています。これまでの私のコードは次のとおりです。

require 'aws-sdk'

region = 'us-west-1'
bucket_name = 'my-example-bucket'
prefix = 'test1'
delimiter = '/'

s3_client = Aws::S3::Client.new(region: region)
resp = s3_client.list_objects_v2(bucket: bucket_name, prefix: prefix, delimiter: prefix + delimiter)
obj_list = []
resp.contents.each do |c|
  p c
  break
end

これを実行すると、プレフィックスの 4 レベルの深さにある単一のオブジェクトが取得されます。

このプレフィックスの下には 243 個のフォルダーがあります。この 243 個だけが必要で、他には何も必要ありません。

どうすればいいでしょうか?

解決策

まず、prefix=‘test1/’ と delimiter=‘/’ を使用する必要があります。

ただし、内容的には何も得られません。 S3 のフォルダーは単なるプレフィックスであるため、できることはプレフィックスを反復処理することです。

region = 'us-west-1'
bucket_name = 'my-example-bucket'
prefix = 'test1/'

objs = s3_client.list_objects_v2(bucket: bucket_name, prefix: prefix, delimiter: '/')

objs.common_prefixes.map(&:prefix).each do |prefix|
  current_objs = s3_client.list_objects_v2(bucket: bucket_name, prefix: prefix, delimiter: '/')
  p current_objs.contents # you will get nothing here again if all you have inside the folders is some other folders
end