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
ログインするとコメントを投稿できます。




