Terraform覚え書き
滅多に使わなくて忘れると思ったので。
terraform install
tfenvでバージョン切り替えできる
コマンド
# 必要となるpluginをインストールする。 terraform init # 設定ファイルが正しいかチェック/本番環境との差分出力 terraform plan # チェックの通った設定ファイルを本番環境に適用する terraform apply
- tfstateファイルはapplyのたびに生成される、現在の環境状態を表したJSONファイル。
設定ファイル
# 設定ファイルの拡張子は *.tf # providerにはawsやopenstackが入る provider "xxx" { } # 実際に作成するリソースを定義する resource "aaa(リソースの種類)" "bbb(リソースの名前)" { }
- terraformがビルドに使うのはカレントディレクトリにある.tfファイル
- リソースの種類は、プロバイダーがAWSの場合はaws_*という名前でTerraformで予め定義されています。VPCであればaws_vpc、EC2であればaws_instanceです。
変数の定義と参照
variable "access_key" {} variable "secret_key" {} provider "aws" { access_key = "${var.access_key}" secret_key = "${var.secret_key}" region = "ap-northeast-1" }
変数代入は下記3種あり
- オプション渡し
- 環境変数渡し
- ファイルで定義 (terraform.tfvars, variables.tf)
output
outputを指定することで、terraformコマンド実行時に指定した属性値がコンソール上に出力できる。
output "public ip of cm-test" { value = "${aws_instance.cm-test.public_ip}" }
Module
モジュールの定義
# modules/VPC/main.tf variable "vpc_cidr_block" {} variable "vpc_name" {} resource "aws_vpc" "this" { cidr_block = var.vpc_cidr_block instance_tenancy = "default" enable_dns_hostnames = true tags = { Name = "${var.vpc_name}-vpc" } }
モジュールを組み込む側
# module.tf module "vpc_hoge" { source = "./modules/VPC" vpc_cidr_block = "10.0.0.0/16" vpc_name = "hogehoge" }
- これで、
./modules/VPC/main.tf
で定義された resource をベースにしたモジュールができる。 - 参照先にresourceが複数ある場合は、module読み込みで全部作成される。
- 指定した値(vpc_cidr_blockやvpc_name)は、module内の変数に渡される。
同じリソースを複数作る
resource "openstack_compute_floatingip_associate_v2" "example" { count = "${var.example_count}" floating_ip = "${element(openstack_networking_floatingip_v2.example.*.address, count.index)}" instance_id = "${element(module.example.ids, count.index)}" }
- countは、作成するリソースの数。
- elementは、
element retrieves a single element from a list.
DataResources
リソースのデータを取得する。
以下の例では、data "openstack_networking_subnet_v2"
を使うことで、openstack_networking_subnet_v2 リソースのデータを取得できるようになる。
# 定義 data "openstack_networking_subnet_v2" "subnet" { name = "subnet_1" } # subnet_1のデータを参照する module "app" { cidr = "${data.openstack_networking_subnet_v2.subnet.cidr}" }