概要
Spotfire Serverから、インフォメーションリンク(JDBC)により、Snowflakeに接続し、データを取得する方法について説明します。
本記事では、Microsoft Entra IDをIdPとするOAuth2による接続を行います。
前提
本記事の内容は
Spotfire Serverに対し、Microsoft Entra IDをOpenID ProviderとするOpenID Connect設定が完了していること(参考:OpenID Connectを用いたSpotfire の認証設定(Microsoft Entra ID))
を前提としています。
検証環境
- Spotfire Server 14.0.2 LTS(OS: Windows Server 2022)
- Snowflake(AWS上で提供されているアカウント)
- Snowflake JDBCドライバ(snowflake-jdbc-3.19.1.jar)
Entra ID: OAuth2リソース用アプリケーション 作成
OAuth2リソース用アプリケーションを新規作成します。Microsoft Entra IDのテナントは、Spotfire Serverに対しOpenID Connect設定を実施した際に利用したテナントと同じものとします。
アプリケーションの登録
任意の名前を付与し、シングルテナントモードで作成します。 リダイレクト URIの設定は不要です。
アプリケーション ID URI の設定とスコープの追加
API の公開に移動し、アプリケーション ID URIを設定します。
本記事では、デフォルト値(api://xxx
形式)をセットしています。
また、session:role-any
スコープも追加します。
同意できるユーザーは管理者とユーザーとします。
Snowflakeセキュリティ統合 作成
Snowflakeで以下のクエリを実行し、セキュリティ統合を作成します。
CREATE OR REPLACE SECURITY INTEGRATION <任意のセキュリティ統合名> TYPE = external_oauth ENABLED = true EXTERNAL_OAUTH_TYPE = azure EXTERNAL_OAUTH_ISSUER = 'https://sts.windows.net/<Microsoft Entra ID テナントID>/' EXTERNAL_OAUTH_JWS_KEYS_URL = 'https://login.microsoftonline.com/<Microsoft Entra ID テナントID>/discovery/v2.0/keys' EXTERNAL_OAUTH_AUDIENCE_LIST = ('<OAuth2リソース用アプリケーションのアプリケーション ID URI(api://xxx形式)>') EXTERNAL_OAUTH_TOKEN_USER_MAPPING_CLAIM = 'upn' EXTERNAL_OAUTH_SNOWFLAKE_USER_MAPPING_ATTRIBUTE = 'login_name' EXTERNAL_OAUTH_ANY_ROLE_MODE = ENABLE;
Snowflakeユーザー 作成
Microsoft Entra IDのアクセストークンに対応するユーザーがSnowflakeにまだ存在していない場合は、以下のようなクエリを実行しユーザーを作成しておきます。
CREATE USER IF NOT EXISTS <任意のユーザー名> password = NULL login_name = '<Microsoft Entra IDのアクセストークンに含まれるupnクレームの値>' default_role = <デフォルトロール名>
<Microsoft Entra IDのアクセストークンに含まれるupnクレームの値>
は、以下のいずれかの方法で確認することができます。
Azureポータルでユーザー プリンシパル名を確認
Azureポータルで対象ユーザーのユーザー プリンシパル名を確認することができます。この値がアクセストークンのupnクレームにセットされます。
アクセストークン内のupnクレームを確認
Microsoft Entra IDから発行されるアクセストークン内のupnクレームを事前に直接確認することもできます。以下は、取得したアクセストークンをjwt.ioでデコードした例です。
Snowflake動作確認用ビュー 作成
Snowflakeにどのユーザー(ログイン名)で接続しているかを出力するビューを作成し、後続の動作確認で使用します。
CREATE VIEW DEMO_SALES.PUBLIC.WHOAMI AS SELECT u.LOGIN_NAME FROM SNOWFLAKE.ACCOUNT_USAGE.USERS u WHERE u.NAME = CURRENT_USER();
Snowflake JDBCドライバの配置
Snowflake JDBCドライバ(例:snowflake-jdbc-3.19.1.jar)を以下のように<Spotfire Serverインストールフォルダ>\tomcat\custom-ext-informationservices
に配置します。
C:\spotfire\spotfireserver\14.0.2\tomcat\custom-ext-informationservices\snowflake-jdbc-3.19.1.jar
Snowflake用データソーステンプレート 作成
Configuration Tool上でOAuth2に対応したSnowflake用データソーステンプレートを作成します。
以下XMLの<Microsoft Entra ID テナントID>
と<OAuth2リソース用アプリケーションのアプリケーション ID URI(api://xxx形式)>
を実際の値に置換してください。
<jdbc-type-settings> <type-name>snowflake_oauth2_entraid</type-name> driver>net.snowflake.client.jdbc.SnowflakeDriver</driver> <connection-url-pattern>jdbc:snowflake://<account_identifier>.snowflakecomputing.com</connection-url-pattern> <connection-properties> <connection-property> <key>authenticator</key> <value>oauth</value> </connection-property> </connection-properties> <credentials-provider-class>com.spotfire.ws.im.ds.sql.TokenCredentialsProvider</credentials-provider-class> <credentials-provider-init-params> <parameter> <key>issuer</key> <value>https://login.microsoftonline.com/<Microsoft Entra ID テナントID>/v2.0</value> </parameter> <parameter> <key>scope</key> <value><OAuth2リソース用アプリケーションのアプリケーション ID URI(api://xxx形式)>/session:role-any</value> </parameter> <parameter> <key>access_token_property_name</key> <value>token</value> </parameter> </credentials-provider-init-params> <supports-catalogs>true</supports-catalogs> <supports-procedures>false</supports-procedures> <supports-schemas>true</supports-schemas> <fetch-size>10000</fetch-size> <batch-size>100</batch-size> <use-ansii-style-outer-join>true</use-ansii-style-outer-join> </jdbc-type-settings>
Spotfire Serverサービスの再起動
保存後、Spotfire Serverサービスを再起動します。
インフォメーションリンク データソース作成
Spotfire AnalystからSpotfire Serverに接続し、Snowflakeデータソースを作成します。
Spotfire AnalystからSpotfire Serverにログイン
Spotfire AnalystからSpotfire ServerにOpenID Connect(Microsoft Entra ID)でログインします。
データソース作成
インフォメーションデザイナーを開き、データソースをセットアップします。
設定項目は以下のとおりです。
項目 | 内容 |
---|---|
タイプ | 作成したSnowflake用Data Source Template |
接続 URL | jdbc:snowflake://<アカウント>.snowflakecomputing.com?warehouse=<使用するウェアハウス>&role=<使用するロール> |
認証方法 | ID プロバイダ (OAuth2) |
接続 URL内のwarehouse
およびrole
プロパティは、ユーザーにSnowflake側でDEFAULT_WAREHOUSE
、DEFAULT_ROLE
が設定されていれば省略可能です。
データソースアイコンの+を展開し、接続対象のデータベースが表示されることを確認します。
以下の例では、デフォルトロールではない別のロールを指定することで、いくつかのデータベースへの権限がなくなり、非表示となっています。
インフォメーションリンク作成
Snowflakeデータソースからインフォメーションリンクを作成し、正常にデータが取得できることを確認します。
ここでは、DEMO_SALES.PUBLICに作成したWHOAMIビューからインフォメーションリンクを作成し、データを取得します。
Spotfire AnalystからSpotfire Serverにログインするときに使用したMicrosoft Entra IDのアカウント(ログイン名)が出力されていることを確認します。