※本記事では、Terraformの導入方法やコードの詳細な説明は行いません。
データベースを構築する場合のコード例は以下のようになります。
TerraformでSnowflakeオブジェクトを構築・管理することにしたとしても、すべてのオブジェクトをTerraformで構築・管理する必要はありません。例えば、データベース、スキーマ、ロールはTerraform、その他のオブジェクトは別のツールを適用する、ということも可能です。オブジェクトの性質とTerraformの性能を考慮して、構築・管理方法を設計することが大切です。
それでは、「テーブル」はTerraformで管理すべきでしょうか?おそらく多くの人は、テーブルは個別に変更されることが多いオブジェクトなのでTerraformで一括管理するというのは適さない、と考えるのではないでしょうか。
そこで、本記事ではTerraformによりSnowflake上のテーブル構築と更新について検証しました。
※Snowflakeプロバイダーのバージョンは0.63.0
以下のコードが記述された.tfファイルを実行しました。
実行後、図1と同じカラムを持つテーブルがSnowflake上に作成されました。今回はSnowflake上でCOPYコマンドにより図1のとおりデータをロードしました。
ID | NAME | AGE |
---|---|---|
0 | 太郎 | 10 |
1 | 花子 | 20 |
図1、新規に構築したテーブル
図1のテーブルに対して、下記のとおりにコードを更新してカラム名変更を実行しました。
実行後、Snowflake上のテーブルは図2のとおり更新されました。
ID | AGE | NUM |
---|---|---|
0 | 10 | |
1 | 20 |
図2、カラム名変更後のテーブル
すなわち、カラム「NAME」がデータごと削除され、カラム「NUM」が追加されました。
図2のテーブルに対して、下記のとおりにコードを更新してカラム「NUM2」の追加を実行しました。
実行後、Snowflake上のテーブルは図3のとおり更新されました。
ID | AGE | NUM | NUM2 |
---|---|---|---|
0 | 10 | ||
1 | 20 |
図3、カラム追加後のテーブル
すなわち、カラム「NUM2」が追加されました。
注目すべきは、コード記述の順番によらず右端の列に追加されたことです。更新後のカラム並び順の制御は容易ではなさそうです。
図3のテーブルに対して、下記のとおりにコードを更新してカラム「AGE」のデータ型変更を実行しました。
実行後、カラム「AGE」のデータ型はNUMBER(9,0)に変更されました。Snowflake上のテーブル内データは図3から変更はなく、データ型変更ではテーブル内データに影響はありませんでした。
Terraformでテーブルのカラム名を更新したところ、元のカラムはデータごと削除、新しいカラムが空データの状態で追加されました。
本結果を踏まえると、TerraformによるSnowflakeテーブルの更新管理は注意が必要と考えられます。
.tfファイル実行で構築したオブジェクトの状態は、JSONファイルとしてファイル「terraform.tfstate」に保存されます。
上記の検証後にterraform.tfstateファイルに保存されたresource(カラム部分のみ抜粋)は以下のようになります。
カラムの情報はコード通りの順番で格納されるようです(Snowflakeのテーブル上での順番とは異なるので注意)。
Terraformは、自動化とコードの再利用を可能にするツールです。今回の「テーブル」のようにTerraformでの扱いが容易ではないオブジェクトもありますが、Terraformの性能とオブジェクトの性質の相性がよい場合には、Terraform導入によりオブジェクト構築・管理作業の負担が軽減することが期待されます。本記事の著者としては、Terraformの性能とオブジェクトの性質を踏まえた上で、Terraform導入を積極的に検討することがSnowflake環境構築の効率化につながると考えます。