SnowflakeのコストをOmniで日次監視する仕組みを、OmniのAgent機能だけでサクッと作ってみた

SnowflakeのコストをOmniで日次監視する仕組みを、OmniのAgent機能だけでサクッと作ってみた

Snowflakeのコスト増加に悩む社内検証環境の課題解決に向け、BIツール「Omni」のAgent機能だけを使い、要件定義からSemantic Layer作成、Routine設定まで一気通貫で構築できるか試してみました。
2026.08.07

さがらです。

弊社内のSnowflake検証環境で、コストが増加傾向にあることが課題となっていました。この課題に対して、BIツールのOmniのAgent機能だけを使い、要件定義からSemantic Layer作成、Routine設定までを一気通貫で構築できるか試してみました。

https://dev.classmethod.jp/articles/omni-try-routine/

https://docs.omni.co/ai/routines

Routine自体の機能紹介は上記記事にまとめているので、本記事では機能概要の説明は割愛します。

背景・課題

社内の検証用Snowflakeアカウントで、コストが増加傾向にありました。特に、SPCS、Snowflake CoWorkやCoCo関連の利用で急にコストが増加することがありました。

こうした増加要因を都度SQLを書いて調査するのは手間がかかるため、日次でコストを可視化し、増加が大きい場合はSlackに自動通知される仕組みを作りたいと考えました。

技術的アプローチ

今回は、SnowflakeのACCOUNT_USAGEスキーマをBIツールのOmniでモデル化し、以下の2点を構築するアプローチを取りました。

  1. Snowflakeコスト分析用のSemantic Layer(Topic・View)
  2. 前日のコスト増減をSlackに自動配信するRoutine

構築の流れは次の通りです。要件定義からRoutineの作成まで、すべてOmniのAgent機能との対話だけで進めています。

  1. Omni Agentに監視要件を伝え、Topic・View構成のヒアリング・設計をしてもらう
  2. 同じAgentとの対話の中で、Semantic Layer(Topic・View)のYAMLコードとRoutineをまとめて実装してもらう
  3. 作成されたRoutineを実行して、配信内容を確認する

Omniには、モデルIDEでのYAML編集を支援する「Modeling Agent」を含め、複数のAI機能が用意されています。今回はこのAgent機能を要件定義から使い切る形で進めました。Routineについても、Routinesページから作成する方法だけでなく、Omni AgentとのチャットのみでRoutineを新規作成する方法が用意されています。

https://docs.omni.co/ai

制限事項

  • Omniのモデル(View・Topic)は、Agentとのチャットで「変更して」と伝えるだけでは即時反映されません。モデルエディタまたはGitでファイルを保存し、ブランチをPublish(マージ)するまでAgentからは変更後のモデルが見えない状態になります。「Agentだけで完結」といっても、モデル変更のPublishだけは人手の操作が必要になる点はご注意ください
  • Omni Agentがチャット上で対応できるのはRoutineの新規作成のみです。作成後にスケジュール・配信先・受信者を細かく調整したり、一時停止・削除したりする管理操作は、会話内に表示されるEdit routine、またはRoutinesページから行う必要があります

前提条件

  • Snowflakeアカウント: 社内の検証用Snowflakeアカウントを利用しています
  • Snowflake: SNOWFLAKE.ACCOUNT_USAGEスキーマを参照できるロール(IMPORTED PRIVILEGES ON DATABASE SNOWFLAKE相当の権限)が必要です
  • Omni: Snowflakeへの接続設定済みで、Agent機能・Routine機能が利用可能なプランであること
  • Slack連携: Routineの配信先にSlackを使う場合は、事前にOmniとSlackの連携設定が完了していること

事前準備

SnowflakeのACCOUNT_USAGEを参照できるロールを確認する

Omniの接続ユーザーに割り当てているロールが、SNOWFLAKE.ACCOUNT_USAGEスキーマを参照できることを確認しておきます。

-- Omniの接続ユーザーに割り当てているロールで実行し、
-- SNOWFLAKEデータベースへのIMPORTED PRIVILEGESが付与されているか確認する
SHOW GRANTS TO ROLE <Omni接続ユーザーのロール名>;

SNOWFLAKEデータベースに対するIMPORTED PRIVILEGESが一覧に表示されていればOKです。

ACCOUNT_USAGEスキーマをOmniのモデルに取り込む

