【Terraform】Terraform ~ 基本編 / Module ~

■ はじめに

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

モジュール化後

+ enviroments
 | + dev
 |  | + local.tf
 |  | + main.tf
 |  | + provider.tf
 |  | + version.tf
 | + prod
 |    ...
+ modules
  + ec2
  + vpc
   ...

【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