0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PR: 株式会社フューチャークリエーションファクトリー
F.C.Fでは、一緒に成長していくエンジニアを募集しています 🌱

Terraform入門 第2回:入力変数と出力値で設定を使いやすくする

0
Posted at

はじめに

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_regionvar.parameter_namevar.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.tfoutputs.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.tfdefaultではなく、コマンドラインで指定した値が使われます。

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-devcon-2nd-001.png

参照と暗黙的な依存関係

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の管理について学ぶ予定です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?