はじめに
amazon S3における「フォルダ」という幻想をぶち壊し、その実体を明らかにする
https://dev.classmethod.jp/cloud/aws/amazon-s3-folders/
こちらに載っていた情報で下記の2つのケース以外にもあったので補足いたします
- 管理コンソールから、既存の空フォルダの中にファイルを配置する(ケース1)
- aws-cliを使って、存在しないフォルダに直接ファイルを配置する(ケース2)
結論
管理画面でフォルダごとアップロードができ、フォルダの中のファイルの有無で変わる
詳細
ケース1の追加
「管理コンソールから、空のフォルダをフォルダごとアップロードする」
例) 空のcase1testフォルダを管理画面からアップロードする
この場合は、オブジェクトとしてフォルダを取得できます
ケース2の追加
「管理コンソールから、ファイルの入ったフォルダをフォルダごとアップロードする」
例) test.pngの入ったcase2testフォルダを管理画面からcase2testフォルダごとアップロードする
この場合は、オブジェクトとしてフォルダを取得できません
ソース
import json
import boto3
def lambda_handler(event, context):
S3Bucket = 'myBucket'
S3KeyPrefix = 'test/'
s3 = boto3.resource('s3')
bucket = s3.Bucket(S3Bucket)
Obj = bucket.meta.client.list_objects_v2(Bucket=bucket.name, Prefix=S3KeyPrefix)
print(Obj)
# TODO implement
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
実行結果
{'ResponseMetadata':
略
'Contents': [
{'Key': 'test/', 'LastModified': datetime.datetime(2019,1,17,9,48,42, tzinfo=tzlocal()), 'ETag': '"d41d8cd98f00b204e9800998ecf8427e"', 'Size': 0, 'StorageClass': 'STANDARD'},
{'Key': 'test/case1test/', 'LastModified': datetime.datetime(2019,1,17,9,48,50, tzinfo=tzlocal()), 'ETag': '"d41d8cd98f00b204e9800998ecf8427e"', 'Size': 0, 'StorageClass': 'STANDARD'},
{'Key': 'test/case2test/test.png', 'LastModified': datetime.datetime(2019,1,17,9,48,53, tzinfo=tzlocal()), 'ETag': '"0753ec70b92a549bb53484c0e83ba7c1"', 'Size': 5293, 'StorageClass': 'STANDARD'}
], 'Name': 'myBucket', 'Prefix': 'test/', 'MaxKeys': 1000, 'KeyCount': 3
}
「'Key': 'test/case1test/'」のオブジェクトは有ります
「'Key': 'test/case2test/'」のオブジェクトは無いです
おわりに
フォルダオブジェクトは無い前提で考えます