今までのお仕事履歴 & まったりお仕事募集中♪

【質の良い無料コンテンツ紹介】

【ブラックレーベル】謎解き特集!【SCRAPゲームブック】

【通信制大学】産業能率大学に三年次編入しました

【悲報】ジュニアNISAで、買い付け口座を間違えていた話【NISA預りと特定預りは違うのよ】

当サイトではアフィリエイト広告を利用して商品を紹介しています。

【terraform】グローバル共通変数など、リソース間の変数受け渡し方法【Module】

仕事

terraformにおいて、フォルダ構成のベストプラクティスはよく掲載されている。

しかし、ベストプラクティスに沿って各リソースを構築する際の、変数受け渡し方法については記載されていないことが多かったため、今回まとめてみた。

結論から言うと、Moduleを活用すれば良さそうだ。

Moduleを使わず、Makefileを使う人も居るようだ。その辺は好みだろう。

terraformにおいて各リソース間の変数受け渡しを行う

下記のサンプルは一切、リソースを作成することなく、その辺の動作確認ができるように作成してみた。変数の流れを、ソースに書かれているコメントと併せて確認して貰えればと思う。

動作

簡単に言うと、以下の流れである。

  • ルートで定義した共通変数(例だとリージョン)をmodule1に渡して、文字列加工
  • module1で加工した文字列を、ルートのメインを経由してmodule2に渡して、更に文字列加工
  • module2からルートのメインに戻ってきて、その文字列を表示

ざっくり言うと、リソースは3つ(ルート・module1・module2)あり、「variables.tf」はそれぞれのリソースで使われるクラス変数的なものの集まり、「output.tf」はリソースの外に出したい変数を定義しているものだと思ってもらえれば良い。

下記のコードを示すとおりに追加し、「terraform init」「terraform plan」「terraform apply」を実行して、成功すれば「module1 variable name ! ap-northeast-1 Module2 !」がターミナルに表示される。

文字列センスがなさすぎて、笑える。

フォルダ構成

/root
|-- /module
| |-- /module1
| | |-- main.tf
| | |-- output.tf
| | |-- variables.tf
| |-- /module2
| | |-- main.tf
| | |-- output.tf
| | |-- variables.tf
|-- main.tf
|-- output.tf
|-- variables.tf

ソース

/module/module1/output.tf

output "module1_output_name" {
  value = "${var.module1_variable_name} + ${var.region}"
}

/module/module1/variables.tf

variable "module1_variable_name" {
  description = "module1_variable_name"
  type        = string
  default     = "module1 variable name !"
}

# module経由で値を受け取る時は、受け取り箱が必要
variable "region" {
  type = string
}

/module/module2/output.tf

output "module2_output_name" {
  value = "${var.module1_output_name} + Module2 !"
}

/module/module2/variables.tf

# module経由で値を受け取る時は、受け取り箱が必要
variable "module1_output_name" {
  type = string
}

/main.tf

module "module1" {
  source = "./modules/module1"
  # 共通変数を渡す(グローバル変数的な扱い)
  region = var.region
}

module "module2" {
  source = "./modules/module2"
  # module1⇒module2へ値を渡す(リソース間の変数受け渡し)
  module1_output_name = module.module1.module1_output_name
  # 共通変数を渡すことも可(グローバル変数的な扱い)
  # region = var.region
}

/output.tf

# module経由でmodule2の値を受け取り、表示
output "module2_output_name" {
  value = module.module2.module2_output_name
}

/variables.tf

# 共通変数

variable "region" {
  description = "The AWS region to deploy resources"
  type        = string
  default     = "ap-northeast-1"                     # リージョン(適切なものに変更)
}

コメント