Omniのモデル画面からスキーマリフレッシュを実行し、SNOWFLAKE.ACCOUNT_USAGEスキーマの各ビューをモデルに取り込みます。

ACCOUNT_USAGE配下のビュー一覧がモデルのView一覧に表示されていればOKです。

2026-08-07_21h53_10

試してみた

1. Omni Agentに要件を伝えて、設計・実装する

Omni上でAgentを開き、次の2つのゴールを伝えながら、作るべきModel・View・Topicの構成をヒアリング・設計してもらいました。不明瞭な点はAgent側から質問してもらう形にしています。

Snowflakeのコストを日次で監視したいです。
以下の2つを実現できるOmniのモデル構成(View・Topic)を設計してください。
不明瞭な点があれば、実装前に私にヒアリングしてください。

1. 毎日の利用状況がわかるダッシュボードを作成したい
2. Omni Routineを使って、前日と一昨日を比較し、
   コスト消費量とその要因オブジェクト・オーナーロールをSlackに通知したい
   (異常が見られる場合は確認すべきオブジェクトとそのオーナーロール、
   Warehouseの場合はクエリを特に回していた人も確認したい)

この内容について、以下のように返ってきました。

2026-08-07_22h01_19

2026-08-07_22h01_45

これに対して、以下のように返答しました。

1. クレジットのままで良いです
2. すべてを含めたく、CoWorkやCoCo、Trust Centerなどを例に、漏れなく抽出したいです
3. JST基準です
4. Slack通知したいのは、「その日1クレジット以上消費したリソース全て」としたいです
5. 単一アカウントのみです
6. <Slackチャンネル名>、朝の6:00です

すると、以下のようにタスクを生成して動き始めました。

2026-08-07_22h08_39

下図のように、Viewが作られていきます。

2026-08-07_22h12_38

今回は3つのViewが作られました。

2026-08-07_22h13_20

併せてリレーションシップの定義もされています。

2026-08-07_22h14_05

Topicも以下のように2つ作られました。

2026-08-07_22h14_55

最後にRoutineが作られました。IDEの画面にRoutineの作成画面が自動で表示されて確認できるのは嬉しいですね。

2026-08-07_22h16_45

作成されたコードのMergeを行って、IDEでの作業は完了です。

作成されたコードについて

今回Agentで作成されたコードについて、参考までに以下にまとめます。

account_usage__snowflake_cost_hourly_jst(Snowflake Daily Cost Topicの元になるView。クリックで展開)
# Reference this view as account_usage__snowflake_cost_hourly_jst
label: Snowflake Cost (JST)
description: METERING_HISTORY を JST に変換した時間単位のクレジット消費。全サービスタイプが漏れなく含まれる、コスト監視の基準View。entity_type / resource_name
  で要因オブジェクトを特定できる。

sql: |
  SELECT
    CONVERT_TIMEZONE('UTC', 'Asia/Tokyo', m.start_time) AS usage_at_jst,
    m.service_type,
    m.entity_type,
    m.name AS resource_name,
    m.database_name,
    m.schema_name,
    m.credits_used,
    m.credits_used_compute,
    m.credits_used_cloud_services
  FROM ${account_usage__metering_history} AS m

dimensions:
  usage_at_jst:
    sql: '"USAGE_AT_JST"'
    label: Usage At (JST)
    description: 利用時刻(JST)。日次監視には [date] を使用。
    timeframes: [ raw, hour, date, week, month, quarter, year, hour_of_day, day_of_week_name ]
    convert_tz: false
    synonyms: [ 利用日, 日付, usage date ]

  service_type:
    sql: '"SERVICE_TYPE"'
    label: Service Type
    description: 課金サービスタイプ。METERING_HISTORY のため全サービスが網羅される。
    synonyms: [ サービス, サービスタイプ ]

  entity_type:
    sql: '"ENTITY_TYPE"'
    label: Entity Type
    description: コストを発生させたオブジェクトの種別(WAREHOUSE, PIPE, MATERIALIZED_VIEW, TASK 等)。
    synonyms: [ オブジェクト種別, リソース種別 ]

  resource_name:
    sql: '"RESOURCE_NAME"'
    label: Resource Name
    description: コストを発生させたオブジェクト名(Warehouse名・Pipe名・Table名など)。
    synonyms: [ リソース, オブジェクト, 要因オブジェクト ]

  database_name:
    sql: '"DATABASE_NAME"'
    label: Database

  schema_name:
    sql: '"SCHEMA_NAME"'
    label: Schema

  resource_full_name:
    sql: COALESCE(${database_name} || '.' || ${schema_name} || '.' || ${resource_name}, ${resource_name})
    label: Resource Full Name
    description: DB.SCHEMA.NAME 形式の完全修飾名。オーナーロールの結合キー。

  credits_used:
    sql: '"CREDITS_USED"'
    hidden: true

  credits_used_compute:
    sql: '"CREDITS_USED_COMPUTE"'
    hidden: true

  credits_used_cloud_services:
    sql: '"CREDITS_USED_CLOUD_SERVICES"'
    hidden: true

