예산의 주기 시작 작업(Cycle-start Actions)
예산의 주기 시작 작업(Cycle-start Actions)
예산 주기가 다시 시작될 때 저장 프로시저를 자동으로 호출하도록 예산을 구성할 수 있어요. 주기는 예산의 월간 기간 시작 시 지출이 0으로 재설정될 때 다시 시작돼요. 이를 통해 웨어하우스를 다시 활성화하거나 새 주기에 대한 알림을 보내는 것 같은 자동화 작업을 각 예산 기간 시작 시 실행할 수 있어요.
출처: Snowflake 문서
본문
주기 시작 작업(cycle-start action)은 이전 예산 주기 동안 커스텀 작업이 트리거한 작업을 정리하거나 되돌리는 데 특히 유용해요.
주기 시작 작업을 정의할 때 호출할 저장 프로시저와 전달할 인자를 지정해요. 저장 프로시저는 예산 주기가 다시 시작될 때마다 자동으로 실행돼요.
저장 프로시저 요구사항
주기 시작 작업이 호출하는 저장 프로시저는 다음 요구사항을 충족해야 해요.
- 프로시저는 호출자의 권한(caller's rights)이 아니라 소유자의 권한(owner's rights)으로 실행되어야 해요. 자세한 내용은 호출자 권한과 소유자 권한 저장 프로시저 이해하기를 참고해요.
- 프로시저는 완료에 30분 이상 걸릴 수 없어요.
- 프로시저는 OUTPUT 인자를 가질 수 없어요.
- 중복되거나 의도치 않은 효과 없이 여러 번 호출되도록 프로시저를 설계해요.
- 프로시저의 필수 인자는 다음 데이터 타입 중 하나여야 해요.
이 요구사항을 충족하는 저장 프로시저를 만든 후에는 프로시저와 그 상위 데이터베이스·스키마에 대한 USAGE 권한을 SNOWFLAKE 애플리케이션에 부여해야 해요. 예를 들어 저장 프로시저의 정규화된 이름이 code_db.sch1.reset_resources이면 다음 명령을 실행해요.
GRANT USAGE ON DATABASE code_db TO APPLICATION SNOWFLAKE;
GRANT USAGE ON SCHEMA code_db.sch1 TO APPLICATION SNOWFLAKE;
GRANT USAGE ON PROCEDURE code_db.sch1.reset_resources(STRING, STRING) TO APPLICATION SNOWFLAKE;
참고(Note): 주기 시작 작업으로 추가한 후 저장 프로시저를 업데이트하면 프로시저에 대한 USAGE 권한을 SNOWFLAKE 애플리케이션에 다시 부여해야 해요.
예산의 주기 시작 작업 설정
예산당 주기 시작 작업을 하나 설정할 수 있어요(계정 예산 또는 커스텀 예산). 주기 시작 작업은 다음 구성 요소로 이루어져요.
- 저장 프로시저(Stored procedure): 예산 주기가 다시 시작될 때 호출할 프로시저에 대한 참조
- 인자(Arguments): 저장 프로시저에 전달할 인자의 배열
예산의 주기 시작 작업을 설정하려면 예산 인스턴스에서 SET_CYCLE_START_ACTION 메서드를 호출해요. 예를 들어 다음 코드는 예산 주기가 다시 시작될 때 reset_resources 저장 프로시저를 호출하는 주기 시작 작업을 설정해요.
CALL budget_db.sch1.my_budget!SET_CYCLE_START_ACTION(
SYSTEM$REFERENCE('PROCEDURE', 'code_db.sch1.reset_resources(STRING, STRING, STRING, STRING)'),
ARRAY_CONSTRUCT('my_int', '[email protected]', 'Budget Alert', 'New budget cycle started'));
주기 시작 작업이 호출하는 저장 프로시저 생성까지 포함한 종단 간 예시는 확장 예시를 참고해요.
예산에서 주기 시작 작업 제거
예산에서 주기 시작 작업을 제거하려면 예산 인스턴스에서 REMOVE_CYCLE_START_ACTION 메서드를 호출해요.
CALL budget_db.sch1.my_budget!REMOVE_CYCLE_START_ACTION();
확장 예시
다음 예시는 주기 시작 작업이 호출하는 저장 프로시저를 작성하고, 프로시저에 필요한 권한을 부여한 뒤, 예산의 주기 시작 작업을 설정하는 방법을 보여줘요.
- 모든 요구사항에 부합하는 저장 프로시저를 만든다.
CREATE OR REPLACE PROCEDURE code_db.sch1.reset_resources(
integration_name STRING,
email_list STRING,
email_subject STRING,
email_content STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
EXECUTE AS OWNER
AS
$$
// Re-enable warehouses or reset configurations here
var enable_wh = "ALTER WAREHOUSE my_warehouse RESUME;";
var statement1 = snowflake.createStatement({sqlText: enable_wh});
statement1.execute();
// Send notification about new cycle
var sql_command = "CALL SYSTEM$SEND_EMAIL('" + INTEGRATION_NAME + "', " +
"'" + EMAIL_LIST + "', " +
"'" + EMAIL_SUBJECT + "'," +
"'" + EMAIL_CONTENT + "'" + ");";
var statement2 = snowflake.createStatement({sqlText: sql_command});
statement2.execute();
return "Resources reset for new budget cycle";
$$;
- SNOWFLAKE 애플리케이션에 저장 프로시저에 대한 권한을 부여한다.
GRANT USAGE ON DATABASE code_db TO APPLICATION SNOWFLAKE;
GRANT USAGE ON SCHEMA code_db.sch1 TO APPLICATION SNOWFLAKE;
GRANT USAGE ON PROCEDURE code_db.sch1.reset_resources(STRING, STRING, STRING, STRING)
TO APPLICATION SNOWFLAKE;
- 예산의 주기 시작 작업을 설정한다.
CALL budget_db.sch1.my_budget!SET_CYCLE_START_ACTION(
SYSTEM$REFERENCE('PROCEDURE', 'code_db.sch1.reset_resources(STRING, STRING, STRING, STRING)'),
ARRAY_CONSTRUCT('my_int', '[email protected]', 'Budget Cycle Restarted', 'New budget cycle has begun'));
주기 시작 작업 문제 해결
주기 시작 작업이 예상대로 작동하지 않으면 다음 방법으로 문제를 진단해요.
주기 시작 작업 실행 모니터링
Snowflake는 주기 시작 작업을 실행하기 위해 태스크를 사용해요. 이 태스크의 이름은 _budget_cycle_start_task예요. 예산 인스턴스의 주기 시작 작업 태스크 실행 상태를 확인하려면 다음 쿼리를 실행해요. budget_name을 예산의 이름으로 바꿔요.
SELECT th.*, ci.name AS budget_name
FROM SNOWFLAKE.ACCOUNT_USAGE.TASK_HISTORY th
JOIN SNOWFLAKE.ACCOUNT_USAGE.CLASS_INSTANCES ci
ON th.instance_id = ci.id
WHERE ci.class_name = 'BUDGET'
AND th.name ILIKE '_budget_cycle_start_task'
AND ci.name = '<budget_name>'
ORDER BY th.completed_time DESC
LIMIT 10;
트리거되지 않는 작업 문제 해결
주기 시작 작업이 예상 시점에 트리거되지 않으면 다음 일반적인 문제를 확인해요. 커스텀 예산이 budget_db.sch1.my_budget이라고 가정해요.
저장 프로시저 또는 권한이 변경됨
주기 시작 작업이 호출하는 저장 프로시저가 여전히 유효하고 SNOWFLAKE 애플리케이션이 여전히 필요한 권한을 가지고 있는지 확인해요. 다음 명령으로 권한을 확인할 수 있어요.
SHOW GRANTS ON PROCEDURE code_db.sch1.reset_resources(STRING, STRING, STRING, STRING);
예산이 활성화되지 않음
계정 예산에 한해 GET_CONFIG 메서드를 호출하고 is_active 필드를 확인해 예산이 활성화됐는지 확인해요.
CALL budget_db.sch1.my_budget!GET_CONFIG();
주기 시작 작업이 구성되지 않음
예산에 주기 시작 작업이 구성됐는지 확인해요.
CALL budget_db.sch1.my_budget!GET_CYCLE_START_ACTION();
예산 주기가 아직 다시 시작되지 않음
주기 시작 작업은 예산 주기가 다시 시작될 때만 트리거돼요. 현재 주기가 언제 시작됐고 언제 끝날지 확인해 다음 트리거가 언제 발생할지 파악해요.
더 알아보기 (Learn more)
- 커스텀 작업(Custom Actions) — 주기 중 트리거되는 사용자 지정 작업
- 예산(Budgets) 개요 — 예산 기능 소개
- 예산 메서드 — 예산 클래스 메서드