컨테이너를 사용한 앱 업그레이드

이 항목에서는 Snowflake Native App with Snowpark Container Services 를 업그레이드하는 방법을 설명합니다.

컨테이너를 사용한 앱 업그레이드 정보

컨테이너로 앱을 업그레이드하는 프로세스는 크게 두 가지 스테이지로 나뉩니다.

  • 앱이 관리하는 컨테이너에서 서비스를 업그레이드합니다.

    다른 Snowpark Continer Services와 마찬가지로 컨테이너 앱은 ALTER SERVICE 명령을 사용하여 새 버전의 서비스 사양 파일을 기반으로 서비스를 수정합니다. 이 명령은 비동기적으로 실행됩니다.

  • 앱의 다른 오브젝트를 업그레이드합니다.

    서비스가 성공적으로 업그레이드되면 앱 내의 다른 오브젝트도 업그레이드됩니다. 이는 일반적인 Snowflake Native App 업그레이드 프로세스와 유사합니다. 자세한 내용은 업그레이드 정보 섹션을 참조하십시오.

컨테이너로 앱을 업그레이드할 때 어려운 점은 ALTER SERVICE 명령이 비동기적으로 실행된다는 점입니다. 공급자가 이 명령을 설정 스크립트에 직접 추가하는 경우 서비스 업그레이드가 진행되는 동안에도 설정 스크립트가 계속 실행됩니다. 공급자는 앱의 다른 오브젝트에 대한 업그레이드를 진행하기 전에 서비스가 올바르게 업그레이드되도록 서비스 업그레이드를 위한 코드를 작성해야 합니다.

서비스 업그레이드를 올바르게 처리하기 위해 Snowflake Native App Framework 는 앱에서 이를 허용하는 기능을 제공합니다.

  • 서비스가 성공적으로 업그레이드되거나 실패할 때까지 설치 스크립트 실행을 일시 중지합니다. 공급자는 설정 스크립트가 가능한 상황을 처리할 수 있는지 확인해야 합니다. 자세한 내용은 설치 스크립트 실행 일시 중지 섹션을 참조하십시오.

  • 업그레이드가 실패하면 콜백 함수를 사용하여 이전에 업그레이드된 서비스를 이전 버전으로 롤백합니다. 자세한 내용은 서비스 업그레이드 조정 섹션을 참조하십시오.

설치 스크립트 실행 일시 중지

서비스가 올바르게 업그레이드될 수 있도록 공급자는 설정 스크립트 내에서 SYSTEM$WAIT_FOR_SERVICES 시스템 함수를 사용하여 설정 스크립트를 일시 중지할 수 있습니다. 다음 예는 이 시스템 함수를 사용하는 방법을 보여줍니다.

SELECT SYSTEM$WAIT_FOR_SERVICES(600, 'services.web_ui', 'services.worker, 'services.aggregation');
Copy

이 명령을 사용하면 다음 중 하나가 발생할 때까지 설치 스크립트가 일시 중지됩니다.

  • 시스템 함수에 전달된 모든 명명된 서비스는 READY 상태를 갖습니다.

  • 명명된 서비스는 FAILED 상태입니다.

  • 600초가 경과했습니다.

서비스 업그레이드 조정

Snowflake Native App Framework 는 공급자가 업그레이드 서비스를 나머지 업그레이드 프로시저와 동기화할 수 있도록 하는 콜백 함수를 제공합니다.

서비스 업그레이드 시 발생할 수 있는 충돌

코어 Snowflake Native App 을 업그레이드하는 동안 설정 스크립트는 버전이 지정된 스키마 내의 오브젝트를 수정하여 앱의 새 버전으로 업그레이드합니다. 업그레이드 중에 오류가 발생하면 버전 관리된 스키마 내의 오브젝트가 앱의 이전 버전으로 돌아갑니다.

컨테이너를 사용하는 앱의 경우, 새 버전에 적용되는 서비스 사양 파일을 기반으로 설정 스크립트에서 ALTER SERVICE 명령을 실행하여 서비스를 수정합니다. 서비스는 버전이 지정된 스키마 내에서 생성되지 않으므로 ALTER SERVICE 가 성공적으로 실행되는 즉시 서비스가 업그레이드됩니다. 예를 들어, 설정 스크립트에서 나중에 오류가 발생하면 버전 관리된 스키마의 오브젝트는 이전 버전으로 되돌아가지만 수정된 서비스는 새 버전의 서비스입니다.

버전 이니셜라이저 콜백 함수를 사용하여 서비스 업그레이드를 관리합니다.

Snowflake Native App Framework 는 서비스 또는 기타 관련 프로세스(예: 작업)를 시작하거나 업그레이드하는 데 사용되는 버전 이니셜라이저를 제공합니다. 버전 이니셜라이저는 매니페스트 파일에 지정된 콜백 저장 프로시저입니다.

버전 이니셜라이저 콜백 함수는 다음과 같은 상황에서 호출됩니다.

  • 설치하는 동안 앱의 설치 스크립트가 오류 없이 완료되면 버전 이니셜라이저가 호출됩니다.

  • 업그레이드하는 동안 버전 이니셜라이저에는 다음의 두 가지 가능한 상황이 있습니다.

    • 새 버전의 설치 스크립트가 성공하면 새 버전의 버전 이니셜라이저가 호출됩니다.

    • 새 버전의 설치 스크립트나 버전 이니셜라이저이 실패하면 이전 버전의 버전 이니셜라이저가 호출됩니다. 이렇게 하면 이전 버전의 버전 이니셜라이저가 ALTER SERVICE 를 사용하여 서비스를 이전 버전으로 되돌릴 수 있습니다.

버전 이니셜라이저 지정

버전 이니셜라이저로 사용되는 저장 프로시저를 지정하려면 manifest.yml 파일에 다음을 추가합니다.

lifecycle_callbacks:
  version_initializer: callbacks.version_init
Copy

이 예제에서 version_initializer 속성은 이름이 callbacks 스키마 내의 이름이 version_init 인 저장 프로시저로 설정되어 있습니다.

설치 스크립트 내에서 공급자는 다음 예에서 표시된 것처럼 버전이 지정된 스키마 내에서 이 프로시저를 정의할 수 있습니다.

CREATE OR ALTER VERSIONED SCHEMA callbacks;

CREATE OR REPLACE PROCEDURE callbacks.version_init()
  ...
  -- body of the version_init() procedure
  ...
Copy

컨테이너가 포함된 앱을 업그레이드할 때의 모범 사례

  • SYSTEM$WAIT_FOR_SERVICES() 시스템 함수의 시간 제한 값을 설정할 때는 주의해야 합니다.

  • Snowflake는 버전이 지정된 스키마 내에서 버전 이니셜라이저로 사용되는 저장 프로시저를 만드는 것을 권장합니다. 이 저장 프로시저가 버전 스키마 내에 생성되지 않으면 버전 이니셜라이저가 존재하지 않을 수 있습니다.

  • 앱이 버전 이니셜라이저를 지정하는 경우, 앱은 설치 스크립트 내에서 서비스를 시작하거나 업그레이드하려고 시도해서는 안 됩니다.

  • 버전 이니셜라이저에는 애플리케이션 역할을 부여할 필요가 없습니다.