コピペコードで快適生活

明日使えるソースを自分のために

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}"
}

https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest/docs/data-sources/networking_subnet_v2

参考サイト