Snowflake Knowledge - INSIGHT LAB

【Snowflake × Terraform】Terraformで作成したSnowflakeテーブルのカラム名更新

作成者: neco|2023年5月16日

記事の要点

  • Terraformで作成したSnowflake上のテーブルの更新について検証しました。
  • Terraformでテーブルのカラム名を更新したところ、元のカラムはデータごと削除、新しいカラムが空データの状態で追加されました。
  • TerraformでSnowflake上にテーブルを構築する際は動作にご注意を!
  • 使用したSnowflakeのproviderは0.63.0です。

はじめに

Terraformとは

  • HashiCorp社によるオープンソースのinfrastructure-as-code(IaC)ソフトウエアツールです。
  • AWS、Azure、GCPなどのインフラのリソースをコードで構築・管理できます。
  • Snowflakeにおいても、データベース、ウェアハウス、スキーマ、テーブル、タスク、ロールなどのオブジェクトを構築・管理できます。
  • gitによるバージョン管理が可能です。
  • IaCのメリットである自動化やコードの再利用をSnowflakeオブジェクト管理において実現できます。
  • 参考リンク:

Snowflake×Terraformコード例

※本記事では、Terraformの導入方法やコードの詳細な説明は行いません。

データベースを構築する場合のコード例は以下のようになります。

 

  • プロバイダーの指定と設定、リソースを記述したコードを拡張子.tfのファイルに保存することで実行可能なファイルを作成できます。
  • .tfファイル実行後、コードを更新して再度実行することで、オブジェクトの更新(新規作成、変更、削除)を行うことができます。
  • 「terraform destroy」コマンドを使用することで構築したオブジェクトをまとめて削除することができます。

Snowflakeで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テーブルの更新管理は注意が必要と考えられます。

 

参考:カラム更新でファイル「terraform.tfstate」はどうなるか

.tfファイル実行で構築したオブジェクトの状態は、JSONファイルとしてファイル「terraform.tfstate」に保存されます。

上記の検証後にterraform.tfstateファイルに保存されたresource(カラム部分のみ抜粋)は以下のようになります。

カラムの情報はコード通りの順番で格納されるようです(Snowflakeのテーブル上での順番とは異なるので注意)。

 

最後に

Terraformは、自動化とコードの再利用を可能にするツールです。今回の「テーブル」のようにTerraformでの扱いが容易ではないオブジェクトもありますが、Terraformの性能とオブジェクトの性質の相性がよい場合には、Terraform導入によりオブジェクト構築・管理作業の負担が軽減することが期待されます。本記事の著者としては、Terraformの性能とオブジェクトの性質を踏まえた上で、Terraform導入を積極的に検討することがSnowflake環境構築の効率化につながると考えます。