以下の内容はhttps://pydocument.hatenablog.com/entry/2023/03/25/224250より取得しました。


Python (Boto3) を使って AWS S3 からファイルを取得・ダウンロードする方法

AWS S3 (Amazon Simple Storage Service) は、高い耐久性、スケーラビリティ、セキュリティを備えたオブジェクトストレージサービスです。この記事では、PythonAWS SDK である Boto3 を使用して、S3 バケットからファイルを取得 (ダウンロード) する方法をコード例を挙げながら解説します。

Boto3 とは?

Boto3 は、AWS 公式の PythonSDK (Software Development Kit) です。 Boto3 を使うことで、Python スクリプトから S3 をはじめとする様々な AWS サービスを簡単に操作できます。

Boto3 は、AWS サービスとの連携を容易にするために設計されています。S3、EC2、DynamoDB、Lambda など主要なサービスのリソース作成、設定変更、削除といった操作を Python から実行できます。AWSAPIPython オブジェクトやメソッドとして抽象化し、直感的で使いやすいインターフェースを提供しているため、開発者は複雑な API の詳細を意識することなく、AWS サービスを利用できます。

AWS S3 からファイルをダウンロードする Python プログラムの作成

1. 準備: 必要な Python ライブラリのインストール

まず、Boto3 ライブラリをインストールします。ターミナルまたはコマンドプロンプトで、以下のコマンドを実行します。

pip install boto3

2. AWS 認証情報の設定

Boto3AWS にアクセスするためには、認証情報が必要です。認証情報を設定する方法はいくつかあります。

方法1: 環境変数で設定する

  • AWS_ACCESS_KEY_ID: アクセスキー ID を設定します。
  • AWS_SECRET_ACCESS_KEY: シークレットアクセスキーを設定します。
  • AWS_DEFAULT_REGION: 利用する AWS リージョン (例: ap-northeast-1 (東京)) を設定します。

  • 設定例 (Linux/macOS)

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 ロールを割り当てることで、インスタンス内で実行するアプリケーションに認証情報を渡す必要がなくなります。

参考: 認証情報の取得方法

  1. AWS マネジメントコンソールにログインします。
  2. IAM (Identity and Access Management) サービスを開きます。
  3. ユーザーを作成するか、既存のユーザーを選択します。
  4. 「認証情報」タブで、「アクセスキーの作成」をクリックします。
  5. アクセスキー 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'): Boto3client を作成します。これにより、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'): Boto3resource を作成します。これにより、S3 リソース (バケット、オブジェクトなど) をオブジェクトとして操作できるようになります。
  • s3_resource.Bucket(bucket_name): 指定された名前の S3 バケットを表すオブジェクトを作成します。
  • .download_file(...): バケットオブジェクトのメソッドとして download_file を呼び出し、ファイルをダウンロードしてローカルに保存します。client を使う場合と比べて、バケットをオブジェクトとして扱えるため、より直感的な記述になっています。

clientresource の違い

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. 実行と確認

  1. 上記の Python スクリプトdownload_s3.py などのファイル名で保存します。
  2. bucket_nameobject_keylocal_file_path は適切な値に書き換えます。
  3. ターミナルまたはコマンドプロンプトで、スクリプトを実行します。
python download_s3.py
  1. スクリプトと同じディレクトリに、downloaded_file.txt (または指定したファイル名) が作成されていれば、ダウンロード成功です。

まとめ

この記事では、PythonBoto3 を使用して AWS S3 からファイルをダウンロードする方法を解説しました。Boto3 には、他にもアップロード (upload_file())、ファイル一覧取得 (list_objects_v2())、バケット操作、Presigned URL 生成など、多くの機能があります。これらを活用することで、AWS S3 を利用したアプリケーション開発やデータ処理の自動化をさらに効率化できます。

boto3でS3にファイルをアップロードする方法については下記の記事に解説しています。

pydocument.hatenablog.com

最後にPythonAWSの学習に利用できるUdemy iconのサイトを紹介します。ぜひ活用ください。

[PR]

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com




以上の内容はhttps://pydocument.hatenablog.com/entry/2023/03/25/224250より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14