terraform-provider-sakuracloud icon indicating copy to clipboard operation
terraform-provider-sakuracloud copied to clipboard

ゾーン指定ロジックの修正

Open lvctr opened this issue 1 year ago • 2 comments

#1123

lvctr avatar Jul 30 '24 23:07 lvctr

providers.goでTerraformが裏側で環境変数とConfigを考慮してc.Zoneの値を設定してくれてる

なので優先度の真ん中であるProfileを設定する条件は: ・c.Zoneが空っぽの時 ・c.Zoneがデフォルト値の時

Profileが読まれてるのはpcvの存在でわかる(pcv.Zoneが空っぽならProfileが読まれてない)

つまり、 (c.Zone == "" OR c.Zone=defaults.Zone) AND pcv.Zone != "" (現在の実装) だけど、configをis1bにしたらProfileで上書きされてしまう、なぜならdefaults.Zoneがis1bだから

pcv.Zoneの存在がわかったところでdefaults.Zoneがデフォルトで入れたis1bなのかTFファイルに明示的に入れたis1bなのかわからない

色々探った結果結局GetOk以外明示的に設定してるかどうかを確認する方法を見つからず、 先日話していたExplicitZoneていうフラグを使って解決できました ExplicitZone: func() bool { _, ok := d.GetOk("zone"); return ok }(),

とりあえずこれでプルリク出しますが、もしこれ以外の方法で解決した方がいいのであればまた議論できればと思ってます!!!

lvctr avatar Nov 25 '24 00:11 lvctr

@lvctr おそらく意図通りに動かない気がします。

// 優先度は 環境変数 (providers.go) < プロファイル (ここ) < tfファイル (providers.go)

  • schema.MultiEnvDefaultFunc([]string{"SAKURACLOUD_ZONE"}, defaults.Zone) がDefaultFuncとして設定されているので、SAKURACLOUD_ZONE env もしくは defaults.Zone の値が必ずzoneにセットされる
    • https://github.com/sacloud/terraform-provider-sakuracloud/blob/465ef05ecefd0058954c17b19fdee7a73dd403af/sakuracloud/provider.go#L55
  • このため、下記の d.GetOk("zone") 使って評価をしても ExplicitZone は必ず true となる
    • https://github.com/sacloud/terraform-provider-sakuracloud/blob/2ace0ea273e2a9d91464891301410b05f84881d2/sakuracloud/provider.go#L242
  • よって config.go 側のロジックでifの中に入ることがないので、profileを設定していても適用されなくなってしまいます
    • https://github.com/sacloud/terraform-provider-sakuracloud/blob/2ace0ea273e2a9d91464891301410b05f84881d2/sakuracloud/config.go#L119-L121

schema.MultiEnvDefaultFunc を使い続けるのかどうかも含めて検討していただくと良いかもしれません!

hekki avatar Dec 12 '24 08:12 hekki