メインコンテンツまでスキップ

Databricks Appsのロギングとモニタリング

効果的なログ記録と監視は、 Databricks Appsのセキュリティイベントを検出して対応するのに役立ちます。 アプリは、アプリケーションレベルのログとプラットフォーム監査ログの両方を生成し、診断、パフォーマンス追跡、セキュリティ分析に使用できます。

アプリケーションログ

注記

Databricks Apps UI またはアプリの URL でログを利用できるようにするには、アプリで出力を stdoutstderrに書き込む必要があります。

アプリケーションログには、次の方法でアクセスできます。

  • アプリ UI : アプリの詳細ページで、[ ログ ] タブをクリックして、標準出力とエラーを表示します。詳細については、「 アプリの詳細を表示する」を参照してください。
  • ダイレクト URL : アプリの URL に /logz を追加します。
    たとえば、アプリの URL が https://my-app-1234567890.my-instance.databricksapps.comの場合、ログは
    https://my-app-1234567890.my-instance.databricksapps.com/logz.

推奨されるログ記録の方法

外部モニタリングおよびリアルタイムアラートシステムと統合するには:

  • ログをJSONまたはその他の機械解析可能な形式でフォーマットします。

  • セキュリティ関連のイベントをコンテキストと共にログに記録します。

    • 認証および承認イベント (ユーザー ID と結果を含む)
    • データアクセスの詳細 (カタログ名、スキーマ名、テーブル名など)
    • セキュリティ関連のエラー (無効なトークン、アクセス許可の拒否、疑わしいアクティビティなど)
  • ログを外部システムに転送します。Application Performance モニタリング (APM) またはログ集約ツールと統合して、リアルタイム アラート、セキュリティ インシデント対応、使用状況とパフォーマンスのアナリティクス、 Databricks システム ログとの相関をサポートします。

ログ記録のセキュリティに関する考慮事項

Databricks アプリは、データ流出を防ぐために、次の組み込みコントロールを使用して設計されています。

  • API のみのアクセス:Databricks アプリは、パブリック を通じてのみ リソースにアクセスできます。DatabricksAPIsこれらの APIs は、システムテーブル ログを通じて監査できます。
  • 暗号化通信 : すべての API トラフィックは TLS 1.2 以降を使用して暗号化され、安全なデータ転送が保証されます。

システムテーブルを使用したセキュリティ監視

Databricks は、 system.access.audit テーブル内のアプリ関連のアクティビティの監査ログをキャプチャします。これらのログをクエリして、ユーザー アクション、アプリ構成の変更、セキュリティ イベントを追跡できます。

監査ログを使用して、次の一般的な監視とセキュリティのシナリオをサポートします。

次のクエリを使用して、セキュリティ関連のアクティビティを監視し、アプリの潜在的な問題を検出します。

アプリのアクセス許可の変更を監視する

このクエリを使用して、アプリのアクセス許可の変更を検出します。

SQL
-- Monitor all app permission modifications in the last 30 days
WITH permission_changes AS (
SELECT
event_date,
workspace_id,
request_params.request_object_id AS app_name,
user_identity.email AS modified_by,
explode(from_json(
request_params.access_control_list,
'array<struct<user_name:string,group_name:string,permission_level:string>>'
)) AS permission
FROM system.access.audit
WHERE action_name = 'changeAppsAcl'
AND event_date >= current_date() - 30
)
SELECT
event_date,
app_name,
modified_by,
permission.user_name,
permission.group_name,
permission.permission_level
FROM permission_changes
ORDER BY event_date DESC

ユーザー API スコープを持つアプリを特定する

このクエリを使用して、ユーザー API スコープが構成されているアプリを検索します。

SQL
-- Find apps created or updated in the last 30 days with user API scopes configured
SELECT
event_date,
get_json_object(request_params.app, '$.name') AS app_name,
user_identity.email AS creator_email,
get_json_object(request_params.app, '$.user_api_scopes') AS user_api_scopes
FROM system.access.audit
WHERE
action_name IN ('createApp', 'updateApp')
AND get_json_object(request_params.app, '$.user_api_scopes') IS NOT NULL
AND event_date >= current_date() - INTERVAL 30 DAYS

ユーザー認証アクションの追跡

このクエリを使用して、ユーザー認証で実行されたアプリのアクションを一覧表示します。

SQL
-- List app actions performed on behalf of users in the last 30 days
WITH obo_events AS (
SELECT
event_date,
workspace_id,
audit_level,
identity_metadata.acting_resource AS app_id, -- OAuth App ID or name
user_identity.email AS user_email, -- Logged-in user
service_name,
action_name
FROM system.access.audit
WHERE event_date >= current_date() - 30
AND identity_metadata.acting_resource IS NOT NULL
)
SELECT
event_date,
app_id,
user_email,
service_name,
action_name,
audit_level,
COUNT(*) AS event_count
FROM obo_events
GROUP BY
event_date, app_id, user_email, service_name, action_name, audit_level
ORDER BY event_date DESC;

Operational モニタリング

システムテーブルを使用して、コストやリソースの使用状況など、アプリの運用面を監視します。

アプリのコストを監視する

system.billing.usage テーブルを使用して Databricks Apps のコストを監視します。次のクエリを使用して、日または月ごとのアプリの正確なコスト情報を取得します。

SQL
-- Get Databricks Apps cost by app per day for the last 30 days
SELECT
us.usage_date,
us.usage_metadata.app_id,
us.usage_metadata.app_name,
SUM(us.usage_quantity) AS dbus,
SUM(us.usage_quantity * lp.pricing.effective_list.default) AS dollars
FROM
system.billing.usage us
LEFT JOIN system.billing.list_prices lp
ON lp.sku_name = us.sku_name
AND us.usage_start_time BETWEEN lp.price_start_time AND COALESCE(lp.price_end_time, NOW())
WHERE
billing_origin_product = 'APPS'
AND us.usage_unit = 'DBU'
AND us.usage_date >= DATE_SUB(NOW(), 30)
GROUP BY ALL