예산의 주기 시작 작업(Cycle-start Actions)

예산의 주기 시작 작업(Cycle-start Actions)

예산 주기가 다시 시작될 때 저장 프로시저를 자동으로 호출하도록 예산을 구성할 수 있어요. 주기는 예산의 월간 기간 시작 시 지출이 0으로 재설정될 때 다시 시작돼요. 이를 통해 웨어하우스를 다시 활성화하거나 새 주기에 대한 알림을 보내는 것 같은 자동화 작업을 각 예산 기간 시작 시 실행할 수 있어요.

출처: Snowflake 문서

본문

주기 시작 작업(cycle-start action)은 이전 예산 주기 동안 커스텀 작업이 트리거한 작업을 정리하거나 되돌리는 데 특히 유용해요.

주기 시작 작업을 정의할 때 호출할 저장 프로시저와 전달할 인자를 지정해요. 저장 프로시저는 예산 주기가 다시 시작될 때마다 자동으로 실행돼요.

저장 프로시저 요구사항

주기 시작 작업이 호출하는 저장 프로시저는 다음 요구사항을 충족해야 해요.

이 요구사항을 충족하는 저장 프로시저를 만든 후에는 프로시저와 그 상위 데이터베이스·스키마에 대한 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();

확장 예시

다음 예시는 주기 시작 작업이 호출하는 저장 프로시저를 작성하고, 프로시저에 필요한 권한을 부여한 뒤, 예산의 주기 시작 작업을 설정하는 방법을 보여줘요.

  1. 모든 요구사항에 부합하는 저장 프로시저를 만든다.
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";
$$;
  1. 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;
  1. 예산의 주기 시작 작업을 설정한다.
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)