モジュールはいくつかのTerraformコードをまとめたものです。
step5ディレクトリを作成、移動して実施ください。以降のプラクティスはすべてstep5ディレクトリ内で行う想定です。versions.tfを作成しておいてください。必要に応じてmain.tf、varibales.tf、output.tf、terraform.tfvarsも作成してください。すべてのリソースにはStep=step5のタグを設定します。ファイルはステップ内で同じものを続けて使ったください。
モジュールにすると複数のリソースをまとめてデプロイできます。Terraformコードをモジュール化する方法は、モジュール化したいコード群を1つのディレクトリにまとめるだけです。モジュールはmoduleブロックを使って呼び出します。呼び出し元をルートモジュール、呼び出されるモジュールを子モジュールと言います。
子モジュールは呼び出されるモジュールであるため、versions.tfやterraform.tfvarsなどは不要です。ルートモジュールから値を設定したり、モジュールで作成したリソースの値をルートモジュールに返すにはvariables.tfやoutput.tfが必要です。
プラクティス
step5ディレクトリ配下にnetworkディレクトリを作成し、以下のコードを作成してください。step5ディレクトリ直下に以下のコードを作成します。- networkモジュールをデプロイ。ソースのパスは相対パス(./network)で指定します。
- networkに必要な変数を設定します。(値は変数で指定してもいいし、直接指定してもいいです。)
- networkで作成したvpcとsubnetのidを表示するようにします。(モジュールの値はmodule.<モジュール名>.<変数名>で参照できます。)
- networkモジュールをデプロイ。ソースのパスは相対パス(./network)で指定します。
- initしてplanしてapplyします。
モジュールは何度も呼び出せます。
プラクティス
step5ディレクトリ直下に以下のコードを作成します。- 追加でもう1つnetworkモジュールをデプロイします。ソースのパスは相対パス(./network)で指定します。
- networkに必要な変数を設定します。(値は変数で指定してもいいし、直接指定してもいいです。1つ目と値を変えても変えなくてもいいです)
- 追加のnetworkで作成したvpcとsubnetのidも表示するようにします。
- 追加でもう1つnetworkモジュールをデプロイします。ソースのパスは相対パス(./network)で指定します。
- initしてplanしてapplyします。
モジュールで作成した値を別モジュールで参照もできます。なお、ルートモジュールから呼び出す子モジュールを追加する場合、再度initが必要です。
プラクティス
step5ディレクトリ配下にcomputeディレクトリを作成し、以下のコードを作成してください。- ec2を作成します。
- amiはそのリージョンの最新のAmazonLinux2を指定します。
- amiのidは変数にして入力してもいいし、dataで引っ張ってきてもいいです。dataで読み込む場合、こちらにある通り、SSMパラメーターで取得できます。データの取得はaws_ssm_parameterを使います。
- インスタンスタイプは変数で指定します。
- subnetは変数で指定します。
- amiはそのリージョンの最新のAmazonLinux2を指定します。
- ec2を作成します。
step5ディレクトリ直下に以下のコードを作成します。- computeモジュールをデプロイします。
- インスタンスタイプは
t3.microを設定します。 - サブネットのIDは1つ目のnetworkモジュールで作成した0番目のサブネットIDを指定します。
- インスタンスタイプは
- computeモジュールをデプロイします。
- initしてplanしてapplyします。
- destroyします。またはmain.tfをすべてコメントアウトしてapplyします。