Snowflake OAuthを利用して、パートナーアプリケーションの「ThoughtSpot」からOAuthで接続してみた

2021.08.30

こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。

Snowflakeには、「Snowflake OAuth」という組み込みのOAuthサービスが用意されており、OAuth 2.0ベースの認証を利用することができます。

また、パートナーアプリケーションとしてサポートされているアプリケーション向けには、簡単に構成することができます。

今回は、パートナーアプリケーションとしてサポートされている「ThoughtSpot」からOAuthでの接続を試してみます。手順は下記のドキュメントに記載されているので、こちらに沿って実施していきます。

なお、対応しているパートナーアプリケーションの一覧についても、こちらのドキュメントに記載されています。

前提条件

前提として、接続を行う「ThoughtSpot」のアカウントを用意しておきます。

今回は下記のエントリを参考にして「ThoughtSpot Cloud」のトライアルアカウントを用意しました。

ちなみに

Snowflakeには「Snowflake Partner Connect」という、パートナーアプリケーションの利用開始と接続を簡単に実行できる仕組みもあります。詳しくは下記のエントリが参考になりました。

また、今回は「OAuth」での接続を試しますが、ユーザー名やパスワードによる接続については下記のエントリが分かりやすいです。

OAuth 統合を構成する

では、本題のSnowflake OAuthを始めていきます。

まずはアカウント管理者(ACCOUNTADMINロール)で、下記を実行しSECURITY INTEGRATIONを作成します。

ThoughtSpotの場合の設定方法は下記ドキュメントに記載されていますので、こちらを参考に作成します。

今回は、以下のコマンドで作成します。

USE ROLE ACCOUNT ADMIN;

CREATE SECURITY INTEGRATION THOUGHT_SPOT_OAUTH_SECURITY_INTEGRATION
  TYPE = OAUTH
  ENABLED = TRUE
  OAUTH_CLIENT = CUSTOM
  OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'
  OAUTH_REDIRECT_URI = 'https://try.thoughtspot.cloud/callosum/v1/connection/generateTokens'
;
╒═══════════════════════════════════════════════════════════════════════════╕   
│ status                                                                    │
╞═══════════════════════════════════════════════════════════════════════════╡
│ Integration THOUGHT_SPOT_OAUTH_SECURITY_INTEGRATION successfully created. │
╘═══════════════════════════════════════════════════════════════════════════╛
1 Row(s) produced. Time Elapsed: 0.224s

なお、今回は指定していないので「更新トークンの有効期間」はデフォルトの7,776,000秒 → 90日ですが、oauth_refresh_token_validity = 360000 すなわち 360,000秒 → 10時間 のようにパラメータで指定することもできます。

作成ができたら「クライアントID」と「クライアントシークレット」を取得します。

SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('THOUGHT_SPOT_OAUTH_SECURITY_INTEGRATION');
╒════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╕
│ SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('THOUGHT_SPOT_OAUTH_SECURITY_INTEGRATION')                                                                                                                    │
╞════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡
│ {"OAUTH_CLIENT_SECRET_2":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=","OAUTH_CLIENT_SECRET":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=","OAUTH_CLIENT_ID":"XXXXXXXXXXXXXXXXXXXXXXXXXXX="} │
╘════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╛
1 Row(s) produced. Time Elapsed: 0.371s

取得したら、OAUTH_CLIENT_IDOAUTH_CLIENT_SECRETを利用して、ThoughtSpot側で接続を作成します。

ThoughtSpotで接続を作成する

では、ThoughtSpotで接続を作成しましょう。

まずは任意の名前の接続名をつけて、データウェアハウスを選択します。

つぎに、Use OAuthを選択してSnowflakeのアカウント名、OAuthのクライアントIDとクライアントシークレット、データベース名を入力します。

ここで次に進もうとすると、Snowflake側の画面でログイン認証を求められるので認証します。

ログイン認証すると、アクセス許可を求められるので「許可」します。

最後にテーブルを選択して完了です。(今回は1テーブルだけ選択しました)

なお、ThoughtSpotのドキュメントにも記載されていますが、注意点としてSnowflakeのウェアハウスはSnowflakeユーザの「デフォルトウェアハウス」が利用されます。ですので、事前にSnowflakeユーザの「デフォルトウェアハウス」が指定されていない場合はクエリに失敗するので注意が必要です。

以下のようなクエリで事前に「デフォルトウェアハウス」を指定しておくと良いと思います。

ALTER USER FOO_BAR SET DEFAULT_WAREHOUSE = 'X_SMALL_WH';

まとめ

以上、Snowflake OAuthを利用して、パートナーアプリケーションの「ThoughtSpot」からOAuthで接続してみました。

OAuthをやろうとすると、「認証」と「認可」について考えたり、処理フローを考慮する必要が出てきますが、サポートされているアプリケーションやの場合は指定された設定を行えば良いだけですので簡単ですね。

サポートされていないアプリケーションの場合には、下記ドキュメントに記載のとおり「カスタムクライアント用のSnowflake OAuth の構成」もサポートされているので、このドキュメントを参考に実装できそうです。

どなたかのお役に立てば幸いです。それでは!

参考