Looker から Snowflake の DB を OAuth 認証で参照する設定例を記載します。
参考資料: Looker / feedbackSnowflake / Configuring OAuth for Snowflake connections
Snowflake 内の Looker 用 Role/User/Warehouse/DB 作成
Role と User を Looker 用に作成します。
USE ROLE USERADMIN;
CREATE ROLE looker_role;
GRANT ROLE looker_role TO ROLE SYSADMIN;
CREATE USER looker_user PASSWORD='looker_user';
GRANT ROLE looker_role TO USER looker_user;
ALTER USER looker_user SET DEFAULT_ROLE='LOOKER_ROLE' DEFAULT_WAREHOUSE='LOOKER_WH';
Warehouse と DB を Looker 用に作成します。
USE ROLE SYSADMIN;
CREATE WAREHOUSE looker_wh WAREHOUSE_SIZE=XSMALL AUTO_SUSPEND=60 AUTO_RESUME=true INITIALLY_SUSPENDED=true;
GRANT USAGE ON WAREHOUSE looker_wh TO ROLE looker_role;
CREATE DATABASE looker_db;
CREATE SCHEMA looker_db.looker_scratch;
CREATE TABLE looker_db.looker_scratch.mytbl (c1 STRING, c2 DATE);
INSERT INTO looker_db.looker_scratch.mytbl (c1, c2) VALUES ('abc', '2023-01-01');
GRANT USAGE ON DATABASE looker_db TO ROLE looker_role;
GRANT USAGE ON SCHEMA looker_db.looker_scratch TO ROLE looker_role;
GRANT SELECT ON ALL TABLES IN SCHEMA looker_db.looker_scratch TO ROLE looker_role;
Snowflake 内の Looker 用 Security Integration 作成
関連資料: CREATE SECURITY INTEGRATION
USE ROLE ACCOUNTADMIN;
CREATE SECURITY INTEGRATION looker_integration TYPE=oauth ENABLED=true OAUTH_CLIENT=looker OAUTH_REDIRECT_URI='https://xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.looker.app/external_oauth/redirect';
OAUTH_CLIENT_ID と OAUTH_CLIENT_SECRET の値を確認します。Security Integration の名称は大文字で作成されていることに注意します。
SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('LOOKER_INTEGRATION');
Looker 内の Database Connection 作成
Add Conneciton をクリックします。

以下の事項に注意して値を入力します。

- Host:
https://は不要です。Account Identifiers に記載の情報を参照して、Snowflake の識別子を入力します。 - Database: Snowflake 内部では大文字で管理されていることに注意します。
- Schema: Snowflake 内部では大文字で管理されていることに注意します。
Test をクリックします。

Login to OAuth をクリックします。

ポップアップに認証情報を入力します。

許可をクリックします。

OAuth 認可コードのフロー
許可をクリックすると、Connections の画面に遷移します。遷移するまでの間に、OAuth の認可コードが Looker に渡されていることが確認できます。Chrome の Preserve log にチェックを入れておくことで、画面遷移中のリクエストも確認できます。
上から 3つ目のログが、許可ボタンをクリックした直後のものです。

Snowflake OAuth に対して認可コードの発行を求めています。

一般的な OAuth では HTTP 302 が返されることが期待されますが、HTTP 200 が返されていることが分かります。

上記のとおり HTTP 200 ではありましたが、一般の OAuth と同様に、redirectUri に指定した Looker の URL に HTTP GET リクエストが発生したことが分かります。クエリストリングで認可コードが Looker に渡されました。

redirectUri へのアクセスのレスポンスとしては HTTP 302 となっており、Connections 管理画面に遷移することとなります。

Snowflake 内のアクセスログ
OAuth 認可コードのフローが完了した段階で、Snowflake 内のアクセスログは以下のようになっています。
関連資料: LOGIN_HISTORY , LOGIN_HISTORY_BY_USER
SELECT * FROM TABLE(INFORMATION_SCHEMA.LOGIN_HISTORY_BY_USER(USER_NAME => 'looker_user', RESULT_LIMIT => 1000)) ORDER BY event_timestamp;
パスワードログインのログが確認できます。アクセス元IP は、OAuth 認証を行ったユーザーのものです。

IS_SUCCESS が YES となっています。

OAuth アクセストークンのフロー
pendo.looker.app などのアクセスは Connections ページへの遷移後のものです。

Test をクリックします。Snowflake OAuth が完了していない場合は、以下のような表記になります。

Snowflake OAuth が完了している場合は、以下のような表記になります。

Snowflake Resource Server へのアクセス (JDBC_DRIVER がクライアントとなっているアクセス) は、ユーザーのブラウザではなく、Looker サーバであることに注意します。以下のように、Looker サーバの IP アドレスがアクセス元になります。


Snowflake OAuth Authorization Flow について、Step1-2 の Client Application がユーザーの Web ブラウザであるのに対して、Step3-4 の Client Application は Looker サーバーとなっています。実際に、上記 Test ボタンを押したあとの Chrome のネットワークログには、アクセストークン取得に関するログは出力されていません。

