pythonのboto3を使って、S3のフォルダオブジェクトが取れなくて困った
pythonのboto3を使って、S3のフォルダオブジェクトが取れなくて困った:
amazon S3における「フォルダ」という幻想をぶち壊し、その実体を明らかにする
https://dev.classmethod.jp/cloud/aws/amazon-s3-folders/
こちらに載っていた情報で下記の2つのケース以外にもあったので補足いたします
管理画面でフォルダごとアップロードができ、フォルダの中のファイルの有無で変わる
「管理コンソールから、空のフォルダをフォルダごとアップロードする」
例) 空のcase1testフォルダを管理画面からアップロードする
この場合は、オブジェクトとしてフォルダを取得できます
「管理コンソールから、ファイルの入ったフォルダをフォルダごとアップロードする」
例) test.pngの入ったcase2testフォルダを管理画面からcase2testフォルダごとアップロードする
この場合は、オブジェクトとしてフォルダを取得できません
「'Key': 'test/case1test/'」のオブジェクトは有ります
「'Key': 'test/case2test/'」のオブジェクトは無いです
フォルダオブジェクトは無い前提で考えます
はじめに
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/case2test/'」のオブジェクトは無いです
コメント
コメントを投稿