예산(Budgets) 문제 해결

예산(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)