효과적인 로깅 및 모니터링은 Databricks 앱에서 보안 이벤트를 감지하고 대응하는 데 도움이 됩니다. 앱은 진단, 성능 추적 및 보안 분석에 사용할 수 있는 애플리케이션 수준 로그와 플랫폼 감사 로그를 모두 생성합니다.
애플리케이션 로그
Databricks 앱 UI 또는 앱의 URL을 통해 로그를 사용할 수 있도록 하려면, 앱에서 출력을 stdout 및 stderr에 기록해야 합니다.
다음과 같은 방법으로 애플리케이션 로그에 액세스합니다.
- 앱 UI: 표준 출력과 오류를 보려면 앱의 로그 탭을 클릭하세요. 자세한 내용은 Databricks 앱에 대한 세부 정보 보기를 참조하세요.
-
직접 URL: 앱 URL에 추가
/logz합니다. 예를 들어, 앱 URL이https://my-app-1234567890.my-instance.databricksapps.com인 경우, 로그는https://my-app-1234567890.my-instance.databricksapps.com/logz에서 확인할 수 있습니다.
비고
Azure Databricks 앱 컴퓨팅이 종료되면 로그를 유지하지 않습니다. 영구 로깅의 경우 외부 로깅 서비스와 통합하거나 Unity 카탈로그 볼륨 또는 테이블에 로그를 씁니다.
로그 항목은 출처별로 그룹화되어 있습니다. 로그 탭에서 소스 필터를 사용해 각 소스의 항목을 표시하거나 숨기세요:
- 앱: 앱에서 표준 출력을 내는 것.
- 시스템: 배포 및 시작 등 앱 수명 주기에 관한 플랫폼 메시지.
- 빌드: 의존성 설치와 앱 빌드 결과물.
- HTTP: 앱이 제공하는 요청에 대한 HTTP 접근 로그입니다. HTTP 접근 로그를 참조하세요.
HTTP 접근 로그
Databricks 앱은 앱이 제공하는 각 요청마다 HTTP 접근 로그 항목을 기록합니다. 이 항목들은 로그 탭의 HTTP 소스 아래와 /logz URL에 나타나며, 앱의 표준 출력 및 오류 옆에 표시됩니다.
접근 로그는 인증된 요청과 인증되지 않은 요청을 모두 포함하며, 승인에 실패한 요청과 같이 앱에 도달하기 전에 거부된 요청도 포함됩니다. 거부된 요청이 기록되기 때문에, 실패한 권한 부여 시도를 보안 이벤트로 감사할 수 있습니다.
기록되는 내용에는 다음과 같은 제한이 적용됩니다:
- 민감한 데이터를 보호하기 위해 쿼리 문자열은 요청 경로에서 제거되어, 쿼리 매개변수로 전달된 토큰이나 기타 민감한 값은 기록되지 않습니다.
- 잡음을 줄이기 위해 인증 콜백이나 건강 상태 확인과 같은 플랫폼 내부 요청은 제외됩니다.
부하가 많을 때는 Azure Databricks가 일부 접근 로그 항목을 빠뜨릴 수 있습니다. 항목이 삭제될 때, 로그에는 삭제된 항목 수를 보고하는 인라인 메시지가 포함됩니다.
로그 입력 형식: 각 항목은 Apache 통합 로그 형식을 사용합니다. 다음은 예시 항목입니다:
203.0.113.10 - jane.doe@example.com [23/Jul/2026:15:04:05 +0000] "GET /api/data HTTP/1.1" 200 1234 "https://apps.example.com/" "Mozilla/5.0"
각 항목은 순서대로 다음 필드를 포함합니다. 빈 필드는 하이픈(-)으로 나타납니다.
| Field | Example | Description |
|---|---|---|
| 클라이언트 IP | 203.0.113.10 |
요청한 클라이언트의 IP 주소입니다. |
| 사용자 | jane.doe@example.com |
인증된 사용자, 또는 - 인증되지 않은 요청에 대해. |
| 시간표시 | [23/Jul/2026:15:04:05 +0000] |
요청이 접수된 날짜와 시간. |
| 요청 라인 | "GET /api/data HTTP/1.1" |
HTTP 메서드, 쿼리 문자열이 제거된 요청 경로, 그리고 프로토콜. |
| 상태 코드 | 200 |
HTTP 응답 상태 코드입니다. |
| 응답 크기 | 1234 |
응답 본문의 크기, 바이트 단위입니다. |
| 리퍼러 | "https://apps.example.com/" |
요청 헤더의 Referer 값입니다. |
| 사용자 에이전트 | "Mozilla/5.0" |
요청 헤더의 User-Agent 값입니다. |
외부 로깅 서비스와 통합
영구 로깅 및 고급 모니터링 기능의 경우 다음을 사용합니다.
앱 텔레메트리 (베타): 트레이스, 로그, 메트릭을 Unity 카탈로그 테이블로 직접 수집할 수 있습니다. Databricks 앱에 대한 원격 분석 구성을 참조하세요.
애플리케이션 성능 모니터링(APM) 도구: New Relic, Datadog 또는 유사한 애플리케이션 성능 모니터링 도구를 사용하여 로그, 지표, 추적을 수집하고 분석하세요.
사용자 지정 로그 지속성: 장기 저장 및 분석을 위해 Unity 카탈로그 볼륨이나 테이블에 주기적으로 로그를 기록합니다.
로그 서식 및 콘텐츠에 대한 지침은 권장 로깅 방법을 참조하세요.
권장되는 로깅 방법
외부 모니터링 및 실시간 경고 시스템과 통합하려면 다음을 수행합니다.
- JSON 또는 기타 컴퓨터 구문 분석 가능한 형식으로 로그의 서식을 지정합니다.
- 컨텍스트를 사용하여 보안 관련 이벤트를 기록합니다.
- 사용자 ID 및 결과를 포함한 인증 및 권한 부여 이벤트
- 카탈로그, 스키마 및 테이블 이름과 같은 데이터 액세스 세부 정보
- 잘못된 토큰, 권한 거부 및 의심스러운 활동과 같은 보안 관련 오류
- 로그를 외부 시스템으로 전달합니다. APM 또는 로그 집계 도구와 통합하여 실시간 경고, 보안 인시던트 대응, 사용 및 성능 분석 및 Azure Databricks 시스템 로그와의 상관 관계를 지원합니다.
로깅에 대한 보안 고려 사항
Databricks 앱은 데이터 반출을 방지하기 위해 다음과 같은 기본 제공 컨트롤로 설계되었습니다.
- API 전용 액세스: 앱은 공용 Azure Databricks API를 통해서만 Azure Databricks 리소스에 액세스할 수 있습니다. 이러한 API는 시스템 테이블 로그를 통해 감사할 수 있습니다.
- 암호화된 통신: 모든 API 트래픽은 보안 데이터 전송을 보장하기 위해 TLS 1.2 이상을 사용하여 암호화됩니다.
시스템 테이블을 사용하여 보안 모니터링
Azure Databricks system.access.audit 테이블에서 앱 관련 활동에 대한 감사 로그를 캡처합니다. 이러한 로그를 쿼리하여 사용자 작업, 앱 구성 변경 및 보안 이벤트를 추적할 수 있습니다.
다음 쿼리를 사용하여 보안 관련 활동을 모니터링하고 앱의 잠재적인 문제를 검색합니다.
앱 권한 변경 모니터링
이 쿼리를 사용하여 앱 권한 수정을 검색합니다.
-- 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 범위가 있는 앱을 찾습니다.
-- 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
사용자 권한 부여 작업 추적
이 쿼리를 사용하여 사용자 권한 부여로 수행된 앱 작업을 나열합니다.
-- 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;
운영 모니터링
시스템 테이블을 사용하여 비용 및 리소스 사용량과 같은 앱의 운영 측면을 모니터링합니다.
앱 비용 모니터링
테이블을 사용하여 Databricks 앱 비용을 모니터링합니다 system.billing.usage . 다음 쿼리를 사용하여 일별 또는 월별 앱에 대한 정확한 비용 정보를 가져옵니다.
-- 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
Databricks 앱은 비용을 추적하는 데 도움이 되는 사용 정책을 지원합니다. 사용 정책 구성에 대한 자세한 내용은 서버리스 사용 정책을 사용한 속성 사용을 참조하세요.
앱 인사이트 모니터링
중요합니다
인사이트 탭은 베타에 있습니다.
앱 세부 정보 페이지의 인사이트 탭에는 사용자 참여 및 앱 가용성이 표시됩니다.
뷰어 추적
뷰어 테이블은 애플리케이션에 액세스하는 사용자를 추적합니다.
Azure Databricks 사용자가 앱 URL 또는 API 액세스를 통해 앱에 액세스할 때 보기 이벤트를 기록합니다. 앱당 사용자별로 고유하게 데이터를 저장합니다. 동일한 사용자가 후속 방문 시 새 행을 만드는 대신 이전 기록을 덮어씁니다.
마지막으로 본 타임스탬프는 30분 간의 OAuth 세션 새로 고침 주기를 따릅니다. 세션 창 내에서 여러 번 방문하면 초기 방문 시간이 유지되지만 세션이 만료된 후 첫 번째 액세스는 타임스탬프를 새 방문 시간으로 덮어씁니다.
비고
베타에서 마지막으로 본 시간은 UTC(협정 세계시)만 표시합니다.
작동 시간 및 상태
다음 상태 신호를 모니터링하여 앱 가용성 문제를 해결합니다.
- App service health: 앱을 지원하는 Azure Databricks 인프라를 사용할 수 있는지 여부입니다. 사용할 수 없는 경우 플랫폼에 서비스 수준 문제가 있습니다. Databricks 지원에 문의하세요.
- 앱 가용성: 특정 애플리케이션이 요청을 제공하는지 여부입니다. 사용할 수 없는 경우 코드에서 배포 오류 또는 크래시를 확인합니다.