こんばんは、エンジニアの眠れない夜です。
ここではGoogleCloudPlatformのCloudStorageにPythonからファイルをアップロード・ダウンローする方法をご紹介します。
分かってしまえばなんて事のない事なのですが、なかなかファイルのアップロードとダウンロードができなくて何時間も費やしてしまいました。
このブログを読んでくださる方は5分もあればCloudStorage(クラウドストレージ)にファイルの保存、取得ができるようになります。
CloudStorage(クラウドストレージ)の概要
- クラウドストレージにアクセスするにはサービス アカウントというクラウドストレージにアクセスするためのアカウントとバケット(ストレージ)を作成します。
- 作成したアカウントの認証キーを使って認証を行います。
- あとはストレージにPythonプログラムからアクセス実行するだけ。
という3ステップになっています。
サービスアカウントの作成(API)
APIの画面に移動してクラウドストレージ関係のAPIが有効になっているか確認してください。有効になっている場合は右側に「無効にする」という表示が出ています。
続いて認証情報のページからサービスアカウントを作成します。
新しいサービスアカウントを選択肢します。
アカウント名を適当につけて、役割をストレージ管理者にます。
キーのタイプはJSONを選択して「作成」します。
JSONファイルがダウンロードされるので大切に保管してください。次のステップで利用します。
クラウドストレージでバケットを作成
ストレージの項目からブラウザを選択すると「バケットを作成」できます。
バケットの名前はまだ誰も使ったことがない名前でないといけないようなのでユニークな名前になるように名前をつけます。
あとは作成を押すだけです。
ここでつけた名前はあとで利用するのでメモしておきましょう。
CloudStorageの認証キーを設定
続いて先ほどダウンロードした認証キーを設定します。キーファイルはパソコンにパスを通してもいいですし、Pythonのプログラム上でパスを通してもOKです。
パスを通す時の変数名は「GOOGLE_APPLICATION_CREDENTIALS」にしてください。認証を行う際にこの変数名にキーファイルが設定されているとそのキーファイルのユーザーを利用してGoogleクラウドに接続します。
設定されていない場合はデフォルトのユーザーが利用されます。
Pythonのプログラム上でパスを通す場合はこのように実行してください
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]='キーファイルのパス'
これだけなので簡単ですね。
ファイルのパスがわからない場合はMacの場合、ターミナルにファイルをドラッグするとファイルのパスを表示してくれます。私はいつもこれをコピペで使っています。タイプミスすることがないので余計な手間が省けます。
※ 絶対パスになってしまうので注意
※ ターミナル上ではスペースの前にバックスラッシュが入りますが、Pythonではバックスラッシュは消してください。
ここまでくればもうクラウドストレージにアクセスできる状態です。
続いてクラウドストレージを操作してみましょう。
PythonからCloudStorageを操作
まずはGoogleクラウドのパッケージをインストールします。
sudo pip install --upgrade google-cloud
インストールができたらストレージに接続します。
import os
from google.cloud import storage
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]='キーファイルのパス'
client = storage.Client()
# https://console.cloud.google.com/storage/browser/[bucket-id]/
bucket = client.get_bucket('バケット名')
※ 先ほどのキーファイルへのパスの設定も合わせて上記のようになります。
※ バケット名は先ほど設定したバケットの名前を使用します。
この状態でバケットに接続ができています。
CloudStorageにファイルをアップロードする方法
バケットにファイルをアップロードするにはblobという関数を使用します。
blob = bucket.blob('保存ファイル名')
blob.upload_from_filename(filename='アップロードファイルパス')
この2行を実行するだけでファイルのアップロードができます。
アップロードができているかは下記の2行で確認できます。list_blobs()でバケットに保存されているファイル一覧を取得できます。
for f in bucket.list_blobs():
print(f)
これで先ほど指定した「保存ファイル名」が表示されればOKです。
バケットにフォルダを作る方法
バケットにフォルダを作ってその中にファイルを保存したい!という人は保存ファイル名を /doc/document.txt
のように入力してください。
すると doc
フォルダの中に document.txt
というファイルが作成されます。アップロードする時に勝手にフォルダを作ってくれるのでフォルダを作るコマンド(mkdir)みたいなのは存在しません。
フォルダ名を間違えてもエラーが返ってこないので注意が必要です。
CloudStorageからファイルをダウンロードする方法
ダウンロードと書きましたが正確には取得の方法です。
blob = bucket.get_blob('ダウンロードファイル名(ファイルパス)')
print(blob.download_as_string())
これで、指定したファイルの中身をstringで取得できました。
最後に
APIキーを作成して、パスを通すだけなので簡単ですよね。
たったこれだけのことでも色々調べながらやるとなかなか到達できなかったので誰かのお役に立てれば幸いです。
Googleの公式ドキュメントって本当に不親切というかなんというか…
誰かが上げている記事のほうが分かりやすいことが多い気がするのは私だけでしょうか…?
コピペで実行したい人のために上で説明した内容をまとめました。ローカルのファイルをアップロードして、そのファイルを取得するという流れになっています。
import os
from google.cloud import storage
#クラウドストレージ(バケット)に接続
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]='キーファイルパス(Json)'
client = storage.Client()
bucket = client.get_bucket('バケット名')
#ファイルをアップロード
blob = bucket.blob('保存ファイル名')
blob.upload_from_filename(filename='ローカルファイルパス')
#アップロードしたファイルをダウンロード
blob2 = bucket.get_blob('取得ファイル名')
print(blob2.download_as_string())
※ 動作確認では保存ファイル名と取得ファイル名は同じ名前を入力してください。
アップロードして、テキストとして取得しただけなのでまだまだ他のファイル形式だったらどうやって保存するんだろ?とか疑問は残りますがその辺りは追い追いどこかで書ければと思います。
この説明だとわからないとか間違ってるところがあるとか色々コメントをいただけると今後の記事更新の励みになります!最後まで読んでいただきありがとうございます。
Twitterもやっているので、フォローいただけると嬉しいです(^^)
追記
DjangoでGoogleCloudStorageを設定する方法も書きました。ぜひこちらもご覧ください。
【Django】GoogleCloudStorageの設定方法
[…] GoogleCloudStorageでPythonからファイルをやりとりする方法 […]