oinume journal

Scratchpad of what I learned

gcloudコマンドを使わずにGoogle Cloud Storageにファイルをアップロードする

概要

gcloudコマンドを使わずにPythonとgoogle-cloudを使ってGoogle Cloud Storage(GCS)に頑張ってファイルをアップロードしてみる。google-cloudはPython向けのGoogle Cloud Platformの何かを操作するためのクライアントライブラリ。GCPの以下の機能の操作がサポートされている。

  • GA
    • Google Cloud Datastore
    • Google Cloud Storage
    • Google Cloud Translation
    • Stackdriver Logging
  • Beta
    • Google BigQuery
    • Google Cloud Natural Language
    • Google Cloud Speech
    • Google Cloud Video Intelligence
    • Google Cloud Vision
  • Alpha
    • Google Cloud Bigtable
    • Google Cloud Bigtable
    • Google Cloud DNS
    • Google Cloud Pub/Sub
    • Google Cloud Resource Manager
    • Google Cloud Runtime Configuration
    • Google Cloud Spanner
    • Stackdriver Error Reporting
    • Stackdriver Monitoring

gcloudコマンドはPython 2.7を必要とするんだけど、Python 2.7をどうしてもインストールできない環境で役立つ話だと思う。自分はHerokuでPython 3.6.x を使っていて、gcloudコマンドのためにPython 2.7をインストールできなくて困っていたのだけど、このgoogle-cloudライブラリを使うようにしてみた。

セットアップ

前提として

  • Python 3.4 以上
  • pip

がインストールされていること。

$ pip install google-cloud

でgoogle-cloudをインストールする。

認証

google-cloudのライブラリを使うにあたり、credentialが必要になる。おそらく一番ラクなのは

  • GCPのConsoleでService Accountを作って
  • そのcredential情報をJSONファイルとして取得し
  • GOOGLE_APPLICATION_CREDENTIALS 環境変数で指定する

ことだと思う。詳しい話は google-authのドキュメントに書いてある。その他の認証のやり方についても詳しく書いてある。

Pythonのスクリプトを実行する前に以下のコマンドで credential 情報のJSONファイルを指定すれば、Pythonのスクリプトでは特に何もしなくてOKだ。

$ export GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json

GCSにファイルをアップロードする

それでは本題。google-cloudのstorageモジュールを使ってGCSにファイルをアップロードしてみる。

  • get_bucketでバケットを取得して
  • blobオブジェクトを作ってアップロードする

感じ。

from google.cloud import storage
import sys


def upload(bucket_name, f):
    client = storage.Client()
    bucket = client.get_bucket(bucket_name)
    new_blob = bucket.blob(f)
    new_blob.upload_from_filename(f)


if __name__ == '__main__':
    if len(sys.argv) < 3:
        print('gcs.py <bucket> <file>', file=sys.stderr)
        sys.exit(1)
    upload(sys.argv[1], sys.argv[2])

まとめ

gcloudコマンドは早くPython3対応するかGoで書き直されて欲しい。

プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで

プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで