3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PatheeAdvent Calendar 2019

Day 10

PythonでAWS S3/Azure BlobStorage/GCP CloudStorageにファイルをアップロード/ダウンロードしてみた

Last updated at Posted at 2019-12-10

この記事はPathee Advent Calendar 2019の10日目の記事です。

はじめに

こんにちは。エンジニアの國井です。

PythonAWS 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()

参考ページのリンク

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?