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ファイルでも定義しなければならない

のは相変わらずでした。