Snowpark Container Servicesを用いてElementaryのレポートを閲覧できる環境を構築してみた

Snowpark Container Servicesを用いてElementaryのレポートを閲覧できる環境を構築してみた

2025.08.22

さがらです。

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に必要なファイルも作成します。

2025-08-21_09h54_25

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を準備

ローカルで、Dockerfilespec.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のレポートが表示されます。

2025-08-22_08h21_17

動作確認が出来たら、ローカルでのコンテナイメージは不要となるため、コンテナを停止してイメージを削除しておきます。

# テスト用コンテナを停止・削除
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

2025-08-22_09h04_44

このURLをブラウザに貼り付けてアクセスすると、認証後に下図のように表示されます!

2025-08-22_09h06_34

2025-08-22_09h10_04

おまけ:他のユーザーへの展開方法

まず前提として、適切な権限を持っていないユーザーだと、認証を行っても下図のように表示されてしまいます。

2025-08-22_09h08_49

実際に他のユーザーに対して作成した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を使うと簡単に共有できていいですね!

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.