はじめに
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/'」のオブジェクトは無いです
おわりに
フォルダオブジェクトは無い前提で考えます