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 サービスを利用できます。
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' # バケット名 object_key = 'path/to/your/file.txt' # S3 内のオブジェクトのキー (パス) local_file_path = 'downloaded_file_client.txt' # ローカルに保存するファイル名 try: s3_client.download_file(bucket_name, object_key, local_file_path) print(f"ファイル {object_key} を {local_file_path} にダウンロードしました。") except Exception as e: print(f"ダウンロード中にエラーが発生しました: {e}") # get_object を使用 (client のみ) try: obj = s3_client.get_object(Bucket=bucket_name, Key=object_key) with open('downloaded_file_get_object.txt', 'wb') as f: # バイナリモード f.write(obj['Body'].read()) print(f"{object_key} を downloaded_file_get_object.txt にダウンロードしました。") except Exception as e: print(f"エラーが発生しました: {e}")
コードの解説 (client)
s3_client = boto3.client('s3'):Boto3のclientを作成します。これにより、S3 の低レベル API を直接操作できるようになります。s3_client.download_file(...): S3 からファイルをダウンロードし、指定したローカルパスに保存します。s3_client.get_object(...): S3 オブジェクトの内容とメタデータを取得します。download_fileとは異なり、ファイルへの保存は行いません。取得したオブジェクトのBody属性を読み込み (read())、ファイルに書き込んでいます。
方法2: resource を使用する場合 (高レベルインターフェース)
import boto3 # S3 リソースを作成 s3_resource = boto3.resource('s3') # ダウンロードするファイルの情報 bucket_name = 'your-bucket-name' # バケット名 object_key = 'path/to/your/file.txt' # S3 内のオブジェクトのキー (パス) local_file_path = 'downloaded_file_resource.txt' # ローカルに保存するファイル名 try: s3_resource.Bucket(bucket_name).download_file(object_key, local_file_path) print(f"ファイル {object_key} を {local_file_path} にダウンロードしました。") except Exception as e: print(f"ダウンロード中にエラーが発生しました: {e}")
コードの解説 (resource)
s3_resource = boto3.resource('s3'):Boto3のresourceを作成します。これにより、S3 リソース (バケット、オブジェクトなど) をオブジェクトとして操作できるようになります。s3_resource.Bucket(bucket_name): 指定された名前の S3 バケットを表すオブジェクトを作成します。.download_file(...): バケットオブジェクトのメソッドとしてdownload_fileを呼び出し、ファイルをダウンロードしてローカルに保存します。clientを使う場合と比べて、バケットをオブジェクトとして扱えるため、より直感的な記述になっています。
client と resource の違い
client は、AWS サービスの API に直接対応する低レベルインターフェースです。各 API のパラメータを細かく指定できるため、より詳細な制御が可能です。操作は、s3_client.download_file() のように、client オブジェクトのメソッドとして呼び出します。get_object() メソッドのように、client でのみ利用可能なメソッドもあります。get_object() は、ファイルの内容だけでなく、メタデータ (最終更新日時、サイズなど) も取得したい場合に便利です。
一方、resource は、AWS リソース (S3 バケット、オブジェクトなど) を Python オブジェクトとして抽象化した高レベルインターフェースです。resource を使うと、s3_resource.Bucket(bucket_name).download_file() のように、リソースオブジェクトのメソッドとして操作を呼び出すことができ、よりオブジェクト指向的で直感的なコーディングが可能になります。多くの場合、client よりも少ないコードで同じ操作を実現できます。
どちらのインターフェースを使うべきか迷った場合は、まず resource を試してみることをおすすめします。より簡潔にコードを記述できることが多く、基本的な操作であれば resource で十分対応できます。詳細な API パラメータの制御が必要な場合や、get_object() のように client 特有の機能を使いたい場合は、client を選択すると良いです。
退屈なことはPythonにやらせよう 第2版 ノンプログラマーにもできる自動化処理プログラミング [ AI Sweigart ]
4. 実行と確認
- 上記の Python スクリプトを
download_s3.pyなどのファイル名で保存します。 bucket_name、object_key、local_file_pathは適切な値に書き換えます。- ターミナルまたはコマンドプロンプトで、スクリプトを実行します。
python download_s3.py
まとめ
この記事では、Python と Boto3 を使用して AWS S3 からファイルをダウンロードする方法を解説しました。Boto3 には、他にもアップロード (upload_file())、ファイル一覧取得 (list_objects_v2())、バケット操作、Presigned URL 生成など、多くの機能があります。これらを活用することで、AWS S3 を利用したアプリケーション開発やデータ処理の自動化をさらに効率化できます。
boto3でS3にファイルをアップロードする方法については下記の記事に解説しています。
最後にPython、AWSの学習に利用できるUdemy
のサイトを紹介します。ぜひ活用ください。
[PR]