Snowflakeにおける「動作変更リリース」の制御をしてみた

2021.09.10

こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。

Snowflakeでは、公式ドキュメントのリリースノート以外に、コミュニティサイトでもリリースに関する案内がされています。

この中の「Roles Granted to Users Not Dropped When the Grantor Role Is Dropped」という記事をみていた際に下記の一文を見つけました。

If you require additional testing and development time for the changes in the bundle, before your production accounts are moved to the release, disable the bundle in the accounts.

「動作変更に関わるテストや開発を更に実施したい場合は、本番環境でリリース状態になる前に、該当バンドルを無効にしてね」ということのようですが、このバンドルの有効化・無効化について知らなかったので調べてみました。

動作変更リリースとは?

Snowflakeのリリースタイプとして「総合リリース」、「パッチリリース」、「動作変更リリース」の3つのリリースが行われていますが、このうち「動作変更リリース」は毎月実施されています。

「動作変更リリース」には「顧客環境に影響を与える可能性のある既存動作の変更」が含まれており、2ヶ月に渡って緩やかにリリースされるのですが、このリリースについては案内が開始されてからオプトアウト期間が終わるまでの間であれば、ユーザー側でリリースの制御をすることも可能です。

動作変更リリースの制御方法

動作変更リリースの制御には、システム関数を利用します。また引数には動作変更リリースに対応した「バンドル名」が必要です。

動作変更リリース制御用のシステム関数

システム関数は以下の3つです。

バンドルの「有効化」および「無効化」にはACCOUNTADMINロールが必要となります。

バンドル名

「バンドル名」と対応する動作変更内容は、以下のページから確認することが可能です。

また、リリースノートでも動作変更について公開がされています。

動作変更のステータス確認と設定変更をしてみる

では、実際に動作変更のステータス確認と設定変更をしてみたいと思います。

今回は動作変更に関わる作業なので、開発用のSnowflakeアカウントで試してみました。

ステータスの確認

まずはステータスの確認からやってみます。

現在のアカウントの指定された動作変更リリースバンドルのステータスを返します。

直近のリリースをいくつか確認してみましょう。

SELECT SYSTEM$BEHAVIOR_CHANGE_BUNDLE_STATUS('2021_06');
╒═════════════════════════════════════════════════╕                             
│ SYSTEM$BEHAVIOR_CHANGE_BUNDLE_STATUS('2021_06') │
╞═════════════════════════════════════════════════╡
│ RELEASED                                        │
╘═════════════════════════════════════════════════╛
SELECT SYSTEM$BEHAVIOR_CHANGE_BUNDLE_STATUS('2021_07');
╒═════════════════════════════════════════════════╕                             
│ SYSTEM$BEHAVIOR_CHANGE_BUNDLE_STATUS('2021_07') │
╞═════════════════════════════════════════════════╡
│ ENABLED                                         │
╘═════════════════════════════════════════════════╛
SELECT SYSTEM$BEHAVIOR_CHANGE_BUNDLE_STATUS('2021_08');
╒═════════════════════════════════════════════════╕                             
│ SYSTEM$BEHAVIOR_CHANGE_BUNDLE_STATUS('2021_08') │
╞═════════════════════════════════════════════════╡
│ DISABLED                                        │
╘═════════════════════════════════════════════════╛

それぞれ、2021_06は「既にリリース済み」、2021_07は「有効化されている」、2021_08は「無効化されている」ようです。

バンドルの無効化

次にバンドルの無効化です。

現在のアカウントの指定されたリリースバンドルに含まれる動作の変更を無効にします。

このコマンドは、特定のバンドル用 テスト期間 の開始時にそのバンドルで使用可能になり、バンドルのオプトアウト期間の後には使用できなくなります。そのバンドルのテスト期間が始まる前、またはそのバンドルのオプトアウト期間が終了した後に、バンドルを使用してこのコマンドを発行すると、エラーが返されます。

このコマンドを使用してテスト期間中に動作変更バンドルを無効にした場合、バンドルを再度有効にするか、オプトアウト期間が終了するまで、バンドルは無効のままになります。バンドルがデフォルトで有効になる場合、オプトアウト期間の開始時にSnowflakeはこの設定を上書きしません。

「バンドルがデフォルトで有効になる場合、オプトアウト期間の開始時にSnowflakeはこの設定を上書きしません。」という動作については留意しておく必要がありますね。

今回は2021_07で有効化された「DESCRIBE TABLEDESCRIBE VIEWコマンドの出力に、POLICY_NAMEカラムが含まれる」という機能で試してみます。

まずは現在の有効化された状態で試してみましょう。

DESCRIBE TABLE snowflake_sample_data.tpch_sf1.region;
╒═════════════╤══════════════╤════════╤═══════╤═════════╤═════════════╤════════════╤═══════╤════════════╤═════════╤═════════════╕
│ name        │ type         │ kind   │ null? │ default │ primary key │ unique key │ check │ expression │ comment │ policy name │
╞═════════════╪══════════════╪════════╪═══════╪═════════╪═════════════╪════════════╪═══════╪════════════╪═════════╪═════════════╡
│ R_REGIONKEY │ NUMBER(38,0) │ COLUMN │ N     │ NULL    │ N           │ N          │ NULL  │ NULL       │ NULL    │ NULL        │
├─────────────┼──────────────┼────────┼───────┼─────────┼─────────────┼────────────┼───────┼────────────┼─────────┼─────────────┤
│ R_NAME      │ VARCHAR(25)  │ COLUMN │ N     │ NULL    │ N           │ N          │ NULL  │ NULL       │ NULL    │ NULL        │
├─────────────┼──────────────┼────────┼───────┼─────────┼─────────────┼────────────┼───────┼────────────┼─────────┼─────────────┤
│ R_COMMENT   │ VARCHAR(152) │ COLUMN │ Y     │ NULL    │ N           │ N          │ NULL  │ NULL       │ NULL    │ NULL        │
╘═════════════╧══════════════╧════════╧═══════╧═════════╧═════════════╧════════════╧═══════╧════════════╧═════════╧═════════════╛

