コンテナを使用してアプリをアップグレードする

このトピックでは、 Snowflake Native App with Snowpark Container Services をアップグレードする方法について説明します。

コンテナを使用したアプリのアップグレードについて

コンテナを使用したアプリをアップグレードするプロセスには、主に2つのステージがあります。

  • アプリが管理するコンテナ内のサービスをアップグレードします。

    他のSnowpark Continer Serviceと同様に、コンテナアプリは 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 は、サービスやその他の関連プロセス(タスクなど)を開始またはアップグレードするために使用されるバージョン初期化子を提供します。バージョン初期化子は、マニフェストファイルで指定されるコールバックストアドプロシージャです。

バージョン初期化子コールバック関数は、次のコンテキストで呼び出されます。

  • インストール中、アプリのセットアップスクリプトがエラーなしで終了するとすぐに、バージョン初期化子が呼び出されます。

  • アップグレード中、バージョン初期化子には2つのシナリオが考えられます。

    • 新しいバージョンのセットアップスクリプトが成功すると、バージョン初期化子の新しいバージョンが呼び出されます。

    • 新しいバージョンのセットアップスクリプトまたはバージョン初期化子が失敗した場合は、以前のバージョンのバージョン初期化子が呼び出されます。これにより、以前のバージョンのバージョン初期化子は 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では、バージョン管理されたスキーマ内でバージョン初期化子として使用されるストアドプロシージャを作成することをお勧めします。このストアドプロシージャがバージョンスキーマ内に作成されていない場合、バージョン初期化子が存在しない可能性があります。

  • アプリがバージョン初期化子を指定する場合、アプリはセットアップスクリプト内でサービスを開始またはアップグレードしようとしてはなりません。

  • バージョン初期化子には、アプリケーションロールが付与される必要はありません。