概要
PythonでS3のオブジェクトが存在するかどうかを確認する方法を説明します。
boto3にはresourceとclientの2つのAPIがあり、それぞれの方法を紹介します。
実際にLINE Botの開発で、ユーザーごとの設定ファイルがS3に存在するかチェックする必要があり、この方法を使いました。
resource vs client どちらを使うべきか
boto3には2つのAPIレベルがあります。
| API | 特徴 | 適したユースケース |
|---|---|---|
resource | 高レベルAPI、オブジェクト指向 | シンプルな操作、可読性重視 |
client | 低レベルAPI、AWS APIに近い | 細かい制御、パフォーマンス重視 |
結論: 単純な存在確認ならclientのhead_objectがおすすめです。理由は以下の通りです。
head_objectはオブジェクトのメタデータのみを取得するため軽量resourceのload()も内部的にはhead_objectを呼んでいるclientの方がAWS APIに近く、挙動が明確
boto3.clientを利用する方法(推奨)
| |
ポイント
head_objectはオブジェクトの内容をダウンロードせず、メタデータのみを取得- 404エラー以外(403: アクセス拒否など)は別のエラーなので再raiseする
- 関数化しておくとテストしやすい
boto3.resourceを利用する方法
オブジェクト指向的に書きたい場合はこちらも使えます。
| |
よくあるハマりポイント
1. 権限不足を404と間違える
S3バケットへのアクセス権限がない場合、403エラーが返ります。 404だけをキャッチして「存在しない」と判断すると、権限の問題を見逃します。
| |
2. list_objectsを使う方法は非効率
list_objectsでプレフィックス検索する方法もありますが、オブジェクト数が多いと遅くなります。
単一オブジェクトの存在確認にはhead_objectを使いましょう。
まとめ
- S3オブジェクトの存在確認には
head_objectを使う - 404エラー以外は権限不足などの可能性があるので適切に処理する
resourceとclientどちらでも可能だが、clientの方がシンプル
参考
関連記事
- AWS Lambda + LINE Botで掃除リマインダーを作る
- Pyenvとvenvを用いたローカル環境のセットアップ方法(Python環境構築)
- MacでUVを用いてPythonの開発環境を構築する(モダンなPython環境構築)