measures:
  credits_used_total:
    sql: ${credits_used}
    label: Credits Used
    format: number_4
    description: 消費クレジット合計(compute + cloud services)。
    aggregate_type: sum
    synonyms: [ クレジット, コスト, 消費量 ]

  credits_compute:
    sql: ${credits_used_compute}
    label: Credits (Compute)
    format: number_4
    aggregate_type: sum

  credits_cloud_services:
    sql: ${credits_used_cloud_services}
    label: Credits (Cloud Services)
    format: number_4
    aggregate_type: sum

  resource_count:
    sql: ${resource_full_name}
    label: Resource Count
    aggregate_type: count_distinct

ai_context: |
  Snowflakeコスト監視の基準View。ACCOUNT_USAGE.METERING_HISTORY は課金される全サービスタイプ(Warehouse、Pipe、Auto Clustering、Materialized View、Serverless Task、Snowflake CoWork、Cortex 各種、Trust Center 等)を含むため、コスト総額はこのViewを唯一の真実として扱う。日付は全てJST(Asia/Tokyo)変換済み。
  - 「コスト」「クレジット」は credits_used_total を使う
  - 「要因オブジェクト」は resource_name(+ database_name / schema_name / resource_full_name)
  - entity_type が WAREHOUSE の場合、誰がクエリを回していたかは account_usage__warehouse_query_attribution_jst を参照
  - ACCOUNT_USAGE は最大3時間程度の反映遅延があるため当日データは不完全な場合がある
account_usage__object_owner_role(コスト要因オブジェクトのオーナーロールを引くルックアップView。クリックで展開)
# Reference this view as account_usage__object_owner_role
label: Object Owner Role
description: Table / View / Task / Pipe のオーナーロールを DB.SCHEMA.NAME
  の完全修飾名で統合したルックアップ。コスト要因オブジェクトの確認担当者(オーナーロール)を特定するために使う。削除済みオブジェクトは除外。

sql: |
  SELECT
    t.table_catalog || '.' || t.table_schema || '.' || t.table_name AS resource_full_name,
    t.table_type AS object_type,
    t.table_owner AS owner_role,
    t.owner_role_type
  FROM ${account_usage__tables} AS t
  WHERE t.deleted IS NULL

  UNION ALL

  SELECT
    v.table_catalog || '.' || v.table_schema || '.' || v.table_name AS resource_full_name,
    'VIEW' AS object_type,
    v.table_owner AS owner_role,
    v.owner_role_type
  FROM ${account_usage__views} AS v
  WHERE v.deleted IS NULL

  UNION ALL

  SELECT
    k.task_database || '.' || k.task_schema || '.' || k.task_name AS resource_full_name,
    'TASK' AS object_type,
    k.task_owner AS owner_role,
    k.owner_role_type
  FROM ${account_usage__tasks} AS k
  WHERE k.deleted IS NULL

  UNION ALL

  SELECT
    p.pipe_catalog || '.' || p.pipe_schema || '.' || p.pipe_name AS resource_full_name,
    'PIPE' AS object_type,
    p.pipe_owner AS owner_role,
    p.owner_role_type
  FROM ${account_usage__pipes} AS p
  WHERE p.deleted IS NULL

