예산(Budgets) 문제 해결
이 주제는 예산 문제를 모니터링하는 방법과 일반적인 문제의 해결책을 설명해요.
출처: Snowflake 문서
본문
이벤트 테이블로 예산 모니터링
이벤트 테이블(event table)을 사용해 예산과 관련된 텔레메트리 데이터를 수집할 수 있어요. Snowflake가 이벤트 테이블에 데이터 수집을 시작하면 테이블을 쿼리하고, 변경을 추적하는 스트림을 만들거나, 특정 이벤트 발생 시 알림을 보내는 알림을 설정할 수 있어요.
예산에 대한 텔레메트리 데이터를 수집하고 싶지 않다면 ENABLE_BUDGET_EVENT_LOGGING 계정 파라미터를 FALSE로 설정해 꺼야 해요.
이벤트 이해하기
다음 표는 예산 이벤트에 해당하는 이벤트 테이블의 값을 설명하므로 적절한 이벤트에 집중할 수 있어요. 이벤트 테이블 구조에 대한 자세한 내용은 이벤트 테이블 열을 참고해요.
| 이벤트 테이블 열 |
필드 |
값 |
설명 |
| resource_attributes |
snow.cost.budget.id |
budget_id |
예산 인스턴스의 고유 ID |
|
snow.cost.budget.name |
budget_name |
예산 인스턴스의 정규화된 이름 |
| scope |
name |
snow.cost.budget |
모든 예산 텔레메트리 이벤트에 대한 상수 식별자 |
| record_type |
n/a |
EVENT |
예산 로그 이벤트를 나타냄 |
| record |
name |
event_name |
설명적인 이벤트 이름. 가능한 값은 다음을 포함: BUDGET_UNVERIFIED_RECIPIENTS — 이메일 주소가 통합의 허용 수신자 목록에 없거나 검증되지 않은 이메일 주소가 있을 때 발생. BUDGET_INVALID_INTEGRATION — 알림 통합이 존재하지 않거나 사용자가 그에 대한 접근이 없을 때 발생. |
|
severity_text |
INFO, WARNING, 또는 ERROR |
예산 이벤트의 심각도 수준 |
| value |
message |
message |
설명적인 이벤트 메시지. 종종 통합 이름이나 작업 같은 컨텍스트 세부정보를 포함 |
|
|
|
|
다음 예시를 사용해 이벤트 테이블에서 예산 이벤트를 식별하는 방법을 더 잘 이해해요.
쿼리: 계정 내 모든 예산의 전파와 관련된 모든 이벤트 찾기
SELECT
TIMESTAMP,
RESOURCE_ATTRIBUTES,
SCOPE,
RECORD_TYPE,
RECORD,
VALUE
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE
RECORD_TYPE = 'EVENT' AND
SCOPE['name'] = 'snow.cost.budget';
쿼리: 특정 예산(예: MY_DB.SCH1.MY_BUDGET)과 관련된 모든 이벤트 찾기
SELECT
TIMESTAMP,
RESOURCE_ATTRIBUTES,
SCOPE,
RECORD_TYPE,
RECORD,
VALUE
FROM SNOWFLAKE.TELEMETRY.EVENTS
WHERE
RECORD_TYPE = 'EVENT' AND
SCOPE['name'] = 'snow.cost.budget'
AND RESOURCE_ATTRIBUTES['snow.cost.budget.name'] ILIKE 'MY_DB.SCH1.MY_BUDGET';
특정 문제 해결
다음 시나리오는 예산을 만들거나 편집할 때 발생할 수 있는 문제를 해결하는 데 도움이 돼요.
계정 예산을 활성화할 수 없다
계정 예산을 활성화할 수 없는 데에는 여러 이유가 있을 수 있어요.
Unknown user-defined function SNOWFLAKE.LOCAL.ACTIVATE
|
|
| 원인 |
Snowflake 계정이 새로 생성된 경우 계정 예산이 아직 계정에서 사용 가능하지 않아요. |
| 해결책 |
새로 생성된 계정에서 계정 예산을 사용할 수 있을 때까지 기다려요. 사용 가능해진 후에 활성화할 수 있어요. |
FAILURE: Uncaught exception of type 'BUDGET_ALREADY_ACTIVATED' on line X at position X
CALL SNOWFLAKE.LOCAL.ACCOUNT_ROOT_BUDGET!GET_CONFIG();
|
|
| 원인 |
계정 예산이 이미 활성화됐어요. |
| 해결책 |
<budget_name>!GET_CONFIG 메서드를 호출해 활성화 타임스탬프를 볼 수 있어요. |
-20000 (P0001): Uncaught exception of type 'NO_PERMISSION_TO_ACTIVATE_BUDGET' on line X at position X
|
|
| 원인 |
계정이 아직 Budgets 기능을 지원하지 않아요. |
| 해결책 |
Budgets 기능은 Gov 리전의 계정에는 사용할 수 없어요. Gov 리전 지원은 향후 릴리스에서 제공될 예정이에요. |
커스텀 예산을 만들 수 없다
커스텀 예산을 만들 수 없는 데에는 여러 이유가 있을 수 있어요.
FAILURE: SQL access control error: Insufficient privileges to operate on class 'BUDGET'
|
|
| 원인 |
사용 중인 역할에 커스텀 예산을 만드는 데 필요한 권한이 없어요. |
| 해결책 |
필요한 권한이 있는 역할을 사용해요. "예산 생성을 위한 커스텀 역할 생성"을 참고해요. |
FAILURE: Uncaught exception of type 'STATEMENT_ERROR' on line 0 at position -1 :
Uncaught exception of type 'UNSUPPORTED_BUDGET_TYPE' on line X at position X
|
|
| 원인 |
예산을 만들기 위해 생성자 메서드에 인자를 전달했어요. |
| 해결책 |
CREATE BUDGET을 참고하고 생성 문장을 편집해요. |
커스텀 예산을 활성화할 수 없다
FAILURE: Uncaught exception of type 'STATEMENT_ERROR' on line 0 at position -1 :
Uncaught exception of type 'UNSUPPORTED_BUDGET_TYPE' on line X at position X
|
|
| 원인 |
커스텀 예산에서 ACTIVATE 메서드를 호출하려 했어요. |
| 해결책 |
ACTIVATE 메서드는 계정 예산에서만 사용할 수 있어요. 커스텀 예산을 만든 후 <budget_name>!SET_SPENDING_LIMIT과 <budget_name>!SET_EMAIL_NOTIFICATIONS 메서드를 사용해 예산을 구성하고 알림 이메일을 받기 시작해요. |
계정 예산에서 메서드를 호출할 수 없다
계정 예산에서 메서드를 호출하는 것이 실패하는 데에는 여러 이유가 있을 수 있어요.
-20000 (P0001): Uncaught exception of type 'FUNCTION_NOT_SUPPORTED_FOR_ACCOUNT_ROOT_BUDGET' on line 11 at position 18
|
|
| 원인 |
계정 예산에서 다음 메서드 중 하나를 호출하려 했어요: ADD_RESOURCE(), REMOVE_RESOURCE(), GET_LINKED_RESOURCES() |
| 해결책 |
이 메서드들은 계정 예산에서 사용할 수 없어요. 계정 예산은 계정의 모든 지원 객체를 모니터링하며 객체를 추가·제거할 수 없어요. 자세한 내용은 "계정 예산과 커스텀 예산"을 참고해요. |
-20000 (P0001): Uncaught exception of type 'ACCOUNT_ROOT_BUDGET_NOT_ACTIVATED' on line X at position X
|
|
| 원인 |
계정 예산이 활성화되기 전에 계정 예산에서 메서드를 호출하려 했어요. |
| 해결책 |
계정 예산을 활성화해요. |
커스텀 예산에서 객체를 추가·제거할 수 없다
커스텀 예산에서 객체를 성공적으로 추가·제거하려면 메서드를 호출하는 데 사용한 역할이 필수 권한과 역할을 가져야 해요.
002141 (42601): SQL compilation error:
Unknown user-defined function <budget_db>.<budget_schema>.<budget_name>!ADD_RESOURCE
|
|
| 원인 |
인스턴스 메서드를 호출하는 데 사용한 역할이 예산에서 객체를 추가(또는 제거)하는 데 필요한 권한이 없어요. |
| 해결책 |
메서드를 호출하는 데 사용한 역할에 필요한 인스턴스 역할과 권한을 부여해요. 자세한 내용은 "커스텀 예산 모니터링을 위한 커스텀 역할 생성"을 참고해요. |
002003 (02000): SQL compilation error:
<object_type> '<object_name>' does not exist or not authorized.
|
|
| 원인 |
커스텀 예산에 객체를 추가하려 했지만 메서드를 호출하는 데 사용한 역할에 필요한 권한이 없어요. |
| 해결책 |
예산에서 객체를 추가(또는 제거)하려면 메서드를 호출하는 데 사용한 역할이 객체에 대한 APPLYBUDGET 권한을 가져야 해요. 상위 객체가 데이터베이스나 스키마이면 객체를 포함하는 데이터베이스와 스키마에 대한 USAGE 권한도 있어야 해요. 자세한 내용은 필수 객체 권한 목록을 참고해요. |
Uncaught exception of type 'EXPRESSION_ERROR' on line 10 at position 21 :
Privilege 'APPLYBUDGET' is not authorized on the reference object.
|
|
| 원인 |
SYSTEM$REFERENCE 문에서 PRIVILEGE 파라미터를 지정하지 않고 객체에 대한 참조를 만들려 했어요. |
| 해결책 |
객체에 대한 APPLYBUDGET 권한으로 참조를 만들어요. |
505001 (55000): Uncaught exception of type 'EXPRESSION_ERROR' on line 10
at position 21 : Specified object does not exist or not authorized for
the reference.
|
|
| 원인 |
이 오류 메시지에는 여러 원인이 있어요: 인라인 SYSTEM$REFERENCE 문으로 SNOWFLAKE 데이터베이스를 커스텀 예산에 추가하려 했거나, 객체에 대한 참조를 만드는 데 필요한 권한이 없어요. 객체를 예산에 추가하려면 유효한 참조가 필요해요. |
| 해결책 |
SNOWFLAKE 데이터베이스는 예산에 추가할 수 없어요. ADD_RESOURCE의 사용 참고 사항을 참고해요. 예산에 추가하려는 객체에 필요한 권한을 부여해요. 자세한 내용은 필수 객체 권한 목록을 참고해요. |
예산의 이메일 알림을 설정할 수 없다
다음 시나리오는 <budget_name>!SET_EMAIL_NOTIFICATIONS 메서드를 호출할 때 일반적인 문제를 해결하는 데 도움이 돼요.
Unknown user-defined function <database_name>.<schema_name>.<budget_name>.SET_EMAIL_NOTIFICATIONS
|
|
| 원인 |
커스텀 예산의 이메일 알림을 설정하는 데 사용한 역할에 ADMIN 인스턴스 역할이 없어요. |
| 해결책 |
필요한 권한과 역할을 가진 역할을 사용해요. SET_EMAIL_NOTIFICATIONS의 접근 제어 요구사항을 참고해요. |
Integration '<INTEG_NAME>' does not exist or not authorized.
|
|
| 원인 |
알림 통합이 존재하지 않아요. |
| 해결책 |
유효한 알림 통합을 사용해요. 자세한 내용은 "이메일 알림 통합 생성"을 참고해요. 예산 알림용 이메일 주소를 ALLOWED_RECIPIENTS 목록에 포함해요. |
FAILURE: Uncaught exception of type 'EXPRESSION_ERROR' on line 16 at position 34 : Following email address(es) are not
allowed by the email integration <INTEGRATION_NAME>: [<email>]
|
|
| 원인 |
이메일 주소가 알림 통합에 포함되지 않았어요. |
| 해결책 |
이메일 주소를 알림 통합에 추가하거나, ALLOWED_RECIPIENTS 목록에 모든 이메일 주소를 포함하는 알림 통합을 사용해요. |
Email recipients in the given list at indexes [<index_list>] are not allowed. Either these email addresses are not yet validated
or do not belong to any user in the current account.
|
|
| 원인 |
추가하려고 한 이메일 주소 중 일부 또는 전부가 검증되지 않았어요. |
| 해결책 |
"이메일 알림 수신자의 이메일 주소 검증"을 참고해요. |
GET_SERVICE_TYPE_USAGE 메서드를 성공적으로 호출할 수 없다
다음 시나리오는 <budget_name>!GET_SERVICE_TYPE_USAGE 메서드를 호출할 때 일반적인 문제를 해결하는 데 도움이 돼요.
001044 (42P13): SQL compilation error: error line 0 at position -1 Invalid argument types for function 'GET_SERVICE_TYPE_USAGE':
(VARCHAR(X), VARCHAR(X), VARCHAR(X), VARCHAR(X))
|
|
| 원인 |
잘못된 인자 또는 잘못된 인자 수로 메서드를 호출했어요. |
| 해결책 |
메서드를 호출하는 데 사용한 인자가 유효한지, 필요한 인자를 모두 포함했는지 확인해요. |
002151 (22023): Uncaught exception of type 'STATEMENT_ERROR' on line 16 at position 23 : SQL compilation error:
[:TIME_DEPART] is not a valid date/time component for function DATE_TRUNC.
|
|
| 원인 |
TIME_DEPART 인자가 잘못된 문자열이에요. |
| 해결책 |
참조 주제에서 TIME_DEPART 인자에 나열된 유효한 값 중 하나를 사용해요. |
100094 (22000): Uncaught exception of type 'STATEMENT_ERROR' on line 16 at position 23 : Unknown timezone: '<invalid_timezone>'
|
|
| 원인 |
USER_TIMEZONE 인자가 잘못된 문자열이에요. |
| 해결책 |
유효한 시간대 문자열을 사용해요. 자세한 내용은 GET_SERVICE_TYPE_USAGE의 사용 참고 사항을 참고해요. |
계정에 Budgets 기능을 사용할 수 없다
FAILURE: SQL compilation error: Class 'SNOWFLAKE.CORE.BUDGET' does not exist or not authorized.
000002 (0A000): Uncaught exception of type 'STATEMENT_ERROR' on line 0 at position -1 : Unsupported feature 'TOK_RESOURCE_GROUP'.
|
|
| 원인 |
계정이 아직 Budgets 기능을 지원하지 않아요. |
| 해결책 |
Budgets 기능은 Gov 리전의 계정에는 사용할 수 없어요. Gov 리전 지원은 향후 릴리스에서 제공될 예정이에요. |
더 알아보기 (Learn more)