OAuth 認証が失敗する場合
Snowflake 側でのログの確認
Auditing OAuth Logins で Snowflake 側のログ確認が可能です。
SELECT * FROM TABLE(INFORMATION_SCHEMA.LOGIN_HISTORY_BY_USER(USER_NAME => 'looker_user', RESULT_LIMIT => 1000)) ORDER BY event_timestamp;
注意: Information schema は即時でログが確認可能です。ACCOUNT_USAGE schema は確認できるまでに時間を要します。
Snowflake OAuth と External OAuth
Looker / feedbackSnowflake / Configuring OAuth for Snowflake connections で手順がサポートされているのは、OAuth の authorization server が Snowflake OAuth の場合のみです。External OAuth として Auth0 を用いている場合などは含みません。

OAuth フローの再実行
Looker 画面右上の Account から OAuth Connection Credentials の Reauthorize をクリックすることで、OAuth フローを再実行して検証できます。

Looker バージョン
Looker のバージョンが Snowflake をサポートしているか確認します。
Snowflake supports the following features as of Looker 23.12
認可コードの取得でエラーになる場合
前述のとおり、Snowflake OAuth Authorization Flow の Step1-2 のアクセス元IP は、ユーザーの Web ブラウザ側です。looker_user に適用される Network Policy が、アカウントレベルまたはユーザーレベルで設定されている場合、該当の IP アドレスが許可されている必要があります。

アクセスが許可されていない場合は、以下のようなエラーとなります。

アクセストークンの取得でエラーになる場合
前述のとおり、Snowflake OAuth Authorization Flow の Step3-4 のアクセス元IP は、Looker サーバです。

Step3 において、アカウントレベルの Network Policy で該当の IP (Looker サーバの IP) が許可されていない場合は、以下のようなエラーになります。Step3 においては、looker_user のユーザーレベルで設定されている Network Poliy の値は意味を持ちません。

Step4 において、アカウントレベルまたはユーザーレベルで looker_user に適用される Network Policy が、該当の IP (Looker サーバの IP) を許可していない場合は、以下のようなエラーになります。

Step3 について、アカウントレベルの Network Policy で該当の IP (Looker サーバの IP) を許可することを避けるためには、Security Integration 専用の Network Policy を設定できます。参考資料: Snowflake OAuth Overview / Network Policies
CREATE NETWORK POLICY mypolicy3 ALLOWED_IP_LIST = ('35.199.188.212');
ALTER SECURITY INTEGRATION looker_integration SET NETWORK_POLICY = MYPOLICY3;
注意: 内部的には大文字で管理されています。大文字で Network Policy 名を指定する必要があります。
Looker サーバの IP アドレスを取得するためには、以下のようなページを参照します。
補足: ALTER SECURITY INTEGRATION (Snowflake OAuth)
The network policy restricts the list of user IP addresses when exchanging an authorization code for an access or refresh token and when using a refresh token to obtain a new access token. If this parameter is not set, the network policy for the account (if any) is used instead.
上記ページで NETWORK_POLICY をサポートするのは CUSTOM だけと読み取れますが、実際には Looker 用の security integration でも設定できます。
クエリ実行例
SQL Runner を実行する例です。

記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- GKE における Node および Pod の autoscaling
Google Kubernetes Engine (GKE) における autoscaling について、用語の意味を整理します。 GKE の機能による Node の autoscaling GKE のクラスタには Standard と Autopilot の二種類が存在します。 Autopilot の場合は Node は Google によって管理されるため、自動で autoscaling され... - Snowflake におけるネットワーク関連の設定
本ページではネットワーク関連の設定について記載します。 Network Policy によるアクセス元 IP 制限 IPv4 で指定します。IPv6 は 2021/9/21 時点では利用できません。 allowed list で許可されていない IP は block されます。 allowed list が /24 等で指定されており、その一部を - VPC Service Controls に関する雑多な事項の整理
VPC Service Controls (VPC-SC) に関する雑多な事項を記載します。 Private Google Access の基本形 Private Google Access は外部 IP を持たない VM のための機能です。VPC の機能ですが、VPC-SC と関連するため基本事項を記載します。 [Private Google Access](ht - AWS IAM Role を GCP から STS 認証で利用する設定例
GCP から AWS IAM Role を利用するための設定例を記載します。 GCP Service Account の作成 Service Account を作成して Unique ID を確認します。 AWS IAM Role の作成 Trust relationship の設定は Web Identity を選択します。Identity Provider - Amazon Comprehend を GCP VPC 内から実行する設定の例 (Public Internet 接続なし)GCP DLP に相当する AWS サービスに Amazon Comprehend が存在します。GCP VPC 内から Public Internet を経由せずに利用する設定の例を記載します。 AWS VPC と GCP VPC の作成 クラウド 項目 値 AWS VPC region ap-northeast-1 AWS VPC CIDR 10.2.0.0/16 AWS ap-north




