はじめに
Terraformをゼロから学びながら、その内容を自分なりに整理して残していく入門連載です。
第1回では、Dev Container上でTerraformを実行し、AWS Systems Manager Parameter Storeにパラメータを1つ作成しました。
第1回の設定では、リージョンやパラメータ名、値をmain.tfに直接書いていました。しかし、環境ごとに設定値を変えたい場合、そのたびにTerraformコードを書き換えるのは不便です。
今回は、入力変数と出力値を使って、第1回のTerraform設定を使いやすくしていきます。
この記事は学習の記録を兼ねています。内容に誤りや、よりよい方法があればコメントで教えていただけると助かります。
今回のゴール
以下をできるようにすることが目標です。
- 入力変数を定義する
-
var.<変数名>で入力変数を参照する -
-varオプションとTF_VAR_環境変数で値を渡す -
outputブロックで作成したリソースの情報を表示する
今回もAWS Systems Manager Parameter Storeにパラメータを1件作成します。検証後はterraform destroyで削除します。
前提条件
以下の準備ができていることを前提に進めます。
- WSL2上のDev ContainerでAWS CLIとTerraformを利用できる
- AWS CLIで認証済みである
-
aws sts get-caller-identityで操作対象のAWSアカウントを確認済みである
環境構築とAWS認証の手順は、第1回を参照してください。
Terraform入門 第1回:Dev ContainerでAWSリソースを作成してみる
入力変数とは
入力変数は、Terraform設定の外から値を渡すための仕組みです。
変数は次の形式で定義します。
variable "<変数名>" {
# 設定
}
代表的な設定は次のとおりです。
| 設定 | 説明 |
|---|---|
description |
変数の説明 |
type |
値の型 |
default |
値が渡されなかった場合の既定値 |
validation |
受け入れる値の条件 |
sensitive |
CLI出力で値をマスクするかどうか |
入力変数は、Terraform設定内でvar.<変数名>として参照します。
var.aws_region
Terraform設定を更新する
第1回で作成したディレクトリに移動します。
cd terraform-aws-learning
今回は、設定を次の3ファイルに分けます。
terraform-aws-learning/
├── main.tf
├── variables.tf
└── outputs.tf
Terraformでは、同じディレクトリ内にある.tfファイルをまとめて1つの設定として扱います。ファイルを分けても、Terraformの動作は変わりません。
variables.tfを作成する
variables.tfを作成し、リージョン、パラメータ名、メッセージを変数として定義します。
variable "aws_region" {
description = "AWS region for provider operations"
type = string
default = "ap-northeast-1"
}
variable "parameter_name" {
description = "Name of the SSM parameter to create"
type = string
default = "/sandbox/example-message"
}
variable "message" {
description = "Value to store in the SSM parameter"
type = string
default = "hello-from-terraform"
}
defaultを指定した変数は、値を渡さなかった場合に既定値が使われます。
main.tfを更新する
main.tfを次の内容に更新します。
terraform {
required_version = ">= 1.5.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 6.55"
}
}
}
provider "aws" {
region = var.aws_region
}
resource "aws_ssm_parameter" "example" {
name = var.parameter_name
type = "String"
value = var.message
tier = "Standard"
}
var.aws_region、var.parameter_name、var.messageが、variables.tfで定義した入力変数の参照です。
outputs.tfを作成する
outputs.tfを作成し、作成したSSMパラメータの情報を出力します。
output "parameter_name" {
description = "Name of the SSM parameter"
value = aws_ssm_parameter.example.name
}
output "parameter_arn" {
description = "ARN of the SSM parameter"
value = aws_ssm_parameter.example.arn
}
output "parameter_version" {
description = "Current version of the SSM parameter"
value = aws_ssm_parameter.example.version
}
出力値は次の形式で定義します。
output "<出力名>" {
value = <値>
}
aws_ssm_parameter.example.arnのような記述は、リソース属性の参照です。
<プロバイダ名>_<リソースタイプ>.<Terraform内の名前>.<属性名>
今回のaws_ssm_parameter.example.arnは、aws_ssm_parameterリソースのexampleという名前で作成したSSMパラメータのARNを参照しています。
利用できる属性はリソースごとに異なります。AWS Providerのドキュメントで確認できます。
設定を初期化・検証する
設定ファイルを整形して確認します。
terraform fmt -check
続けて、設定を検証します。
terraform init -backend=false
terraform validate
variables.tfやoutputs.tfを追加しただけであれば、Providerやバックエンドの設定変更はありません。それでも、初めてこのディレクトリを使う場合や.terraformディレクトリを削除した場合は、terraform initが必要です。
既定値で実行計画を確認する
すべての変数にdefaultを設定したため、-varオプションなしで実行計画を確認できます。
terraform plan
以下のように、既定値を使ってSSMパラメータが1件作成される計画が表示されます。
Plan: 1 to add, 0 to change, 0 to destroy.
-varオプションで値を上書きする
入力変数の値は、-varオプションで上書きできます。
terraform plan \
-var="parameter_name=/sandbox/hello-from-variables" \
-var="message=Hello from Terraform variables"
このコマンドでは、variables.tfのdefaultではなく、コマンドラインで指定した値が使われます。
aws_regionも変更する場合は、次のように指定します。
terraform plan \
-var="aws_region=ap-northeast-1" \
-var="parameter_name=/sandbox/hello-from-variables" \
-var="message=Hello from Terraform variables"
環境変数で値を渡す
TF_VAR_<変数名>という環境変数を設定しても、入力変数へ値を渡せます。
export TF_VAR_parameter_name="/sandbox/hello-from-environment"
export TF_VAR_message="Hello from environment variables"
terraform plan
環境変数は、CI/CD環境などでTerraformを実行する場合にも利用できます。
ただし、パスワードやアクセストークンなどの秘密情報を環境変数に設定する場合は、シェルの履歴やログに残らないように扱いに注意してください。
リソースを作成し、出力値を確認する
ここでは-varオプションで値を渡してリソースを作成します。
terraform apply \
-var="parameter_name=/sandbox/hello-from-variables" \
-var="message=Hello from Terraform variables"
確認プロンプトでyesを入力すると、SSMパラメータが作成されます。
作成後、outputブロックで定義した値が表示されます。
Outputs:
parameter_arn = "arn:aws:ssm:ap-northeast-1:123456789012:parameter/sandbox/hello-from-variables"
parameter_name = "/sandbox/hello-from-variables"
parameter_version = 1
terraform outputを実行すると、Stateに保存されている出力値を後から確認できます。
terraform output
特定の出力値だけを確認することもできます。
terraform output parameter_arn
参照と暗黙的な依存関係
Terraformのリソース属性を別のリソースで参照すると、Terraformは参照関係から作成順序を判断します。これを暗黙的な依存関係と呼びます。
例えば、次のように別のリソースでaws_ssm_parameter.example.arnを参照した場合、Terraformは参照元のリソースを作成した後に、参照先のリソースを作成します。
resource "example_resource" "dependent" {
parameter_arn = aws_ssm_parameter.example.arn
}
多くの場合、depends_onを明示しなくても、属性を参照するだけで正しい順序をTerraformが判断します。
依存関係は、次のコマンドでグラフとして確認できます。
terraform graph
リソースを削除する
検証が終わったら、作成したリソースを削除します。
apply時に-varオプションでパラメータ名を上書きしたため、削除時も同じ値を渡します。
terraform destroy \
-var="parameter_name=/sandbox/hello-from-variables" \
-var="message=Hello from Terraform variables"
実行計画に次の内容が表示されることを確認してから、yesを入力します。
Plan: 0 to add, 0 to change, 1 to destroy.
まとめ
今回は、入力変数と出力値を使って、Terraform設定を使いやすくしました。
-
variableブロックで設定を外から渡せるようにできる -
var.<変数名>で入力変数を参照できる -
defaultを設定すると、値を省略した場合の既定値を決められる -
-varオプションやTF_VAR_<変数名>環境変数で値を上書きできる -
outputブロックで、作成したリソースの情報を確認できる -
<リソース>.<名前>.<属性>の形式でリソース属性を参照できる
次回は、Terraform Stateの役割と、S3リモートバックエンドを使ったStateの管理について学ぶ予定です。

