
SnowflakeとSplunk Enterprise版をSplunk DB Connectを使用して接続してみた
かわばたです。
今回は表題のとおり、SnowflakeとSplunk Enterprise版をSplunk DB Connectを使用して接続を試していきたいと思います。
【Splunk DB Connect公式ドキュメント】
【Snowflake用JDBCドライバー公式ドキュメント】
対象読者
- SnowflakeとSplunk Enterpriseの接続に興味のある方
検証環境と事前準備
検証環境
- Snowflake トライアルアカウント Enterprise版
- Splunk Enterprise トライアルアカウント
【Splunk Enterprise版インストール手順】
事前準備
ロールやSplunk用のユーザーを作成します。
-- SECURITYADMINロールに切り替え
USE ROLE SECURITYADMIN;
-- Splunk接続用のロールを作成
CREATE OR REPLACE ROLE splunk_role;
-- SYSADMINロールに切り替え
USE ROLE SYSADMIN;
-- Splunk専用の仮想ウェアハウスを作成
CREATE OR REPLACE warehouse SPLUNK_WH
warehouse_size = 'SMALL'
auto_suspend = 5
auto_resume = true
initially_suspended = true
comment = 'SPLUNK ONLY' ;
-- splunk_roleに、作成したウェアハウス(SPLUNK_WH)の使用権限と操作権限を付与
GRANT USAGE, OPERATE on warehouse SPLUNK_WH to role splunk_role;
-- 再びSECURITYADMINロールに切り替え
USE ROLE SECURITYADMIN;
-- Splunk接続用のサービスユーザーを作成
CREATE OR REPLACE USER SPLUNK_DBX_USER
default_warehouse = splunk_wh
default_role = splunk_role
type = 'service'
;
-- splunk_roleに、SNOWFLAKEデータベース(アカウントの使用状況などのメタデータ)へのアクセス権を付与
GRANT IMPORTED PRIVILEGES on database SNOWFLAKE to ROLE splunk_role;
-- SPLUNK_DBX_USERユーザーに、splunk_roleロールを割り当て
GRANT ROLE splunk_role TO USER splunk_dbx_user;
-- ネットワークポリシーを作成
-- 注意:'0.0.0.0/0' は全てのIPアドレスからのアクセスを許可します。
-- 本番環境では、SplunkサーバーのIPアドレスなど、特定のIPに限定することを強く推奨します。
CREATE OR REPLACE NETWORK POLICY splunk_network_policy
ALLOWED_IP_LIST = ('0.0.0.0/0');
-- SPLUNK_DBX_USERユーザーに、作成したネットワークポリシーを適用
ALTER USER SPLUNK_DBX_USER SET NETWORK_POLICY = splunk_network_policy;
-- ⑫ SPLUNK_DBX_USERユーザーに対して、プログラムアクセス・トークン(PAT)を作成
-- このトークンは、パスワードの代わりとなるセキュアな認証情報として使用します。
-- 実行結果として表示されるトークン文字列は再表示できないため、必ず控えてください。
ALTER USER SPLUNK_DBX_USER
ADD PROGRAMMATIC ACCESS TOKEN SPLUNK_TOKEN
ROLE_RESTRICTION = splunk_role
DAYS_TO_EXPIRY = 365;
Splunk DB Connectの仕組み
Splunk DB Connectは、Java Database Connectivity(JDBC)を介してSplunk Enterpriseとリレーショナルデータベースを接続するアドオンです。これにより、Splunk EnterpriseはMySQL、Microsoft SQL Server、Informix、DB2など、様々なデータベースに接続し、データを交換できるようになります。
Snowflakeも専用のドライバーが存在するのでこの仕組みを活用することができます。

実際に試してみた
接続にあたって、Snowflakeコミュニティページを参考にしています。
【参考】
Splunk DBConnectのインストール
下記URLよりSplunk DBConnectをインストールします。
【Splunk DBConnect】

