この記事はPathee Advent Calendar 2019の10日目の記事です。
はじめに
こんにちは。エンジニアの國井です。
PythonでAWS S3/Azure BlobStorage/GCP CloudStorageにファイルをアップロード/ダウンロードする方法をまとめてみました。
以前、PythonでAzure BlobStorageにファイルをアップロード/ダウンロードしたことがあり、その流れで他のストレージサービスでもいっちょやってみようと思ったのがキッカケです。
AWS S3/GCP Cloud Storageを選んだのは何となくで、
Pythonなのは、弊社のバックエンドがPythonで実装されているから、といったところです。
各ストレージサービスに対して、以下の項目でまとめていきます。
・事前準備
・ 接続情報の設定
・ モジュールのインストール
・ファイルを格納する箱を作成する
・作成した箱にファイルをアップロードする
・作成した箱からファイルをダウンロードする
・作成した箱を削除する
どのストレージサービスでもモジュールが用意されているので、そのモジュールを使えばわりと簡単にできます。
環境
Python 3.6.4
macOS 10.15.1
AWS S3
事前準備
接続情報の設定
接続情報として、アクセスキーIDとシークレットアクセスキーが必要になります。
AWSアクセスキー作成 を参考に、アクセスキーIDとシークレットアクセスキーを作成します。
以下のコマンドで、環境変数にアクセスキーIDとシークレットアクセスキーを設定します。
$ export AWS_ACCESS_KEY_ID="アクセスキーID"
$ export AWS_SECRET_ACCESS_KEY="シークレットアクセスキー"
モジュールのインストール
boto3をインストールします。
$ pip install boto3
以降のAWS S3に対する各操作をする上で、以下のコードで作成したs3_resourceがベースになります。
import boto3
s3_resource = boto3.resource('s3', region_name='ap-northeast-1')
バケットの作成
AWS S3において、ファイルを格納する箱はバケットと呼ばれます。
以下のコードで、バケットを作成できます。
# バケットの作成
s3_client = s3_resource.meta.client
s3_client.create_bucket(Bucket='作成するバケットの名前', CreateBucketConfiguration={'LocationConstraint': 'ap-northeast-1'})
CreateBucketConfigurationにはいろいろ設定項目がありそうですが、とりあえずLocationConstraint(バケット作成先のリージョンの制約)だけでも作成できます。
ファイルのアップロード
# ファイルのアップロード
s3_resource.Bucket('アップロード先のバケットの名前').upload_file('アップロードするファイルのパス', 'アップロード先でのファイル名')
ファイルのダウンロード
# ファイルのダウンロード
s3_resource.Bucket('ダウンロード元のバケットの名前').download_file('ダウンロードするファイル名', 'ダウンロード先のファイルのパス')
バケットの削除
# バケットの削除
s3_client = s3_resource.meta.client
s3_client.delete_bucket(Bucket='削除するバケットの名前')
バケットを削除するためには、バケットにアップロードしたファイルを全て削除して空っぽにしておく必要あります。
バケットが空っぽでない状態でバケットを削除しようとするとエラーになって削除できません。
以下のコードで、アップロードしたファイルを削除できますが、ファイル名を指定して削除する方法しかわからず、、、(delete_objectsメソッドもありますが、こちらも結局ファイル名を指定しないといけなさそう)
# ファイルの削除
s3_client = s3_resource.meta.client
s3_client.delete_object(Bucket='削除するファイルを含むバケットの名前', Key='削除するファイル名')
Azure BlobStorage
事前準備
接続情報の設定
接続情報として、ストレージアカウントの接続文字列が必要になります。
AzurePortalにサインインして、ストレージアカウントを作成 します。
こちら を参考に、ストレージアカウントの接続文字列を取得(コピー)します。
以下のコマンドで、環境変数に接続文字列を設定します。
$ export CONNECT_STR="接続文字列"
モジュールのインストール
azure-storage-blobをインストールします。
$ pip install azure-storage-blob
以降のAzure BlobStorageに対する各操作をする上で、以下のコードで作成したblob_service_clientがベースになります。
import os
from azure.storage.blob import BlobServiceClient
connect_str = os.getenv('CONNECT_STR')
blob_service_client = BlobServiceClient.from_connection_string(connect_str)
コンテナの作成
Azure BlobStorageにおいて、ファイルを格納する箱はコンテナと呼ばれます。
以下のコードで、コンテナを作成できます。
# コンテナの作成
container_client = blob_service_client.create_container('作成するコンテナの名前')
ファイルのアップロード
# ファイルのアップロード
blob_client = blob_service_client.get_blob_client(container='アップロード先のコンテナの名前', blob='アップロード先でのファイルの名前')
with open('アップロードするファイルのパス', 'rb') as uploaded_file:
blob_client.upload_blob(uploaded_file)
ファイルのダウンロード
# ファイルのダウンロード
blob_client = blob_service_client.get_blob_client(container='ダウンロード元のコンテナの名前', blob='ダウンロードするファイルの名前')
with open('ダウンロード先でのファイルのパス', 'wb') as downloaded_file:
downloaded_file.write(blob_client.download_blob().readall())
コンテナの削除
コンテナにアップロードしたファイルを全て削除しなくても(メソッド内で削除しているかもしれませんが)、コンテナを削除できます。
# コンテナ削除
container_client = blob_service_client.get_container_client('削除するコンテナの名前')
container_client.delete_container()
GCP CloudStorage
事前準備
接続情報の設定
接続情報として、サービスアカウントというクラウドストレージにアクセスするためのアカウントのキー(サービスアカウントキー)が必要になります。
こちら を参考に、サービスアカウントキーを作成して、サービスアカウントキーのJSONファイルをダウンロードします。
以下のコマンドで、環境変数にサービスアカウントキーを設定します。
$ export GOOGLE_APPLICATION_CREDENTIALS="ダウンロードしたJSONファイルのパス"
モジュールのインストール
google-cloudをインストールします。
$ pip install --upgrade google-cloud
以降のGoogle CloudStorageに対する各操作をする上で、以下のコードで作成したstorage_clientがベースになります。
from google.cloud import storage
storage_client = storage.Client()
バケットの作成
GCP CloudStorageにおいて、ファイルを格納する箱はバケットと呼ばれます。
以下のコードで、バケットを作成できます。
# バケットの作成
bucket = storage_client.create_bucket('作成するバケットの名前')
ファイルのアップロード
# ファイルのアップロード
bucket = storage_client.get_bucket('アップロード先のバケットの名前')
blob = bucket.blob('アップロード先でのファイルの名前')
blob.upload_from_filename(filename='アップロードするファイルのパス')
ファイルのダウンロード
# ファイルのダウンロード
bucket = storage_client.get_bucket('ダウンロードするファイルがあるバケットの名前')
blob = bucket.blob('ダウンロードするファイルの名前')
blob.download_to_filename('ダウンロード先のファイルのパス')
バケットの削除
# バケットの削除
bucket = storage_client.get_bucket('削除するバケットの名前')
bucket.delete(force=True)
(AWS S3と同様に)バケットを削除するためには、バケットにアップロードしたファイルを全て削除して空っぽにしておく必要あります。
バケットが空っぽでない状態でバケットを削除しようとするとエラーになって削除できません。
force=Trueにすることで、バケットを空っぽにした上でバケットを削除します。
ちなみに、ファイルの削除は以下のようになります。
# ファイルの削除
bucket = storage_client.get_bucket('削除するファイルがあるバケットの名前')
blob = bucket.blob('削除するファイルの名前')
blob.delete()
参考ページのリンク
- AWS S3
- AWSアクセスキー作成
- Boto3 Docs
- Python boto3 でAWSを自在に操ろう ~入門編~
- AWS S3にPythonで画像ファイルアップロードする方法
- Azure Blob Storage
- クイックスタート: Python用AzureBlobStorageクライアントライブラリ
- github.com/Azure/azure-sdk-for-python
- GCP Cloud Storage
- GoogleCloud: 認証の開始
- CloudStorage: 入門ガイド
- Google Cloud Client Libraries for Python
- GoogleCloudStorageでPythonからファイルをやりとりする方法