terraform-provider-sakuracloud
terraform-provider-sakuracloud copied to clipboard
ゾーン指定ロジックの修正
#1123
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 おそらく意図通りに動かない気がします。
// 優先度は 環境変数 (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 を使い続けるのかどうかも含めて検討していただくと良いかもしれません!