dimensions:
  resource_full_name:
    sql: '"RESOURCE_FULL_NAME"'
    label: Resource Full Name
    description: DB.SCHEMA.NAME 形式の完全修飾名。コストViewとの結合キー。
    primary_key: true

  object_type:
    sql: '"OBJECT_TYPE"'
    label: Object Type
    description: BASE TABLE / VIEW / TASK / PIPE などのオブジェクト種別。

  owner_role:
    sql: '"OWNER_ROLE"'
    label: Owner Role
    description: オブジェクトのオーナーロール。異常時に確認を依頼すべきロール。
    synonyms: [ オーナーロール, オーナー, 所有者, 担当ロール ]

  owner_role_type:
    sql: '"OWNER_ROLE_TYPE"'
    label: Owner Role Type
    description: ROLE / DATABASE_ROLE などのロール種別。

measures:
  object_count:
    label: Object Count
    aggregate_type: count

ai_context: |
  コスト要因オブジェクトのオーナーロールを引くためのルックアップView。resource_full_name(DB.SCHEMA.NAME)で snowflake_cost_hourly_jst に結合する。owner_role が「確認すべき担当ロール」。Warehouse はオーナーロールを持たないため、Warehouse の責任者特定には warehouse_query_attribution_jst を使う。
account_usage__warehouse_query_attribution_jst(Snowflake Warehouse Query Attribution Topicの元になるView。クリックで展開)
# Reference this view as account_usage__warehouse_query_attribution_jst
label: Warehouse Query Attribution (JST)
description: QUERY_ATTRIBUTION_HISTORY と QUERY_HISTORY を結合し、Warehouse
  クレジットをクエリ単位でユーザー・ロールに帰属させたView。日付は JST。Warehouse
  コストが急増した際に「誰が特にクエリを回していたか」を特定するために使う。

sql: |
  SELECT
    CONVERT_TIMEZONE('UTC', 'Asia/Tokyo', qa.end_time) AS usage_at_jst,
    qa.warehouse_name,
    qa.query_id,
    qa.query_parameterized_hash,
    qa.query_tag,
    qa.user_name,
    qh.role_name,
    qh.role_type,
    qh.warehouse_size,
    qh.database_name,
    qh.schema_name,
    LEFT(qh.query_text, 300) AS query_text_preview,
    qh.total_elapsed_time,
    qa.credits_attributed_compute,
    qa.credits_used_query_acceleration
  FROM ${account_usage__query_attribution_history} AS qa
  LEFT JOIN ${account_usage__query_history} AS qh
    ON qh.query_id = qa.query_id

dimensions:
  usage_at_jst:
    sql: '"USAGE_AT_JST"'
    label: Usage At (JST)
    description: クエリ終了時刻(JST)。
    timeframes: [ raw, hour, date, week, month, hour_of_day ]
    convert_tz: false
    synonyms: [ 日付, 利用日 ]

  warehouse_name:
    sql: '"WAREHOUSE_NAME"'
    label: Warehouse
    synonyms: [ ウェアハウス ]

  query_id:
    sql: '"QUERY_ID"'
    label: Query ID
    primary_key: true

  query_parameterized_hash:
    sql: '"QUERY_PARAMETERIZED_HASH"'
    label: Query Parameterized Hash
    description: パラメータを正規化したクエリハッシュ。反復クエリの特定に使う。

  query_tag:
    sql: '"QUERY_TAG"'
    label: Query Tag

  user_name:
    sql: '"USER_NAME"'
    label: User
    description: クエリを実行したユーザー。
    synonyms: [ ユーザー, 実行者,  ]

  role_name:
    sql: '"ROLE_NAME"'
    label: Role
    description: クエリ実行時のロール。
    synonyms: [ ロール, 実行ロール ]

  role_type:
    sql: '"ROLE_TYPE"'
    label: Role Type

  warehouse_size:
    sql: '"WAREHOUSE_SIZE"'
    label: Warehouse Size

  database_name:
    sql: '"DATABASE_NAME"'
    label: Database

  schema_name:
    sql: '"SCHEMA_NAME"'
    label: Schema

  query_text_preview:
    sql: '"QUERY_TEXT_PREVIEW"'
    label: Query Text (先頭300文字)

  total_elapsed_time:
    sql: '"TOTAL_ELAPSED_TIME"'
    hidden: true

  credits_attributed_compute:
    sql: '"CREDITS_ATTRIBUTED_COMPUTE"'
    hidden: true

  credits_used_query_acceleration:
    sql: '"CREDITS_USED_QUERY_ACCELERATION"'
    hidden: true

