【AlteryxTips】AlteryxからGCPのGoogle Cloud StorageにAPIで接続する

AlteryxGoogle Cloud StorageAPI接続する方法

 Alteryx ACEのAkimasaKajitaniです。

 

AWSにはS3というクラウドストレージがありますが、Google Cloud Platformにも同様のクラウドストレージの「Google Cloud Storage」というものがあります。S3の場合はS3 Upload/Download toolというものがあり、ギャラリーからダウンロードできますが、Google  Cloud Storage用のツールは残念ながらありません。

 

とは言っても、GCPを使う上では非常に基本的なストレージですのでなんとか使いたいところです。

 

今回は、Google Cloud StorageRestAPIを使ってAlteryxからアップロード、ダウンロードする方法を紹介します。

 

認証について

 

Google Cloud StorageRestAPIでアクセスする場合まず認証を行う必要があります。いくつか認証方法が用意されていますが、今回は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_typeaccess_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/

 

GCPGoogle Cloud Storage curl コマンドで利用する

https://qiita.com/r-wakatsuki/items/f8154bb010aec461300c

 

Alteryxの導入はぜひKCMEで!

セルフサービスデータ分析ツール「Alteryx」は4週間無償トライアルが可能です。

製品に対する操作方法、技術的な質問などは導入前・導入後に関わらずメールにてお答えします。また、Alteryxを用いた環境構築、開発、ヘルプデスク対応、ハンズオン、トレーニング、ワークフロー作成なども承りますので、お気軽にご相談ください。

おすすめの記事