概要
PythonのAWSへのAPIラッパーであるboto3ライブラリを用いて、S3上のあるフォルダ1
またはファイルが存在するかどうかを確認する関数を書いた。
動機
S3上のフォルダの有無で場合分けをしたい処理があったのだが、ネット上にはboto2を使っていて現在では実装されていない関数を使った処理だとか、S3上の「ファイル」にしか使えない方法ばかりがあって、「フォルダ」に対する存在判定がほぼなかった。
なので自作しました。
コード例
import boto3
from botocore.exceptions import ClientError
client = boto3.client('s3')
bucket_name = 'hoge'
key = "fuga/piyo/bar/" # /まで入れるのがキモだと思う。なくてもいけるかもしれない。確かめてません。
# 2020-09-30追記 コメントより、末尾の/は必要であるとの指摘を頂きました。
result = client.list_objects(Bucket=bucket_name, Prefix=key)
# 次もキモ。上記のパスが存在しない場合、返ってきた結果の中には
# Contents というキーが存在しない。これを使えば存在判定ができる。
if "Contents" in result:
exists = True
else:
exists = False
-
厳密にはフォルダではない。S3上ではすべてPythonでいう辞書のように、キー(パスのようなもの)と値(ファイルの中身的なもの)の組み合わせで管理されている。S3ではそのキーがたまたまパスのような/区切りで表現されており、ブラウザではAWSのビューワが/区切りでいい感じに解釈してくれているだけ。 ↩