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


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 サービスを利用できます。

退屈なことはPythonにやらせよう 第2版 ノンプログラマーにもできる自動化処理プログラミング [ AI Sweigart ]

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'  # バケット名
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'): Boto3client を作成します。これにより、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'): Boto3resource を作成します。これにより、S3 リソース (バケット、オブジェクトなど) をオブジェクトとして操作できるようになります。
  • s3_resource.Bucket(bucket_name): 指定された名前の S3 バケットを表すオブジェクトを作成します。
  • .upload_file(...): バケットオブジェクトのメソッドとして upload_file を呼び出し、ファイルをアップロードします。client を使う場合と比べて、バケットをオブジェクトとして扱えるため、より直感的な記述になっています。
  • .put_object(...): バケットオブジェクトのメソッドとしてput_objectを呼び出し、ファイルをアップロードします。upload_fileと異なり、ファイルオブジェクトを直接渡せます。

clientresource の違い

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

  1. 上記の Python スクリプトupload_s3.py などのファイル名で保存します。
  2. bucket_namelocal_file_pathobject_key は適切な値に書き換えます。
  3. ターミナルまたはコマンドプロンプトで、スクリプトを実行します。
python upload_s3.py

AWSではじめる生成AI RAGアプリケーション開発から、基盤モデルの微調整、マルチモーダルAI活用までを試して学ぶ [ Chris Fregly ]

  1. AWS マネジメントコンソールで S3 バケットを確認し、ファイルがアップロードされていれば成功です。

大容量ファイルのアップロード (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_fileConfig 引数に、作成した TransferConfig オブジェクトを渡します。

まとめ

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

S3からファイルをダウンロードする方法については下記の記事に解説しています。

pydocument.hatenablog.com

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

[PR]

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com

click.linksynergy.com




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

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