こちらの記事では、Terraformで定義したinput変数への値の渡し方について解説します。Terraformとは、IaC(Infrastructure as Code)を実現するための構成管理ツールの一つです。Terraformの変数にはinput、local、outputの3つの種類があります。今回はこの3つの変数のうちの一つ、input変数への値の渡し方について解説していきます。
Terraformのinput変数の定義方法については以下の記事をご覧ください。
https://envader.plus/article/190
また、IaCについては以下の記事で解説しています。
https://envader.plus/article/136
input変数を使うメリットとは?
Terraformにおいて、input変数は設定ファイルを再利用して異なる環境や条件でインフラストラクチャを管理する際に非常に便利です。input変数を使用すると、設定ファイルの中で変数を定義しそれらの値を後で変更できるため、コードの柔軟性と再利用性が向上します。
コードの柔軟性と再利用性とは?
input変数を使用することでコードの柔軟性と再利用性が向上すると述べました。これを具体的にコマンドラインで値を渡す例を用いて解説します。
企業やプロジェクトでは通常、開発環境、ステージング環境、本番環境など、異なる環境で同じインフラストラクチャが必要になります。しかし、コスト面やその他の観点からこれらの環境間で全く同じ環境を必要とするわけではなく、少しだけ変更したい場合があります。例えば、開発環境ではインスタンスを小さいサイズ、本番環境ではインスタンスサイズを大きくしたい、といった場合です。
ここで、Terraformのinput変数を使うと、同じコードを異なる環境で利用することが非常に簡単になります。以下の変数を定義していた場合を例に説明します。
# プロジェクトの環境を定義
variable "environment" {
description = "Deployment environment"
}
# インスタンスサイズを定義
variable "instance_size" {
description = "EC2 instance size"
}
先述した変数定義をもとに開発環境を構築する場合、コマンドラインから値を渡す際には以下のようになります。
terraform plan -var 'environment=dev' -var 'instance_size=t2.micro'
一方、本番環境ではインスタンスサイズを大きくしたいため、以下のように値を渡します。
terraform plan -var 'environment=prod' -var 'instance_size=m5.large'
このように開発環境と本番環境で渡す値を変更するだけで、インスタンスサイズを変更することができるため再利用性を高めることができます。また、ソースコードを直接編集することなく変更を行うことができるため、柔軟性があるとも言えるでしょう。
開発環境や本番環境については、以下の記事にて解説しています。
https://envader.plus/article/134
input変数へ値を渡す方法
input変数へ値を渡すには、コマンドライン、.tfvarsファイル、環境変数の3つから渡すことができます。
Terraformのinput変数は、variableブロックを使用しその変数の型や説明を記述することができます。ただ、この段階では変数を定義しているだけのため、変数の値は別途渡してあげる必要があります。(デフォルト値を設定している場合を除く)
変数の定義
今回は以下の変数を定義し、その変数に対して値を渡していきます。
variable "vpc_cidr" {
description = "The CIDR block for the VPC"
type = string
}
variable "subnet_cidrs" {
description = "The CIDR block for the subnet"
type = list(string)
}
コマンドラインから値を渡す
コマンドラインで変数の値を渡すには、terraform planコマンドやterraform applyコマンドを実行する際に-varオプションを使用します。
terraform plan -var="変数名=渡したい値"
terraform plan -var="vpc_cidr=10.0.0.0/16"
vpc_cidrとsubnet_cidrs変数に同時に値を渡したい場合には、-varオプションを複数指定します。
terraform plan -var="vpc_cidr=10.0.0.0/16" -var='subnet_cidrs=["10.0.1.0/24","10.0.2.0/24"]'
Windowsのコマンドプロンプトでは扱いが若干違うため注意が必要です。
Input Variables on the Command Line.
また、-var-fileオプションを使用することで、terraform.tfvarsなど別のファイルに変数を定義し、そのファイルを指定することができます。
terraform plan -var-file="terraform.tfvars"
変数定義ファイルから値を渡す
.tfvarsファイル、.tfvars.jsonファイルを作成することで、変数の値を渡すことができます。
Terraformでは、.tfvars、.tfvars.jsonファイルが存在している場合、自動的にそのファイルを読み込む設定になっています。作成したファイルの中に変数名と値を記述することで、その値を渡すことができます。
# .terraform.tfvars
vpc_cidr = "10.0.0.0/16"
subnet_cidrs = [ "10.0.1.0/24", "10.0.2.0/24" ]
tfvars.jsonファイルを作成する場合、記述方法はjson形式にする必要があるため注意が必要です。
# terraform.tfvars.json
{
"vpc_cidr": "10.0.0.0/16",
"subnet_cidrs": ["10.0.1.0/24","10.0.2.0/24"]
}
環境変数を設定する
環境変数を設定して値を渡すこともできます。
export TF_VAR_変数名='渡したい値'
export TF_VAR_vpc_cidr='10.0.0.0/16'
# listで値を渡す場合
export TF_VAR_subnet_cidrs='["10.0.1.0/24","10.0.2.0/24"]'
環境変数へ値を設定すると、.tfvarsファイルや-varオプションを使用せずに値を渡すことができます。環境変数の値を文字列として渡す場合には、シングルクウォートで囲むことで値を渡すことが可能です。
ただ、リストやマップ、オブジェクト型などの値を渡すには記述方法が複雑になり、エスケープ処理などを考慮する必要が出てきます。そのため公式では変数の型が複雑な場合、コマンドラインや環境変数ではなく、.tfvarsファイルなどの変数定義ファイルから値を渡すことが推奨されています。
実際に環境変数を設定する場面としては、認証情報やデータベースのパスワードなどの機密情報を扱う場面が挙げられます。
export AWS_ACCESS_KEY_ID='XXXXXXXXXXXXX'
export AWS_SECRET_ACCESS_KEY='XXXXXXXXXXXXXX'
変数が読み込まれる順番
Terraformでは、変数が読み込まれる際には順番があります。これは、変数定義ファイルの.tfvarsファイルとコマンドラインや環境変数で同じ変数に値を渡した時に適用される順番があるということです。
図のように初めに環境変数が読み込まれ、その後に.tfvarsファイル、.tfvars.jsonファイルと進みます。コマンドラインから値を渡す場合には、その値が環境変数や.tfvarsファイルの値を上書きし、優先的に使用されます。
input変数の参照方法
それぞれinput変数へ値を渡す方法を紹介しました。最後にinput変数への参照方法を解説します。渡した値を参照するには、var.vpc_cidrのように記述し値を参照します。
# VPCのCIDRブロックを設定する例
resource "aws_vpc" "main" {
cidr_block = var.vpc_cidr
}
このように記述することで、input変数へvpc_cidrとして10.0.0.0/16の値を渡していた場合、VPCには10.0.0.0/16のCIDRブロックが適用されます。
まとめ
今回はinput変数への値の渡し方について解説しました。
input変数へ値を渡す方法としては以下の3つの方法があります。
- コマンドラインから値を渡す
- .tfvarsファイル、.tfvars.jsonファイルなどの変数定義ファイルから値を渡す
- 環境変数を設定する
それぞれの方法についても理解しておくことはもちろん、変数の読み込まれる順番についてもしっかりと理解し運用を行っていきましょう。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.09.29
GitHub ActionsでAWSへのCI/CDを実現!初心者向けハンズオン
本記事では、CI/CDの基本概念と、それを簡単に実現できるツール GitHub Actionsを使って、実際にAWSにアプリケーションをデプロイする手順を紹介します。
- AWS
- ハンズオン
2023.10.19
インフラエンジニアの仕事内容について解説
こちらはEnvaderの記事になります。
- インフラエンジニア
- ネットワーク
- AWS
2023.10.30
IAMエンティティ応用 IAMロール・ポリシーについて解説
AWSのセキュリティを強化するための主要なサービスであるIAM(Identity and Access Management)には、多くのエンティティと概念が存在します。これらのエンティティの中でも、特に重要な「ロール」と「ポリシー」について、詳細に解説していくことが本記事の目的です。
- インフラエンジニア
- AWS