■ はじめに
https://dk521123.hatenablog.com/entry/2023/05/03/000000
より分冊。 Terraform の Module について扱う。
目次
【1】モジュール - module 【2】モジュール化の一例 【3】モジュール種類 1)ローカルモジュール 2)リモートモジュール 【4】Terraform Registry 1)Verifiedモジュール 2)Communityモジュール 【5】構文 1)呼び出し 【6】サンプル 1)フォルダ構成 2)TFコード 3)動作確認
【1】モジュール - module
* 単一のディレクトリにあるTerraform構成ファイルのセット => Terraformのソースコードをテンプレート化し 再利用可能にする仕組み(関数的な)
https://developer.hashicorp.com/terraform/language/modules/sources
【2】モジュール化の一例
モジュール化前
+ alb.tf + ec2.tf + local.tf + main.tf + provider.tf + rds.tf + variables.tf + version.tf + vpc.tf
モジュール化後
+ envs + local.tf + main.tf + provider.tf + version.tf + modules + system + alb.tf + ec2.tf + rds.tf + variables.tf + vpc.tf
【3】モジュール種類
1)ローカルモジュール 2)リモートモジュール
1)ローカルモジュール
* ローカルで用意したモジュール
2)リモートモジュール
* リモートソースからロードするモジュール =>
例
* Terraform Registry(後述) * バージョン管理システム * HTTP URL * Terraform Cloud * Terraform プライベートモジュールレジストリ
【4】Terraform Registry
* Terraform Registryについては、以下のURLで公開している
https://registry.terraform.io/browse/modules
* Terraform Registryには、以下の2通りある。 1)Verifiedモジュール 2)Communityモジュール
1)Verifiedモジュール
* 主要なクラウドプロバイダなどから提供され それらをHashiCorp社によって検証されたモジュール
2)Communityモジュール
* コミュニティによって登録されて公開されているモジュール
【5】構文
1)呼び出し
# module で呼び出す module "<ResourceName>" { source = "<Path>" # e.g. "./hello" <Key1> = "<Value1>" # e.g. content = "Hello" }
【6】サンプル
* ローカルモジュールをHello world的に作ってみる
1)フォルダ構成
+ main.tf + hello + hello.tf + world + world.tf
2)TFコード
main.tf
module "demo_module_for_hello" { source = "./hello" content = "Hello" filename = "hello.txt" } module "demo_module_for_world" { source = "./world" content = "World!!" filename = "world.txt" } output "result_from_hello" { value = module.demo_module_for_hello.return_value } output "result_from_world" { value = module.demo_module_for_world.return_value }
hello/hello.tf
# Step1: Input Parameters variable "content" { } variable "filename" { } # Step2: resource "local_file" "just_implement1" { content = var.content filename = var.filename } # Step3: Output(Optional) output "return_value" { value = "Output from Hello: ${var.content} - ${var.filename}" }
world/world.tf
# Step1: Input Parameters variable "content" { } variable "filename" { } # Step2: Implement resource "local_file" "just_implement2" { content = var.content filename = var.filename } # Step3: Output(Optional) output "return_value" { value = "Output from World: ${var.content} - ${var.filename}" }
3)動作確認
terraform init # terraform plan # 実行 terraform apply ・・・ Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: result_from_hello = "Output from Hello: Hello - hello.txt" result_from_world = "Output from World: World!! - world.txt" # 「hello.txt」と「world.txt」があるはず
参考文献
https://qiita.com/m-oka-system/items/e69d6bb86eae74619a27
https://zenn.dev/sway/articles/terraform_biginner_modules
関連記事
Terraform ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/04/05/000224
Terraform ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/12/09/222057
Terraform ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/05/03/000000
Terraform ~ Terraformあれこれ ~
https://dk521123.hatenablog.com/entry/2023/05/15/205352
Terraform ~ AWS IAM ~
https://dk521123.hatenablog.com/entry/2023/04/12/214311
Terraform ~ AWS S3 ~
https://dk521123.hatenablog.com/entry/2023/04/09/104204
Terraform ~ AWS MSK ~
https://dk521123.hatenablog.com/entry/2023/05/14/122215
Terraform ~ 機密情報の扱いを考える ~
https://dk521123.hatenablog.com/entry/2023/05/18/005103