一番右側にPOLICY_NAMEカラムが含まれていますね。

では、バンドル2021_07を無効化してみます。

USE ROLE ACCOUNTADMIN;
SELECT SYSTEM$DISABLE_BEHAVIOR_CHANGE_BUNDLE('2021_07');
╒══════════════════════════════════════════════════╕                            
│ SYSTEM$DISABLE_BEHAVIOR_CHANGE_BUNDLE('2021_07') │
╞══════════════════════════════════════════════════╡
│ DISABLED                                         │
╘══════════════════════════════════════════════════╛

この状態で、もう一度DESCRIBE TABLEをしてみます。

DESCRIBE TABLE snowflake_sample_data.tpch_sf1.region;
╒═════════════╤══════════════╤════════╤═══════╤═════════╤═════════════╤════════════╤═══════╤════════════╤═════════╕
│ name        │ type         │ kind   │ null? │ default │ primary key │ unique key │ check │ expression │ comment │
╞═════════════╪══════════════╪════════╪═══════╪═════════╪═════════════╪════════════╪═══════╪════════════╪═════════╡
│ R_REGIONKEY │ NUMBER(38,0) │ COLUMN │ N     │ NULL    │ N           │ N          │ NULL  │ NULL       │ NULL    │
├─────────────┼──────────────┼────────┼───────┼─────────┼─────────────┼────────────┼───────┼────────────┼─────────┤
│ R_NAME      │ VARCHAR(25)  │ COLUMN │ N     │ NULL    │ N           │ N          │ NULL  │ NULL       │ NULL    │
├─────────────┼──────────────┼────────┼───────┼─────────┼─────────────┼────────────┼───────┼────────────┼─────────┤
│ R_COMMENT   │ VARCHAR(152) │ COLUMN │ Y     │ NULL    │ N           │ N          │ NULL  │ NULL       │ NULL    │
╘═════════════╧══════════════╧════════╧═══════╧═════════╧═════════════╧════════════╧═══════╧════════════╧═════════╛

POLICY_NAMEカラムが含まれなくなりました!

バンドルの有効化

最後にバンドルの有効化です。

現在のアカウントの指定されたリリースバンドルに含まれる動作の変更を有効にします。

デフォルトでは、動作変更バンドルは、発表前の期間中有効になっていません。ご使用のアカウントで有効になる前に、この機能を使用して動作の変更をテストします。

先程無効にしたバンドル2021_07を、再度有効化しましょう。

USE ROLE ACCOUNTADMIN;
SELECT SYSTEM$ENABLE_BEHAVIOR_CHANGE_BUNDLE('2021_07');
╒═════════════════════════════════════════════════╕                             
│ SYSTEM$ENABLE_BEHAVIOR_CHANGE_BUNDLE('2021_07') │
╞═════════════════════════════════════════════════╡
│ ENABLED                                         │
╘═════════════════════════════════════════════════╛

有効化されたので、もう一度DESCRIBE TABLEしてみましょう。

DESCRIBE TABLE snowflake_sample_data.tpch_sf1.region;
╒═════════════╤══════════════╤════════╤═══════╤═════════╤═════════════╤════════════╤═══════╤════════════╤═════════╤═════════════╕
│ name        │ type         │ kind   │ null? │ default │ primary key │ unique key │ check │ expression │ comment │ policy name │
╞═════════════╪══════════════╪════════╪═══════╪═════════╪═════════════╪════════════╪═══════╪════════════╪═════════╪═════════════╡
│ R_REGIONKEY │ NUMBER(38,0) │ COLUMN │ N     │ NULL    │ N           │ N          │ NULL  │ NULL       │ NULL    │ NULL        │
├─────────────┼──────────────┼────────┼───────┼─────────┼─────────────┼────────────┼───────┼────────────┼─────────┼─────────────┤
│ R_NAME      │ VARCHAR(25)  │ COLUMN │ N     │ NULL    │ N           │ N          │ NULL  │ NULL       │ NULL    │ NULL        │
├─────────────┼──────────────┼────────┼───────┼─────────┼─────────────┼────────────┼───────┼────────────┼─────────┼─────────────┤
│ R_COMMENT   │ VARCHAR(152) │ COLUMN │ Y     │ NULL    │ N           │ N          │ NULL  │ NULL       │ NULL    │ NULL        │
╘═════════════╧══════════════╧════════╧═══════╧═════════╧═════════════╧════════════╧═══════╧════════════╧═════════╧═════════════╛

ちゃんとPOLICY_NAMEカラムが出力されていますね。

まとめ

Snowflakeにおける「動作変更リリース」の制御を試してみました。

本番運用をしている環境では、動作変更を伴うリリース適用前に十分な検証・テストが必要となるケースがあるので、必要に応じてこの機能も利用していきたいですね。

どなたかのお役に立てば幸いです。それでは!