measures:
  credits_attributed_total:
    sql: ${credits_attributed_compute}
    label: Credits Attributed
    format: number_4
    description: クエリに帰属された Warehouse コンピュートクレジット。
    aggregate_type: sum
    synonyms: [ クレジット, コスト ]

  credits_query_acceleration:
    sql: ${credits_used_query_acceleration}
    label: Credits (Query Acceleration)
    format: number_4
    aggregate_type: sum

  query_count:
    sql: ${query_id}
    label: Query Count
    aggregate_type: count_distinct
    synonyms: [ クエリ数, 実行回数 ]

  user_count:
    sql: ${user_name}
    label: User Count
    aggregate_type: count_distinct

  total_elapsed_seconds:
    sql: ${total_elapsed_time} / 1000
    label: Total Elapsed (sec)
    format: number_1
    aggregate_type: sum

ai_context: |
  Warehouse コストの人・ロール別内訳View。credits_attributed_compute はクエリ単位に帰属された実際のWarehouseクレジットで、warehouse_name 単位の合計は METERING_HISTORY の Warehouse クレジットにほぼ一致する(クラウドサービス分やアイドル時間分は含まれない)。
  - 「誰がクエリを回していたか」→ user_name / role_name で credits_attributed_total を降順
  - 「どのクエリが重かったか」→ query_id, query_text_preview で降順
  - 日付は usage_at_jst[date] を使う
snowflake_daily_cost.topic(Routineの主Topic。クリックで展開)
base_view: account_usage__snowflake_cost_hourly_jst
base_view_label: Cost
label: Snowflake Daily Cost (JST)
group_label: Snowflake Cost Monitoring
display_order: 1
description: Snowflakeの日次クレジット消費を全サービスタイプ横断で監視するTopic。サービスタイプ・要因オブジェクト・オーナーロール別に分解できる。日付はすべてJST。

default_filters:
  account_usage__snowflake_cost_hourly_jst.usage_at_jst:
    time_for_duration: [ 30 days ago, 30 days ]

joins:
  account_usage__object_owner_role: {}

ai_context: |
  Snowflakeコスト監視のメインTopic。ACCOUNT_USAGE.METERING_HISTORY ベースなので、Warehouse・Serverless Task・Auto Clustering・Materialized View・Snowpipe・Snowflake CoWork・Cortex 各種・Trust Center など課金される全サービスタイプが漏れなく含まれる。

  使い分け:
  - 「今日/昨日のコスト」「日次推移」→ usage_at_jst[date] × credits_used_total
  - 「何が原因か」→ service_type, entity_type, resource_name で分解
  - 「誰に確認すべきか」→ object_owner_role.owner_role(Table/View/Task/Pipe のオーナーロール)
  - Warehouse は owner_role を持たないため、entity_type = 'WAREHOUSE' の場合は Snowflake Warehouse Query Attribution Topic でユーザー・ロール別の内訳を見る
  - 前日と一昨日の比較には period over period(1日前)を使う

  注意: ACCOUNT_USAGE は最大3時間程度の反映遅延があるため、当日分は不完全な場合がある。前日以前で比較すること。

