🐣

モジュールの使い方 - Terraformのきほんと応用

2021/12/11に公開

ていねいを心掛けたTerraform記事です。スクリーンショット満載でやった気になれます。
Terraformといえばクラウドリソースの作成ですが、この記事ではローカルPC上のリソース作成で済むように工夫しています。
Terraform関連の他の記事は「Terraformのきほんと応用」からどうぞ。

概要

Terraformを使用しているとコードを再利用したくなります。インストールするソフトウェアが違うだけのサーバーを複数作成する場合などです。ファイルをコピーして対応しても良いのですが、変更が発生した場合に複数修正が必要になってしまい面倒です。
このような場合にはモジュール機能を使用します。この記事では、ローカルにファイルを作成するコードをモジュール化します。

ゴール

ファイル作成モジュールを使って、2つのファイルを作成します。
goal

必要なもの

  • 作業時間:15分
  • Terraformを実行できる環境

モジュールとは

Terraformではソースコードをモジュール化することで、テンプレートとして使うことができるようになります。テンプレートとは何でしょうか?日本語では定型文やひな形という意味になり、何かを作成する際の基礎にできる物をさします。
Terraformでは、サーバーを作成するソースコードをモジュール化してテンプレートにすることで、同じサーバーを1つのソースコードから複数つくる事ができます。
また、テンプレートにはパラメーターを指定することができるため、ほとんど同じだけど少し設定が異なるサーバーを1つのソースコードとして管理することができるのです。

モジュールの使い方

モジュールは親となるソースコードから呼び出します。
use modules
異なる親から同じモジュールを呼び出すこともできます。
use modules from multi parent
モジュールの呼び出し時にパラメーターを使うことで、ふるまいを制御することもできます。
use modules with parameter
モジュールを呼び出すコードは以下のように書きます。

module "リソースの名前" {
    source = "モジュールを定義したフォルダのパス"
    パラメーター名 = "パラメーター値"
}

モジュールの作り方

  1. モジュールの構造
    モジュールは以下の3つで成り立っています。

    1. パラメーター
    2. 本体
    3. 戻り値
      modules structure
  2. パラメーターを定義する
    パラメーターを定義することにより、親から受け取った値を本体で使用することができます。
    パラメーターは「variable」で定義します。

    variable "parameter_name" {
    }
    

    複数のパラメーターを定義することもできます。

    variable "parameter_1" {
    }
    variable "parameter_2" {
    }
    
  3. パラメーターを使用する
    パラメーターを本体で使用する場合は「var.パラメーター名」を使用します。

    resource "リソース定義名" "リソース名" {
        item_a = var.parameter_1
        item_b = var.parameter_2
    }
    
  4. 戻り値について
    戻り値を定義すると、モジュールを呼び出した親でその値を使用することができます。
    戻り値は「output」で定義します。

    output "debug_print" {
      value = "create from module with ${var.parameter_1}."
    }
    

    本記事では戻り値については詳細に説明しません。

モジュール化したファイル作成コードで複数のファイルを作成する

  1. terraformコード作成する
    最終的なファイル構成は以下の通りです。

    terraform/
    ├─ main1.tf
    ├─ main2.tf
    ├─ terraform.exe
    └─ modules/
      └─ helloworld.tf
    

    順番にファイルを作成します。

    main1.tf
    module "module_sample_main" {
      source = "./modules"
      content = "hello world!"
      filename = "hello.txt"
    }
    
    main2.tf
    module "module_sample_foobar" {
      source = "./modules"
      content = "foo bar!"
      filename = "foobar.txt"
    }
    
    modules/helloworld.tf
    variable "content" {
    }
    
    variable "filename" {
    }
    
    resource "local_file" "helloworld" {
        content  = var.content
        filename = var.filename
    }
    
    output "debug_print" {
      value = "${var.content} to ${var.filename}"
    }
    
  2. 実行結果を事前確認する
    実行結果を事前確認するために「plan」コマンドを実行します。

    terraform plan
    

    ファイル foobar.txt と hello.txt が作成されそうです。
    exec plan

  3. 実行してファイルを作成する
    ファイルを作成するために「apply」コマンドを実行します。

    terraform apply
    

    exec plan
    以下の通り2つのファイルが作成されました。
    exec plan
    ファイルの内容もパラメーターで指定した通りです。
    exec plan
    exec plan

サンプルコード

この記事で作成したコードはgithub上に公開しています。

参考ページ

  • Terraformオフィシャルの入力変数の説明

次はこれをやろう

Terraform関連の他の記事は「Terraformのきほんと応用」からどうぞ。

GitHubで編集を提案

Discussion