AWS S3 (Amazon Simple Storage Service) は、高い耐久性、スケーラビリティ、セキュリティを備えたオブジェクトストレージサービスです。この記事では、Python の AWS SDK である Boto3 を使用して、S3 バケットへファイルをアップロードする方法をコード例を挙げながら解説します。
Boto3 とは?
Boto3 は、AWS 公式の Python 用 SDK (Software Development Kit) です。 Boto3 を使うことで、Python スクリプトから S3 をはじめとする様々な AWS サービスを簡単に操作できます。
Boto3 は、AWS サービスとの連携を容易にするために設計されています。S3、EC2、DynamoDB、Lambda など主要なサービスのリソース作成、設定変更、削除といった操作を Python から実行できます。AWS の API を Python オブジェクトやメソッドとして抽象化し、直感的で使いやすいインターフェースを提供しているため、開発者は複雑な API の詳細を意識することなく、AWS サービスを利用できます。
退屈なことはPythonにやらせよう 第2版 ノンプログラマーにもできる自動化処理プログラミング [ AI Sweigart ]
AWS S3 へファイルをアップロードする Python プログラムの作成
1. 準備: 必要な Python ライブラリのインストール
まず、Boto3 ライブラリをインストールします。ターミナルまたはコマンドプロンプトで、以下のコマンドを実行します。
pip install boto3
2. AWS 認証情報の設定
Boto3 が AWS にアクセスするためには、認証情報が必要です。認証情報を設定する方法はいくつかあります。
方法1: 環境変数で設定する
AWS_ACCESS_KEY_ID: アクセスキー ID を設定します。AWS_SECRET_ACCESS_KEY: シークレットアクセスキーを設定します。AWS_DEFAULT_REGION: 利用する AWS リージョン (例:ap-northeast-1(東京)) を設定します。
export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY export AWS_DEFAULT_REGION=ap-northeast-1
set AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE set AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY set AWS_DEFAULT_REGION=ap-northeast-1
方法2: AWS Configファイルで設定する
通常、~/.aws/credentials (Linux/macOS) または C:\Users\[ユーザー名]\.aws\credentials (Windows) に認証情報を記述します。~/.aws/config ファイルには、リージョンなどの設定を記述します。
[default] aws_access_key_id = AKIAIOSFODNN7EXAMPLE aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY [default] region = ap-northeast-1
方法3: IAMロールで設定する (AWS EC2インスタンス上で実行する場合など)
EC2 インスタンスに IAM ロールを割り当てることで、インスタンス内で実行するアプリケーションに認証情報を渡す必要がなくなります。
参考: 認証情報の取得方法
- AWS マネジメントコンソールにログインします。
- IAM (Identity and Access Management) サービスを開きます。
- ユーザーを作成するか、既存のユーザーを選択します。
- 「認証情報」タブで、「アクセスキーの作成」をクリックします。
- アクセスキー ID とシークレットアクセスキーが表示されます。シークレットアクセスキーは、この時しか表示されません。 必ず安全な場所に保存してください。
アクセスキーとシークレットキーは、非常に重要な情報です。漏洩すると、AWS リソースを不正に利用される可能性があります。GitHub などの公開リポジトリにコミットしたり、他人と共有したりしないようにしてください。
3. Python コードによるファイルアップロード
Boto3 には、AWS サービスを操作するための client (クライアント) と resource (リソース) という2つの異なるインターフェースが用意されています。それぞれの方法をコードを用いて解説していきます。
方法1: client を使用する場合 (低レベルインターフェース)
import boto3 # S3 クライアントを作成 s3_client = boto3.client('s3') # アップロードするファイルの情報 bucket_name = 'your-bucket-name' # バケット名 local_file_path = 'path/to/your/local_file.txt' # ローカルのファイルパス object_key = 'path/to/s3/object.txt' # S3 内のオブジェクトのキー (パス) try: s3_client.upload_file(local_file_path, bucket_name, object_key) print(f"ファイル {local_file_path} を {bucket_name} の {object_key} にアップロードしました。") except Exception as e: print(f"アップロード中にエラーが発生しました: {e}")
コードの解説 (client)
s3_client = boto3.client('s3'):Boto3のclientを作成します。これにより、S3 の低レベル API を直接操作できるようになります。s3_client.upload_file(...): S3 へファイルをアップロードします。ローカルのファイルパス、バケット名、S3 内でのオブジェクトキーを指定します。
方法2: resource を使用する場合 (高レベルインターフェース)
import boto3 # S3 リソースを作成 s3_resource = boto3.resource('s3') # アップロードするファイルの情報 bucket_name = 'your-bucket-name' # バケット名 local_file_path = 'path/to/your/local_file.txt' # ローカルのファイルパス object_key = 'path/to/s3/object.txt' # S3 内のオブジェクトのキー (パス) try: s3_resource.Bucket(bucket_name).upload_file(local_file_path, object_key) print(f"ファイル {local_file_path} を {bucket_name} の {object_key} にアップロードしました。") except Exception as e: print(f"アップロード中にエラーが発生しました: {e}") # put_object を使う場合 (resource のみ) try: with open(local_file_path, 'rb') as f: #ファイルをバイナリモードで開く s3_resource.Bucket(bucket_name).put_object(Key=object_key, Body=f) print(f"{local_file_path} を {bucket_name} の {object_key} にアップロードしました (put_object)。") except Exception as e: print(f"エラーが発生しました:{e}")
コードの解説 (resource)
s3_resource = boto3.resource('s3'):Boto3のresourceを作成します。これにより、S3 リソース (バケット、オブジェクトなど) をオブジェクトとして操作できるようになります。s3_resource.Bucket(bucket_name): 指定された名前の S3 バケットを表すオブジェクトを作成します。.upload_file(...): バケットオブジェクトのメソッドとしてupload_fileを呼び出し、ファイルをアップロードします。clientを使う場合と比べて、バケットをオブジェクトとして扱えるため、より直感的な記述になっています。.put_object(...): バケットオブジェクトのメソッドとしてput_objectを呼び出し、ファイルをアップロードします。upload_fileと異なり、ファイルオブジェクトを直接渡せます。
client と resource の違い
client は、AWS サービスの API に直接対応する低レベルインターフェースです。各 API のパラメータを細かく指定できるため、より詳細な制御が可能です。操作は、s3_client.upload_file() のように、client オブジェクトのメソッドとして呼び出します。
一方、resource は、AWS リソース (S3 バケット、オブジェクトなど) を Python オブジェクトとして抽象化した高レベルインターフェースです。resource を使うと、s3_resource.Bucket(bucket_name).upload_file() のように、リソースオブジェクトのメソッドとして操作を呼び出すことができ、よりオブジェクト指向的で直感的なコーディングが可能になります。多くの場合、client よりも少ないコードで同じ操作を実現できます。put_objectメソッドのように、resourceでのみ利用可能なメソッドもあります。
どちらのインターフェースを使うべきか迷った場合は、まず resource を試してみることをおすすめします。より簡潔にコードを記述できることが多く、基本的な操作であれば resource で十分対応できます。詳細な API パラメータの制御が必要な場合は、client を選択すると良いです。
4. 実行と確認
- 上記の Python スクリプトを
upload_s3.pyなどのファイル名で保存します。 bucket_name、local_file_path、object_keyは適切な値に書き換えます。- ターミナルまたはコマンドプロンプトで、スクリプトを実行します。
python upload_s3.py
AWSではじめる生成AI RAGアプリケーション開発から、基盤モデルの微調整、マルチモーダルAI活用までを試して学ぶ [ Chris Fregly ]
大容量ファイルのアップロード (Multipart Upload)
Boto3 は、非常に大きなファイルをアップロードする際に、自動的にマルチパートアップロードを使用してくれます。upload_file メソッドを使用するだけで、内部的にファイルを分割し、並列にアップロードしてくれます。これにより、アップロード時間を短縮し、ネットワークの問題による中断のリスクを軽減できます。
手動でマルチパートアップロードを制御したい場合は、boto3.s3.transfer.TransferConfig を使用して設定をカスタマイズできます。
import boto3 from boto3.s3.transfer import TransferConfig # S3 リソースを作成 s3 = boto3.resource('s3') # マルチパートアップロードの設定 config = TransferConfig( multipart_threshold=1024 * 25, # 25MB を超える場合にマルチパートアップロードを使用 max_concurrency=10, # 最大 10 個の並列アップロード multipart_chunksize=1024 * 25, # 各パートのサイズを 25MB に設定 use_threads=True # スレッドを使用 ) # アップロードするファイルの情報 bucket_name = 'your-bucket-name' local_file_path = 'path/to/your/large_file.txt' object_key = 'path/to/s3/large_object.txt' # ファイルをアップロード (設定を適用) try: s3.Bucket(bucket_name).upload_file( local_file_path, object_key, Config=config ) print(f"ファイル {local_file_path} を {bucket_name} の {object_key} にアップロードしました。") except Exception as e: print(f"アップロード中にエラーが発生しました: {e}")
コードの解説 (マルチパートアップロード)
TransferConfig: マルチパートアップロードの設定オブジェクトを作成します。multipart_threshold: このサイズを超える場合にマルチパートアップロードを開始します (バイト単位)。max_concurrency: 並列アップロードの最大数。multipart_chunksize: 各パートのサイズ (バイト単位)。use_threads: マルチスレッドを使用するかどうか。
upload_fileのConfig引数に、作成したTransferConfigオブジェクトを渡します。
まとめ
この記事では、Python と Boto3 を使用して AWS S3 へファイルをアップロードする方法を解説しました。Boto3 には、他にもダウンロード (download_file())、ファイル一覧取得 (list_objects_v2())、バケット操作、Presigned URL 生成など、多くの機能があります。これらを活用することで、AWS S3 を利用したアプリケーション開発やデータ処理の自動化をさらに効率化できます。
S3からファイルをダウンロードする方法については下記の記事に解説しています。
最後にPythonの学習に利用できるUdemy
のサイトを紹介します。ぜひ活用ください。
[PR]