Snowpark Container Servicesを用いてElementaryのレポートを閲覧できる環境を構築してみた
さがらです。
Snowpark Container Services(以下SPCS)を用いてElementaryのレポートを閲覧できる環境を構築してみたので、その内容についてまとめてみます。
検証環境
- OS:Ubuntu 24.04 LTS(Windows 11のWSL2を使用)
- Docker環境:Rancher Desktop 1.14.2
- Snowflake CLI: 3.2.1
また、事前にElementaryのレポートはdbtプロジェクトを管理するディレクトリ上で下図のように生成済みであるとし、このdbtプロジェクトのルート階層でDocker及びSPCSに必要なファイルも作成します。
Snowflake上で必要なオブジェクトの作成
今回の検証に使うデータベース・スキーマ・SPCS用のオブジェクトを作成します。
-- ロール切り替え
use role accountadmin;
-- データベースとスキーマを作成
create database if not exists sagara_spcs_test_db;
create schema if not exists sagara_spcs_test_db.elementary_report;
-- 作成したデータベースとスキーマを使用
use database sagara_spcs_test_db;
use schema elementary_report;
-- イメージリポジトリを作成
create image repository if not exists sagara_spcs_test_db.elementary_report.sagara_elementary_repo;
-- コンピュートプールを作成
create compute pool if not exists sagara_elementary_pool
min_nodes = 1
max_nodes = 1
instance_family = cpu_x64_xs
auto_resume = true
auto_suspend_secs = 300
initially_suspended = true;
Dockerfileとspec.ymlを準備
ローカルで、Dockerfile
とspec.yml
を準備します。どちらも対象のdbtプロジェクトのルート階層に作成します。
Dockerfile
FROM nginx:1.27-alpine
COPY ./edr_target/elementary_report.html /usr/share/nginx/html/index.html
COPY ./edr_target/elementary_output.json /usr/share/nginx/html/elementary_output.json
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
spec.yml
spec:
containers:
- name: report-container
image: /sagara_spcs_test_db/elementary_report/sagara_elementary_repo/elementary-report:latest
endpoints:
- name: ui
port: 80
public: true
ローカル環境でコンテナをビルド・動作確認
先ほど作成したDockerfile
を用いて、ローカル環境でコンテナをビルド・動作確認します。
対象のdbt projectのルート階層まで移動し、以下のコマンドを順番に実行します。
# Dockerイメージをビルド
docker build -t elementary-report-image:latest .
# ローカルでコンテナを起動
docker run -d -p 8080:80 --name local-elementary-test elementary-report-image:latest
この後、ブラウザでhttp://localhost:8080
を開くと、下図のようにElementaryのレポートが表示されます。
動作確認が出来たら、ローカルでのコンテナイメージは不要となるため、コンテナを停止してイメージを削除しておきます。
# テスト用コンテナを停止・削除
docker stop local-elementary-test
docker rm local-elementary-test
イメージのプッシュとSPCSへのデプロイ
次に、Snowflakeに対してイメージのプッシュ・デプロイを行います。
# Snowflakeレジストリへのログイン
snow spcs image-registry login
# Snowflake用にイメージをタグ付け
REPO_URL=$(snow spcs image-repository url sagara_elementary_repo --database sagara_spcs_test_db --schema elementary_report)
docker tag elementary-report-image:latest ${REPO_URL}/elementary-report:latest
# イメージをプッシュ
docker push ${REPO_URL}/elementary-report:latest
# SPCSにサービスを作成・デプロイ
snow spcs service create \
sagara_elementary_report_service \
--compute-pool sagara_elementary_pool \
--spec-path spec.yml \
--database sagara_spcs_test_db \
--schema elementary_report \
--role accountadmin
デプロイしたサービスの動作確認
以下のコマンドを実行して、デプロイしたサービスのエンドポイント(アクセス用のURL)を確認します。
# 公開URLを取得
snow spcs service list-endpoints sagara_elementary_report_service --database sagara_spcs_test_db --schema elementary_report --role accountadmin
このURLをブラウザに貼り付けてアクセスすると、認証後に下図のように表示されます!
おまけ:他のユーザーへの展開方法
まず前提として、適切な権限を持っていないユーザーだと、認証を行っても下図のように表示されてしまいます。
実際に他のユーザーに対して作成したSPCSのサービスの権限を付与するためには、「作成したSPCSのサービスのSERVICE ROLE」を閲覧させたいユーザーが権限を持つロールに付与すればOKです!(参考:こちらのDocs)
今回でいうと、以下のクエリを実行すればOKです。サービス作成先のデータベースとスキーマのUSAGE
も忘れず付与することがポイントです。以下のクエリでは付与先をpublic
にしていますが、必要なロールを指定するようにしてください。
# サービス作成先のデータベースとスキーマのUSAGE付与
grant usage on database sagara_spcs_test_db to role public;
grant usage on schema elementary_report to role public;
# 作成したSPCSのサービスのSERVICE ROLEを付与
grant service role sagara_elementary_report_service!all_endpoints_usage to role public;
最後に
Snowpark Container Servicesを用いてElementaryのレポートを閲覧できる環境を構築してみたので、その内容についてまとめてみました。
ElementaryのレポートのようにSnowflakeのユーザーだけに公開できれば十分なものについては、Snowpark Container Servicesを使うと簡単に共有できていいですね!