Snowflakeのアカウント複製で開発環境を作ってみた

 DBManiaです。Snowflakeでアカウント複製機能がGAになりましたね。
 これでレプリケーションやフェイルオーバーが自由にできるようになったのですが、アカウント複製でできるのはそれだけではありません。
 この機能を利用すると、本番環境から独立した開発環境を、しかもBUSINESS CRITICALでないENTERPRISE契約でも簡単に構築することもできるのです。
 アカウントを分けることで、ユーザーやロールを本番環境と完全に独立でき、また「うっかり本番環境に変更を加えてしまった!」といった事故を防げます。
 実際にアカウント複製を利用して開発環境を構築してみましたので、その方法について書きたいと思います。

やること

 本番環境に存在するPRODデータベースを、アカウントを跨いでコピーして、本番環境とは独立した開発環境用データベースとして利用します。
 なお、Snowflakeの公式手順ではオプションとして専用ロールを作成する形で記述されていますが、今回はデフォルトに存在するORGADMINやACCOUNTADMINを利用して作業を行います。

設定

 組織:DUMMYORG
 本番環境アカウント:SRCACCOUNT
 テスト環境アカウント:DESTACCOUNT

STEP1:アカウント複製を有効にする

 アカウント複製は初期値では無効になっているため、有効化する必要があります。
 アカウント複製を有効にする手順については、こちらに書かれています。
 コピー元、コピー先両方に対してパラメーターを設定するだけですので、それほど難しい作業ではありません。

use role ORGADMIN;
--本番環境側を有効化
select
SYSTEM$GLOBAL_ACCOUNT_SET_PARAMETER(
   'DUMMYORG.SRCACCOUNT'
 , 'ENABLE_ACCOUNT_DATABASE_REPLICATION'
 , 'true');

--開発環境側を有効化
select SYSTEM$GLOBAL_ACCOUNT_SET_PARAMETER(
   'DUMMYORG.DESTACCOUNT'
 , 'ENABLE_ACCOUNT_DATABASE_REPLICATION'
 , 'true');

STEP2:レプリケーショングループを作成する

 アカウント複製を有効にする手順はフェイルオーバーグループについて書かれていますが、フェイルオーバーはBUSINESS CRITICAL以上でないと使用できません。
 そのため、レプリケーショングループを使います。
 レプリケーショングループについてはこちらに書かれています。(なお、こちらのドキュメントにはアカウント複製を有効にする手順については直接書かれておらず、先ほどのドキュメントを参照するように記述されています。)
 レプリケーショングループもBUSINESS CRITICAL以上でないと全ての機能を使うことはできないのですが、ENTERPRISEでもデータベースの同期なら可能です。
 まずはコピー元でALLOWED_DATABASESに同期したいデータベース名を列記し、ALLOWED_ACCOUNTSに同期先のアカウントを記述してレプリケーショングループを作成します。

-- 本番環境側で実行
use role ACCOUNTADMIN;
CREATE REPLICATION GROUP MY_REPLICATION_GRP
OBJECT_TYPES = DATABASES
ALLOWED_DATABASES = PROD
-- コピー先のアカウントを指定
ALLOWED_ACCOUNTS = DUMMYORG.DESTACCOUNT;

 次に、コピー先で先ほど作成したレプリケーショングループのレプリカを作成します。

-- 開発環境側で実行
use role ACCOUNTADMIN;
CREATE REPLICATION GROUP MY_REPLICATION_GRP
-- コピー元のアカウントを記述
AS REPLICA OF DUMMYORG.SRCACCOUNT.MY_REPLICATION_GRP; 

 この段階では、まだデータベースはコピーされていません。
 そのため、開発環境側のデータベース一覧を見ても、PRODというデータベースは表示されませんが、問題ありません。

STEP3:データベースをコピーする

 データベースをコピーするためには、先ほど作成したレプリケーショングループを更新(REFRESH)する必要があります。

-- 開発環境側で実行
use role ACCOUNTADMIN;
ALTER REPLICATION GROUP MY_REPLICATION_GRP REFRESH;

 これを実行してしばらく待つと、データベースがコピーされ、開発環境側にPRODというデータベースが出現します。
 開発環境に複製したデータベースは、本番環境のレプリカですので、読み取り専用となります。
 開発環境として自由に使用するためには読み取り専用を解除して、書き込み可能な状態にする必要があります。

STEP4:読み取り専用を解除して開発用データベースにする。

 書き込み可能にするためにPRODデータベースをcreate database cloneでクローンしてもいいのですが、実はもっと簡単な方法があります。
 Snowflakeのドキュメント、DROP REPLICATION GROUPの説明にはこう書かれています。

セカンダリ複製グループがドロップされると、以前にグループに含まれていたデータベースは読み取り専用保護を失い、書き込み可能になります。

 つまり、レプリケーショングループを解除すれば、先ほどコピーしたPRODデータベースは書き込み可能になるのです!

-- 開発環境側で実行
use role ACCOUNTADMIN;
DROP REPLICATION GROUP MY_REPLICATION_GRP;

 これで、開発環境側で自由に利用できるデータベースが作成できました。
 なお、データベースへのアクセス権限はコピーされていませんので、GRANT文で開発用ROLEにデータベースなどへのアクセス権限を付与することを忘れずに。