Python boto3 で AWS S3 を操作する
はじめに
Python boto3
を使って、AWS S3 にファイルのアップロードや削除方法を調べた。
TL;DR
- アップロードは
boto3.resource("s3").Bucket("your-bucket").upload_file
- 公開状態にしたい場合は、Bucket そのもののブロックパブリックアクセスをオフにして、
ExtraArgs={"ACL": "public-read"}
を付ける - 画像をブラウザで開きたい場合は、
ExtraArgs={"ContentType": "image/jpeg"}
などを付ける
- 公開状態にしたい場合は、Bucket そのもののブロックパブリックアクセスをオフにして、
- 削除は
boto3.resource("s3").Bucket("your-bucket").delete_objects
目的・やったこと
Python boto3
を使って、AWS S3 にファイルのアップロードや削除方法を調べた。
目次
環境・条件
1 | $ sw_vers |
詳細
boto3
インストール
pip
で boto3
をインストール。
1 | $ pip install boto3 |
認証情報の登録
事前に 【AWS】【S3】作成手順 & アップロード手順 & アクセス権限設定手順 などで Bucket やユーザーは作っておくこと。
Botoを使用してPythonからAWSを操作する(入門編) - Qiita では、~/.aws/credentials
にアクセスキーなどの情報を記載するとあるが、個人的には環境ごとに隔離したい。
公式ドキュメント - Configuring Credentials によると、以下の順番で認証情報を探すとのこと。
- Passing credentials as parameters in the boto.client() method
- Passing credentials as parameters when creating a Session object
- Environment variables
- Shared credential file (~/.aws/credentials)
- AWS config file (~/.aws/config)
- Assume Role provider
- Boto2 config file (/etc/boto.cfg and ~/.boto)
- Instance metadata service on an Amazon EC2 instance that has an IAM role configured.
ざっくり上からこんな感じ、6〜8 はほぼ気にしなくて良さそうなので省略。
boto.client()
の引数boto3.session()
の引数- 環境変数
~/.aws/credentials
~/.aws/config
今回は direnv
で環境変数をセットすることにした。以下の3つを設定しておけば OK。
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_DEFAULT_REGION
1 | $ direnv edit . |
他の利用可能な環境変数は 公式ドキュメント - Environment Variable Configuration を参照。
S3 へのアクセス確認
以下のコードを実行して、(Policy に応じて取得可能な) bucket の一覧が表示されれば無事にアクセスできている。
1 | import boto3 |
ファイルアップロード
upload_file
メソッドでアップロード。
1 | bucket = s3.Bucket("your-bucket") |
公開状態でアップロード
ExtraArgs={"ACL": "public-read"}
オプションを付けてアップロードすると、対象ファイルが公開状態になる。
1 | bucket.upload_file("path/to/file", "path/of/s3/file", ExtraArgs={"ACL": "public-read"}) |
なお、bucket のブロックパブリックアクセス設定がオンの場合、上記コードは例外が発生するので注意。
1 | Traceback (most recent call last): |
画像をアップロード(ブラウザで開ける状態にする)
何も考えずにそのまま画像をアップロードすると、ブラウザアクセス時にダウンロードが始まってしまう。ブラウザで画像を表示したい場合には、ExtraArgs={"ContentType": "image/jpeg"}
などのように Content-Type
を指定する。
1 | bucket.upload_file("hoge.jpg", "hoge.jpg", ExtraArgs={"ContentType": "image/jpeg", "ACL": "public-read"}) |
bucket の中身を消す
アップロード時に指定した Key
を delete_objects
に渡せば OK。
1 | bucket.delete_objects( |
bucket の中身をまとめて消す
objects.all()
で、bucket 内の Object が取れるので、delete_objects
に Key
を渡せば OK。
1 | for o in bucket.objects.all(): |
まとめ
- アップロードは
boto3.resource("s3").Bucket("your-bucket").upload_file
- 公開状態にしたい場合は、Bucket そのもののブロックパブリックアクセスをオフにして、
ExtraArgs={"ACL": "public-read"}
を付ける - 画像をブラウザで開きたい場合は、
ExtraArgs={"ContentType": "image/jpeg"}
などを付ける
- 公開状態にしたい場合は、Bucket そのもののブロックパブリックアクセスをオフにして、
- 削除は
boto3.resource("s3").Bucket("your-bucket").delete_objects
その他・メモ
Available Services を見ると、やれることが大量にあるので、API 使った自動化が捗りそう。
参考文献
- boto/boto3: AWS SDK for Python
- AWS SDK for Python | AWS
- Boto 3 Documentation — Boto 3 Docs 1.9.200 documentation
- Botoを使用してPythonからAWSを操作する(入門編) - Qiita
- Botoを使用してPythonからAWSを操作する(S3編) - Qiita
- AWS_SDKでS3にアップした画像を開くとブラウザに表示されないあなたへ - Qiita
- boto3でS3にアップロードした画像が、ブラウザで表示するとダウンロードされてしまう時 – 或る阿呆の記
- Python+boto3でS3に画像をアップロードして公開する - Qiita
- Boto3 で S3 のオブジェクトを操作する(高レベルAPIと低レベルAPI) - Qiita
関連記事
- Python requests + boto3 で AWS S3 に画像を直接アップロード
- AWS S3 バケットをリネーム(できないので別バケットにコピー)
- AWS lambda で S3 の画像をリサイズする(チュートリアル)
- docker-lambda を使って AWS Lambda Function を開発する方法
- AWS S3 Bucket 内のオブジェクトの ACL(アクセス権限) を一括で変更する方法
- AWS S3 で権限を与えているのに Lambda が Access Denied になる場合
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア