Improve my terraform modules
以前terraformのmain.tfをモジュールに分割した際に、モジュール同士で変数をやり取りする方法について書きました。
モジュール間の変数のやり取りはregion = "${droplet_region}"みたいに書く
Split main.tf into modules, my server was dead
しかし、最近になって以下のようなエラーが出るようになっていました。
$ terraform plan
There are warnings and/or errors related to your configuration. Please
fix these before continuing.
Errors:
* invalid variable syntax: "droplet_region". If this is part of inline `template` parameter
then you must escape the interpolation with two dollar signs. For
example: ${a} becomes $${a}.
${droplet_region}
は$${droplet_region}
と間違えてないかい?というエラーですね。
どうやら0.8.0-beta1から${foo}
という書き方が廃止されたっぽいですね(それにしてもなぜ今までモジュール間変数として使えていたのか謎ですが...)。
template_file inline templates must escape their variable usage. What was previously ${foo} must now be $${foo}. Note that this is only for inline templates. Templates read from files are unchanged. (#9698)
terraform/CHANGELOG.md at master · hashicorp/terraform · GitHub
$${foo}
はテンプレートプロバイダで使う変数みたいです。テンプレートプロバイダは使ったことがないのでよく知らないのですが、terrafromのリソースのアトリビュートを使って、cloudinitなどのファイルをterraform apply時に動的に生成することができる機能なんでしょうか?
面白そうな感じがする&事例(特に日本語)もあまりないので後で試してみようと思います。
本題
さて、モジュール間で変数をやり取りできなくなってしいました。でもよく考えれば、モジュール間で依存関係が有るような作りは良くないですね。
ということで以下のような感じで、main.tfで変数のやり取りをするようにしました。mail.tfの行数が増えてしまいますが、変数の定義だけだし...。
module "networking" {
source = "./modules/digitalocean/networking"
mailgun_key = "{var.mailgun_key}"
+ droplet_id = "${module.droplet.droplet_id}"
+ droplet_region = "${module.droplet.droplet_region}"
}
dropletモジュールでoutputされた変数をmain.tf側でnetworkingモジュールの変数にセットすることで、モジュール間の変数をやり取りしています。
こんな感じで正しい書き方で変数を書くようにしたからか、
- なんかfloaring ipが使えない問題
- 仕方がないのでfloating ipはやめてdropletのipをリソースの変数で指定したんだけどこれもエラー問題
Split main.tf into modules, my server was dead
が解決しました☆
- どうやら環境変数やterraform.tfvarsを利用する変数の場合は、モジュール呼び出し側のtfファイルでも定義しなければならない
のは相変わらずでした。