sample_queries:
  daily_credits_by_service_type:
    query:
      fields:
        [
          "account_usage__snowflake_cost_hourly_jst.usage_at_jst[date]",
          account_usage__snowflake_cost_hourly_jst.service_type,
          account_usage__snowflake_cost_hourly_jst.credits_used_total
        ]
      base_view: account_usage__snowflake_cost_hourly_jst
      filters:
        account_usage__snowflake_cost_hourly_jst.usage_at_jst:
          time_for_duration: [ 30 days ago, 30 days ]
      limit: 5000
      sorts:
        - field: account_usage__snowflake_cost_hourly_jst.usage_at_jst[date]
          desc: true
      topic: snowflake_daily_cost
    description: ダッシュボードの主要タイル。日次推移をサービスタイプで分解する。
    prompt: 直近30日の日次クレジットをサービスタイプ別に見たい
  yesterday_resources_with_owner:
    query:
      fields:
        [
          account_usage__snowflake_cost_hourly_jst.service_type,
          account_usage__snowflake_cost_hourly_jst.entity_type,
          account_usage__snowflake_cost_hourly_jst.resource_name,
          account_usage__object_owner_role.owner_role,
          account_usage__snowflake_cost_hourly_jst.credits_used_total
        ]
      base_view: account_usage__snowflake_cost_hourly_jst
      filters:
        account_usage__snowflake_cost_hourly_jst.usage_at_jst:
          is: yesterday
      limit: 500
      sorts:
        - field: account_usage__snowflake_cost_hourly_jst.credits_used_total
          desc: true
      topic: snowflake_daily_cost
    description: Slack通知用の基本クエリ。要因リソースをオーナーロール付きで抽出。
    prompt: 前日のリソース別クレジットとオーナーロールを多い順で
  yesterday_vs_day_before:
    query:
      fields:
        [
          account_usage__snowflake_cost_hourly_jst.service_type,
          account_usage__snowflake_cost_hourly_jst.entity_type,
          account_usage__snowflake_cost_hourly_jst.resource_name,
          account_usage__object_owner_role.owner_role,
          account_usage__snowflake_cost_hourly_jst.credits_used_total
        ]
      base_view: account_usage__snowflake_cost_hourly_jst
      filters:
        account_usage__snowflake_cost_hourly_jst.usage_at_jst:
          is: yesterday
      limit: 500
      sorts:
        - field: account_usage__snowflake_cost_hourly_jst.credits_used_total
          desc: true
      topic: snowflake_daily_cost
      period_over_period:
        - field_name: account_usage__snowflake_cost_hourly_jst.usage_at_jst
          time_unit_name: DAY
          periods_ago: 1
    description: Routine用。前日 vs 一昨日のリソース別増減。
    prompt: 前日と一昨日のリソース別クレジットを比較して
snowflake_warehouse_query_attribution.topic(Warehouseの原因者を特定するTopic。クリックで展開)
base_view: account_usage__warehouse_query_attribution_jst
base_view_label: Query Attribution
label: Snowflake Warehouse Query Attribution (JST)
group_label: Snowflake Cost Monitoring
display_order: 2
description: Warehouseクレジットをクエリ単位でユーザー・ロールに帰属させたTopic。Warehouseコスト急増時に「誰が特にクエリを回していたか」「どのクエリが重かったか」を特定する。日付はJST。

default_filters:
  account_usage__warehouse_query_attribution_jst.usage_at_jst:
    time_for_duration: [ 30 days ago, 30 days ]

joins: {}

ai_context: |
  Warehouse コストの人・ロール・クエリ別内訳Topic。Snowflake Daily Cost Topic で entity_type = 'WAREHOUSE' のコスト増加を見つけたら、このTopicで原因者を特定する。

  使い分け:
  - 「誰がクエリを回していたか」→ user_name / role_name × credits_attributed_total 降順
  - 「どのクエリが重いか」→ query_id, query_text_preview × credits_attributed_total 降順
  - 「反復している重いクエリ」→ query_parameterized_hash で集約し query_count と credits_attributed_total
  - 特定Warehouseに絞るときは warehouse_name でフィルタ

  注意: credits_attributed_total はクエリに帰属されたコンピュートクレジットのみで、アイドル時間やクラウドサービス分は含まれない。総額は Snowflake Daily Cost Topic を正とする。

sample_queries:
  top_users_yesterday:
    query:
      fields:
        [
          account_usage__warehouse_query_attribution_jst.warehouse_name,
          account_usage__warehouse_query_attribution_jst.user_name,
          account_usage__warehouse_query_attribution_jst.role_name,
          account_usage__warehouse_query_attribution_jst.credits_attributed_total,
          account_usage__warehouse_query_attribution_jst.query_count
        ]
      base_view: account_usage__warehouse_query_attribution_jst
      filters:
        account_usage__warehouse_query_attribution_jst.usage_at_jst:
          is: yesterday
      limit: 100
      sorts:
        - field: account_usage__warehouse_query_attribution_jst.credits_attributed_total
          desc: true
      topic: snowflake_warehouse_query_attribution
    description: Warehouseコストの原因者特定。
    prompt: 前日の Warehouse クレジットをユーザー・ロール別に多い順で
  heaviest_queries_yesterday:
    query:
      fields:
        [
          account_usage__warehouse_query_attribution_jst.query_id,
          account_usage__warehouse_query_attribution_jst.warehouse_name,
          account_usage__warehouse_query_attribution_jst.user_name,
          account_usage__warehouse_query_attribution_jst.role_name,
          account_usage__warehouse_query_attribution_jst.query_text_preview,
          account_usage__warehouse_query_attribution_jst.credits_attributed_total
        ]
      base_view: account_usage__warehouse_query_attribution_jst
      filters:
        account_usage__warehouse_query_attribution_jst.usage_at_jst:
          is: yesterday
      limit: 20
      sorts:
        - field: account_usage__warehouse_query_attribution_jst.credits_attributed_total
          desc: true
      topic: snowflake_warehouse_query_attribution
    description: 異常時に確認すべき具体的なクエリ。
    prompt: 前日の重いクエリをクレジット順に20件
