結論
Terraform Snowflakeプロバイダの外部テーブルより、locationの指定は「Required」との事だが、ドキュメントには具体的な記載方法が載っていないためよくわからなかったが、以下のように書くとよい。
resource "snowflake_external_table" "external_table" {
database = "MY_DATABASE"
schema = "MY_SCHEMA"
name = "MY_EXTERNAL_TABLE"
location = "@MY_DATABASE.MY_SCHEMA.MY_EXTERNAL_STAGE/path_to_file/"
file_format = "TYPE = PARQUET"
column {
name = "ID"
type = "VARCHAR"
}
column {
name = "DATA"
type = "VARCHAR"
}
}
背景
前述の通り、Terraformでのlocationの記述方法がわからなかったため、Snowflake公式ドキュメントの外部テーブルの記載を参考にTerraformに書いてみた。
その結果はエラー。どうやら書き方が違うらしい。
同じlocation(外部ステージ)を認識させるのに複数の書き方が考えられるが、なかなか正解に辿り着かなかったため記録に残しておこうと思った。
ぼやき
公式ドキュメントに記載例が書いてないパターン。
さらに、Terraform上の記載と、Snowflake(SQL)上の記載とではまた勝手が違うのも厄介。
- ステージを参照する書き方のバリエーション
-
@指定の省略表記
# SnowflakeのSQLではOK、TerraformではNGな書き方 @MY_EXTERNAL_STAGEこれがTerraformで通らないのは、納得がいかない。
なぜなら、外部テーブルを定義する際はdatabaseとschemaも必須パラメータであり、これら指定する時点でどのスキーマオブジェクトであるのかは(=どのスキーマ配下に存在する外部ステージなのか)は明確であるはずなので。
だが、Terraformでは認識できない仕様らしいので仕方ない。
-
@を付けない完全修飾表記
# SnowflakeのSQLではOK、TerraformではNGな書き方 MY_DATABASE.MY_SCHEMA.MY_EXTERNAL_STAGE -
@指定の完全修飾表記
# これで通るんかい... @MY_DATABASE.MY_SCHEMA.MY_EXTERNAL_STAGESnowflake上ではまずこのような指定はしないんじゃなかろうか。
-- SQLワークシートで書く時は、大体こうやるはず USE MY_DATABASE.MY_SCHEMA; CREATE EXTERNAL TABLE MY_EXTERNAL_TABLE( -- 中略 LOCATION=@MY_EXTERNAL_STAGE/path_to_file/ FILE_FORMAT = (TYPE = PARQUET) -- 中略 ;
-
よくわからんものですな...