AlteryxでGoogle Cloud StorageにAPI接続する方法
Alteryx ACEのAkimasaKajitaniです。
AWSにはS3というクラウドストレージがありますが、Google Cloud Platformにも同様のクラウドストレージの「Google Cloud Storage」というものがあります。S3の場合はS3 Upload/Download toolというものがあり、ギャラリーからダウンロードできますが、Google Cloud Storage用のツールは残念ながらありません。
とは言っても、GCPを使う上では非常に基本的なストレージですのでなんとか使いたいところです。
今回は、Google Cloud StorageにRestAPIを使ってAlteryxからアップロード、ダウンロードする方法を紹介します。
認証について
Google Cloud StorageにRestAPIでアクセスする場合まず認証を行う必要があります。いくつか認証方法が用意されていますが、今回は2つの方法を試したいと思います。
- OAuth2.0でアクセスする
- サービスアカウントファイルを使う方法
OAuth2.0はダウンロードツールを使って実装ができますが、アクセストークンを取得するまでは手動になります。サービスアカウントファイルを使う方法は、ダウンロードツールでは実装できないため、Pythonツールを使って実装する必要があります。
ちなみに、APIキーを使用したアクセスはCloud Storageではできませんでした。
OAuth2.0でアクセスする
この場合はいわゆるBaseA(プログラミングなし)で利用できますが、リフレッシュトークンを取得するまで手動の操作を最初にする必要があります。実際にアクセスする際、以下の情報が必要になります。
- アクセストークン
- リフレッシュトークン
- クライアントID
- クライアントシークレット
このうち、クライアントID、クライアントシークレットについては、OAuthクライアントIDを作成することで取得できます。
アクセストークンとリフレッシュトークンは、OAuth認証を手動で行うことで取得することが可能です。
まず最初に「OAuthクライアントID」を作成する必要があります。
GCPのメニューの「APIとサービス」から「認証情報」にて「OAuthクライアントID」を作成します。
アプリケーションの種類としては「デスクトップアプリ」を選択してみました。
適当に「名前」(この名前は単なる識別子なのでなんでもよさそうです)を決めて、作成ボタンをクリックしましょう。
これで、作成されますが、作成後の画面にてクライアントIDとクライアントシークレットが確認できるので、手元にコピーしておきましょう(これらはあとからでも確認可能です)。
次に、リフレッシュトークンを取りに行きましょう。手動でのブラウザ操作、ブラウザに貼り付けるためのURLの作成、CURLの実行が必要になります。
まず、ブラウザに貼り付けてOAuth2.0認証するためのURLを作成します。
以下のURLを作成し、ブラウザに貼り付けてアクセスします。
https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/cloud-platform&access_type=offline&include_granted_scope=true&response_type=code&redirect_uri=http://localhost&client_id=[client_id]
※[client_id]のところに、クライアントIDを入れます
認証がうまくいくと、ブラウザ上のURLバーにて、URLが得られるのでここからアクセストークン(コード)を拾います。URLにて、「code=」から「&scope」までのところにある文字列がアクセストークンです。
http://localhost/?code=[access_token]&scope=https://www.googleapis.com/auth/cloud-platform
次に、このアクセストークン(コード)を使ってをコマンドラインのCurlコマンドで実行していきます。以下のようなコマンドを、コマンドラインで実行します。
curl --data "redirect_uri=http://localhost" --data "client_id=[client_id]" --data "client_secret=[client_secret]" --data "code=[code]" --data "grant_type=authorization_code" --data "access_type=offline" https://www.googleapis.com/oauth2/v4/token
それぞれ、
- [cliend_id]はクライアントID
- [client_secret]はクライアントシークレット
- [code]は戻り値から得られたアクセストークン(Code)
を代入します。
これにより、以下のようなJSONが戻り値として得られます。
{
"access_token": "[access_token]",
"expires_in": 3599,
"refresh_token": "[refresh_token]",
"scope": "https://www.googleapis.com/auth/cloud-platform",
"token_type": "Bearer"
}
これで得られる[access_token]、[refresh_token]も使ってダウンロードツールでAPIにアクセスすることが可能になります。
実際にAlteryxのワークフローにするのはここから先になります。つまり、ここまでが前準備です。
全体のワークフローとしては以下のようになります。
リフレッシュトークンを使う場合は、毎回Google Cloud Storageにアクセスする際に認証を取ってからStorageの操作を行う、というやり方になります。
認証を取るのに必要なものは、
- client_id
- client_secret
- grant_type(固定値)
- refresh_token
となるので、これらをテキスト入力ツールにセットします。
これらをダウンロードツールのペイロードにセットし、https://www.googleapis.com/oauth2/v4/tokenに対してPOSTします。
つまり以下のような設定になります。
接続設定はデフォルトのままです。
これにより、JSON形式でアクセストークンが得られますので、JSONパースツールでtoken_typeとaccess_tokenを取得し、フォーミュラツールで組み合わせてAuthorizationを作り、ヘッダにセットして実際のファイルをアップロードしていきます。
つまり、ダウンロードツールは、以下のような設定となります。
ペイロードには、実際にアップロードしたいファイルを設定します。
なお、URLは以下のように設定します。最後の部分にname=でアップロード後のファイル名を指定します。
https://storage.googleapis.com/upload/storage/v1/b/aki_testbacket/o?iuploadType=media&name=[FileName]
手動でrefresh_tokenまで取得する必要がありますが、取得してしまえば運用はそれほど問題にならなさそうです。
サービスアカウントファイルを使う方法
この場合は、完全にPythonツールのお世話になります。
まず、サービスアカウントファイルを入手しましょう。
GCPのメニューの「IAMと管理」の「サービスアカウント」にて、サービスアカウントを作成します。
サービスアカウント名、サービスアカウントID、説明などを適当に入力します。
次に、アクセス権を設定します。なるべく最小限の必要なものだけにしましょう。
Cloud Storageを使うのであれば、「Cloud Storage」の「Storageオブジェクト管理者」などで良いと思います。
作ったサービスアカウントの「操作」の三点ボタンから「鍵を管理」を実行します。
ダウンロード形式が選べるので、JSON形式を選択し、ダウンロードします。
Pythonツールのコードは以下のとおりです。今回は、ワークフローと同じフォルダ内にサービスアカウントの秘密鍵を含むファイルを保存しています。
その他の前提条件は以下のとおりです。
- アクセス先バケット名:aki_testbacket
- 保存ファイル名:txt
- アップロードするファイルのパス:C:\MyDoc\AYX\GoogleStorage\test.txt
from ayx import Package
Package.installPackages(['google.cloud-storage','google-auth'])
from ayx import Alteryx
from google.cloud import storage
import os
#サービスアカウント情報はワークフローと同じフォルダに配置する
service_account_path = os.path.join(Alteryx.getWorkflowConstant("Engine.WorkflowDirectory") , "[YOUR_KEY_FILE_NAME].json")
#google cloud storageのクライアントインスタンスを作成
client = storage.Client.from_service_account_json(service_account_path)
#バケットのインスタンスを取得
bucket = storage.Bucket(client,'aki_testbacket')
blob = bucket.blob('tes2t.txt')
#同名パスがある場合は上書き
blob.upload_from_filename('C:\\MyDoc\AYX\GoogleStorage/test.txt')
これを実行すると、サイレントにアップロードされるので(何も表示がでない)、GCPの方でアップロードされたファイルを確認してください。
ダウンロードについて
ダウンロードについては、refresh_tokenを使った方法で、Google Cloud Storage上のテキストファイル(もしくはCSVファイル)のサンプルとなります。
全体のワークフローとしては、以下のような形になります。
認証取得はアップロードと同じです。ファイルダウンロード時は、アクセスURLが異なり以下のようになります。
https://storage.googleapis.com/storage/v1/b/[バケット名]/o/[ファイル名]?alt=media
ダウンロードツールの設定は、ペイロードでGETとするだけです(ヘッダ設定はアップロードと同じ)。ダウンロードしたいファイルによって、基本設定が変わります。Excelなどバイナリデータの場合は、一度ファイルに書き出してから再接続する必要があります。また、CSVなどのテキスト形式であれば、パースをする必要はありますが、そのまま利用可能です。
つまり、以下のような形で取得できるので、列分割ツールで改行で縦に区切り、列分割ツールでさらにカラム方向に区切れば通常のテーブルデータとして利用可能になります。
いずれにしても色々とややこしいので、CDATAなどのサードパーティのドライバなどを利用して接続するのが、有償ではありますが、一番お手軽かと思います。
参考URL
Uploading files on Google Cloud Storage using Python
https://www.skytowner.com/explore/uploading_files_on_google_cloud_storage_using_python
Google API OAuth2.0のアクセストークン&リフレッシュトークン取得手順メモ
https://qiita.com/kossacks/items/8d279bcc1acc2c2153ab
OAuth 2.0 を使用してGoogle API にアクセスする方法
https://blog.shinonome.io/google-api/
【GCP】Google Cloud Storage を curl コマンドで利用する
https://qiita.com/r-wakatsuki/items/f8154bb010aec461300c