relationships(追加した2つのリレーションシップ。クリックで展開)
# コスト要因オブジェクトにオーナーロールを付与する
- join_from_view: account_usage__snowflake_cost_hourly_jst
  join_to_view: account_usage__object_owner_role
  join_type: always_left
  on_sql: ${account_usage__snowflake_cost_hourly_jst.resource_full_name} =
    ${account_usage__object_owner_role.resource_full_name}
  relationship_type: many_to_one

# Warehouse コストを日次でクエリ実行者に紐づける
- join_from_view: account_usage__snowflake_cost_hourly_jst
  join_to_view: account_usage__warehouse_query_attribution_jst
  join_type: always_left
  on_sql: ${account_usage__snowflake_cost_hourly_jst.resource_name} =
    ${account_usage__warehouse_query_attribution_jst.warehouse_name} AND
    ${account_usage__snowflake_cost_hourly_jst.usage_at_jst[date]} =
    ${account_usage__warehouse_query_attribution_jst.usage_at_jst[date]}
  relationship_type: one_to_many
Omni Routineの設定(毎朝6:00 JST、<Slackチャンネル名> へ通知。クリックで展開)
【名前】
Snowflake日次コスト監視(前日 vs 一昨日)

【スケジュール】
0 6 ? * * *  (タイムゾーン: Asia/Tokyo)

【通知先】
Slackチャンネル: <Slackチャンネル名>

【プロンプト】
Snowflake Daily Cost (JST) Topic を使って、前日(JST)と一昨日(JST)のクレジット消費を比較してください。

1. まず全体サマリ: 前日の総クレジットと一昨日の総クレジット、増減量と増減率。

2. 次に「前日に1クレジット以上消費したリソース」を全件リストアップしてください。サービスタイプ、エンティティタイプ、リソース名、オーナーロール(object_owner_role の owner_role)、前日クレジット、一昨日クレジット、増減量を、前日クレジットの多い順に並べてください。前日と一昨日の比較には period over period(1日前)を使ってください。

3. 上記のうち entity_type が WAREHOUSE のリソースが1つ以上ある場合は、Snowflake Warehouse Query Attribution (JST) Topic で、該当Warehouseについて前日のクレジットをユーザー別・ロール別に多い順で上位10件出してください。あわせて前日の重いクエリ上位5件(クエリID、ユーザー、ロール、クエリテキスト冒頭、帰属クレジット)も出してください。

最後に、増加が目立つリソースについて「確認すべきオブジェクトとそのオーナーロール」「Warehouseの場合は特にクエリを回していたユーザー」を簡潔に箇条書きでまとめてください。数値の計算は必ずクエリ結果に含めて行い、自分で暗算しないでください。

2. Routineを試しに実行してみる

試しに、Agentにより作成したRoutineを実行してみます。

指定したSlackに、下図のように配信がされました。指定した条件に沿って、前日と一昨日のクレジット消費から、指定した1クレジットを超える利用量のリソースの一覧が表示されました。

2026-08-07_22h30_05

最後に

OmniのAgent機能だけを使って、要件のヒアリングからSemantic Layer(View・Topic)の実装、Routineの作成・実行確認までを一気通貫で試してみました。

まずはサクッとどのようにできるかを確かめてみる用途では、Snowflake上の実データも確認しながらコーディングしてくれることもあり、とてもおすすめです!

実際に運用するレベルのものを構築する際には、やりたいことを明確にして最初のプロンプトを具体化することを推奨します。


AI白書2026 配布中

クラスメソッドが独自に行なったAI診断調査をもとに、企業のAI活用の現在地を調査レポートとしてまとめました。企業規模別の活用度傾向に加え、規模を超えてAI活用を進める企業に共通する取り組みまで、自社の現在地を捉えるためのヒントにぜひ。

AI白書2026

無料でダウンロードする

この記事をシェアする

関連記事