Terraform学習メモ
初めに
Terraformの概要と学習メモ
※Terraform ver.0.14を題材にした教材
コマンド
-
terraform init
terraform環境で使うプロバイダ(Provider)情報を取得・セットアップするコマンド。
プロバイダには、AWSの他GCPなど、様々なものがある。ディレクトリ移動したらまず必ず実施する必要があるコマンド。 -
terraform plan
実行されたディレクトリ上において、コードで定義されたリソースと作成・削除などの起こることが表示されるコマンド。apply
の前には必ずチェックすること。 -
terraform apply
リソースを作成するコマンド。確認ののち、yesを押すことでリソースの作成が実施される。 -
terraform destroy
apply
で作成されたリソースを削除するコマンド。
インフラを定義するファイルの記法など
Resourceブロック
プロバイダによって提供されており、ここに書いた情報で各種AWSリソースが作成される。
定義方法は、リソース名(下は「EC2」)と、そのリソースにつけるローカルネーム(下は「test」)をつける。
例.
resource "aws_instance" "test" {
以下情報
}
これで作られたリソースの情報は、以下で取得できる。
<RESOURCE TYPE>.<NAME>.<ATTRIBUTE>
例. 上記の「test」インスタンスから、ARNを取得する場合
aws_instance.test.arn
Variableブロック
変数定義のためのブロック。様々な変数の参照方法がある。
変数については後述。
Providerブロック
先述のプロバイダー情報(サービス名・バージョンなど)を定義。
変数
インプット変数
Variableブロックで定義する。
variable "image_id"{
以下変数情報
}
の形式。
この中では、変数のtype(String, number, mapなど)や、description, default値, sensitive(※apply実行時に実際の変数を表示させないようにする設定)などが記載できる。
変数へのアクセス
variableブロックで定義した変数などには、var.<NAME>
の形式で変数にアクセス。
例えば、
resource "aws_instance" "test" {
instance_type = "t2.micro"
ami = var.image_id
}
のように記載することで、image_idのインプット変数を取ってこれる。
なお、変数はapply
コマンド時に-var
オプションを使うことで上書くこともできる。
terraform apply -var="image_id=ami-xxxxxxxd"
アウトプット変数
resouceブロックで定義・作成されたリソースの情報を、他のリソースで使えるようにする役割を持つ。以下のように、アウトプット変数としてアウトプットブロックで定義している、
例. 作成後のインスタンスのIPアドレスをアウトプット変数化している。
output "instance_ip_address" {
value = aws_instance.test.private_ip
}
ここで定義したアウトプット変数は、terraform apply
コマンド実行後に、Outputs:
としても表示されるようになる。
ローカル変数
localブロックを使って作成し、同じモジュール (= 同じフォルダ内)からしか参照できない変数。変数として複数回利用でき、インターナルな環境のみで使う場合に有効な変数。
値のタイプ
以下の種類がある。
- string :文字列形式。
””
で囲む。
string_var = "hogehoge"
- number:数字。特に何も囲まない数字。
number_var = 100
- bool:true/false形式の値。これも何も囲まない。
bool_var = true
- list:複数定義する値。
[]
内で定義。
例.aws_regions = ["us-west-1a", "us-west-1c"]
- map:キーバリューペアの値。
{}
内で定義。
map_var = {
a = "hoge"
b = 100
c = true
}
データソース
dataブロックで定義する。用途としては、モジュール外(同一ディレクトリではない)のリソースから、情報を引っ張る場合に活用する。モジュール外のリソースとしては、別モジュールのmain.tfや、AWSが提供するリソース、コンソールで作成されたリソースなどがある。これらの情報を、dataブロック内で定義するfilterで探し、持ってくる。
例. AWS提供の最新のAL2 AMIを持ってくる場合。
data "aws_ami" "amazon_linux_2" {
most_recent = true
owners = ["amazon"]
filter {
name = "owner-alias"
values = ["amazon"]
}
filter {
name = "name"
values = ["amzn2-ami-hvm-*-x86_64-ebs"]
}
}
dataブロックで定義した値を引く場合は、以下のように引く。
例.上記AMI IDを引っ張る場合。
ami = data.aws_ami.amazon_linux_2.id