Splunk Enterprise版の画面からAppの管理をクリックします。

下記画面に遷移するので、ファイルからAppをインストールをクリックします。

ポップアップした画面に先ほどインストールしたファイルをアップロードします。

正常にインストールできました。

Snowflake JDBCドライバをインストール
Snowflake JDBCドライバをインストールします。
【Snowflake JDBCドライバ】

Splunk DB Connectと同様の手順でインストールします。

Javaのインストール
Splunk DB Connectのバージョン4.1.1は、Javaバージョン17以降を必要とします。
パッケージリストを更新します。
sudo apt update
OpenJDK 17 (JRE) をインストールします。
sudo apt install openjdk-17-jre
実行中のJavaのパスを表示します。
readlink -f $(which java)
/usr/lib/jvm/java-17-openjdk-amd64/bin/javaだった場合、Splunkに設定すべきパスは**/bin/javaを除いた/usr/lib/jvm/java-17-openjdk-amd64**となります。
Splunk DBConnectの画面で、設定>Settings>General>JRE Installation Path (JAVA_HOME)にJavaのパスを記載します。

Splunk DBConnectの画面で、設定>Settings>Drivers でインストール済のドライバーを確認することができます。
Snowflakeドライバーについても問題なくインストールできていました。

SnowflakeのIDと接続
Splunk DBConnectの画面で、設定>Databases>Identities>New Identity>Username & Passwordをクリックします。

ユーザー名とトークンを入力します。

Splunk DBConnectの画面で、設定>Databases>Connections>New Connectionをクリックします。

下記内容を入力しました。
- Connection名称
- Identity
- Connection Type
- Timezone
- JDBC URL
jdbc:snowflake://<account>.<region>.snowflakecomputing.com/?user=splunk_dbx_user&db=snowflake&role=splunk_role&application=SPLUNK&JDBC_QUERY_RESULT_FORMAT=JSON
JDBC URLの<account>.<region>の確認は下記コマンドを実行いただくと分かりやすいと思います。
SELECT SYSTEM$ALLOWLIST();

Snowflakeログテーブルからデータを取得する
Snowflakeはすべてのログ情報をSnowflake.Account_Usageに保存します。このスキーマは、Splunk_DBX_Userアカウントに共有データベースとして表示されます。
Splunk DBConnectの画面からData Labタブを選択し、New Inputをクリックします。

下記内容を入力しました。
- Connection:先ほど作成したConnection
- Catalog:データベースを選択(SNOWFLAKE)
- Schema:スキーマを選択(ACCOUNT_USAGE)
- テーブル:QUERY_HISTORY

Splunk DB Connectは、バッチモードとRising Columnモードの2つの方法で設定できます。
バッチモードでは、基本的に「Select * from table」を実行することで、毎回テーブル全体が取得されます。Rising Columnモードでは、DB Connectが入力実行ごとに新しい行を追跡するために使用する列を指定できます。「Rising Value」として選択した列は、新しい行が挿入されるたびに値が自動的に増加する列である必要があります。
下記Rising Columnモードの記入例となります。

上記入力完了後、次へをクリックすると入力プロパティの設定の画面となります。
ここでは名称と実行頻度をメインで入力していきます。
実行頻度は、秒数または有効なCRON式で指定します。

上記完了しましたら、下記画面となり設定が完了します。

indexを確認すると下記のようにログが取れていることが確認できました。

キーペア認証について
下記コミュニティページを確認するとキーペア認証についてはネイティブにサポートされていないようでした。
Snowflakeは特定の回避策があると記事が添付されていましたので興味のある方はご確認ください。
【参考URL】
最後に
プログラムアクセス・トークンのところで躓いたり、Javaのバージョン部分で躓いたりと接続まで時間がかかってしまいましたが無事に接続することができました。
キーペア認証がネイティブでサポートされていないので、基本はプログラムアクセス・トークンを利用する形かと思っています。
この記事が何かの参考になれば幸いです!







