1. ホーム
  2. パイソン

[解決済み】boto3を使ってs3のバケットにキーが存在するか確認する。

2022-04-03 04:49:21

質問

boto3にあるキーが存在するか知りたい。バケツの中身をループして、キーが一致したらチェックすることができます。

しかし、それは長いし、やりすぎだと思う。Boto3の公式ドキュメントには、この方法が明示されています。

もしかしたら、私が見落としているのかもしれません。どうすればこれを実現できるのか、どなたかご指摘ください。

どのように解決するのですか?

Boto 2の boto.s3.key.Key オブジェクトは、以前は exists メソッドは、HEADリクエストをしてその結果を見ることで、S3上にキーが存在するかどうかをチェックするものでしたが、現在は存在しないようです。自分でやるしかない。

import boto3
import botocore

s3 = boto3.resource('s3')

try:
    s3.Object('my-bucket', 'dootdoot.jpg').load()
except botocore.exceptions.ClientError as e:
    if e.response['Error']['Code'] == "404":
        # The object does not exist.
        ...
    else:
        # Something else has gone wrong.
        raise
else:
    # The object does exist.
    ...

load() は単一のキーに対して HEAD リクエストを行います。これは、問題のオブジェクトが大きい場合やバケットに多くのオブジェクトがある場合でも高速に処理できます。

もちろん、そのオブジェクトが存在するかどうかを確認するのは、それを使う予定があるからかもしれません。そのような場合は、そのオブジェクトが存在するかどうかを確認するために load() を実行し get() または download_file() を直接実行し、そこでエラーケースを処理します。