dbutils.secrets.get() 으로 꺼낸 값은 노트북에서 print 해도 자동으로 [REDACTED] 로 가려진다. 한 글자씩 쪼개 출력하는 식의 우회는 보안 통제를 의도적으로 뚫는 것이므로 하지 않는다.
정당한 운영 사유가 있다면 정식 경로는 CLI 다. scope 에 READ 권한이 있어야 하고, 없으면 PERMISSION_DENIED 가 난다.
databricks secrets get-secret <scope> <key>
# value 는 base64 로 인코딩돼 오므로 디코드해야 평문이 된다
databricks secrets get-secret <scope> <key> --output json | jq -r '.value' | base64 -d
출력이 셸 히스토리나 로그 파일에 남지 않게 한다. 파일로 리다이렉트하지 않고, 확인한 값을 다른 코드나 메신저에 붙여 넣지 않는다. 값이 틀렸거나 갱신이 목적이라면 확인 대신 put-secret 으로 덮어쓰는 편이 안전하다.
databricks secrets create-scope <scope>
databricks secrets put-secret <scope> <key>
Databricks Budgets 는 워크스페이스 · 태그로 범위를 잡고 금액을 설정한 뒤 초과 시 이메일을 보내는 구조다. 비용을 막거나 워크로드를 중단시키지 않는다. Serverless Budget Policies 도 현재는 추적과 알림만 제공한다.
hard cap 이 필요하면 직접 엮어야 한다.
| 수단 | 역할 |
|---|---|
| Compute Policy | autotermination_minutes 강제, max workers 상한, 노드 타입 제한. 구조적 폭주 방지 |
system.billing.usage 모니터링 |
임계 초과 감지 |
| Jobs REST API · Terraform | 감지 시 job cancel · warehouse 중단 자동화 |
| 클라우드 예산 연계 | AWS Budgets → SNS → Lambda → Databricks Jobs API |
Agent 가 늘어나면 LLM 호출 비용이 예측 불가능해진다. 여기서 실제로 차단하는 네이티브 수단은 Budgets 가 아니라 Mosaic AI Gateway 의 rate limit 과 권한 제어다. LLM 은 토큰 과금이므로 TPM(tokens per minute) 상한이 비용에 직접 연결된다. rate limit 은 엔드포인트 전체뿐 아니라 사용자 단위로도 걸 수 있다.
적용 순서는 이렇다.
system 테이블로 사용량을 추적하고 Budgets 는 사후 알림용으로만 쓴다.rate limit 기능은 Beta 이며 account admin 이 account console 의 Previews 에서 활성화해야 한다.
REST API 문서의 Supervisor Agents 섹션은 생성 · 조회 · 수정 · 삭제 · 권한 · tool 관리 같은 lifecycle API 뿐이고 질의 엔드포인트가 없다. 정상이다. 질의는 두 갈래로 나뉜다.
배포된 agent 호출 POST /serving-endpoints/<endpoint-name>/invocations (Can Query 권한 필요)
직접 오케스트레이션 POST ai-gateway/mlflow/v1/responses (Supervisor API, Beta)
호출 코드는 AI Playground 의 Get code 로 시작점을 얻는 것이 빠르다. 토큰은 환경변수로만 주입하고 Authorization 헤더를 로그에 남기지 않는다.
import os, requests
host = os.environ["DATABRICKS_HOST"]
token = ${MASKED}"DATABRICKS_TOKEN"]
name = "mas-xxxx-endpoint"
r = requests.post(
f"{host}/serving-endpoints/{name}/invocations",
headers={"Authorization": f"Bearer {token}", "Content-Type": "application/json"},
json={"input": [{"role": "user", "content": "질문 내용"}]},
timeout=120,
)
r.raise_for_status()
print(r.json())
응답에 Invalid message sequence. The approval response was in an unexpected position. 이 나오면 메시지 배열의 역할 순서가 잘못된 것이다. 페이로드 구조를 Playground 가 만들어 주는 형태와 대조한다.