Terraform

Table of Contents

Terraform

remote state

別アカウントのS3 backed stateから情報を読み出す。 terraform-state-other-accountバケットのバケットポリシーで、 読みに行きたいアカウントの許可を設定する。

data "terraform_remote_state" "other_account" {
  backend = "s3"

  config {
    bucket = "terraform-state-other-account"
    key    = "state"
    region = "ap-northeast-1"
  }
}

s3 backed state

local stateからs3 backed stateへの移行はterraform initコマンド時にやってくれる。 s3のバケット作成、terraform側の設定を行ってterraform initするだけ。

terraform {
  backend "s3" {
    bucket = "terraform-state-gside"
    key    = "state"
    region = "ap-northeast-1"
    acl    = "private"
  }
}

multi region

aliasが指定されていないproviderがデフォルトになる。

provider "aws" {
  region = "ap-northeast-1"
}


provider "aws" {
    alias = "oregon"
    region = "us-west-2"
}

各リソースでリージョンを指定する場合は下記のように指定する。

resource "aws_sns_topic" "hoge" {
  provider = "aws.oregon"
  name = "hoge"
}

terraform importする際はproviderを指定する。

$ terraform import -provider=aws.oregon aws_sns_topic.hoge arn:aws:sns:us-west-2:xxxxxxxxxxxxx:hoge

module

terraform get コマンドを打って、moduleを設定する必要がある。

$ terraform get
Get: file:///vagrant/src/hoge/infrastructure/terraform/modules/vpc
Get: file:///vagrant/src/hoge/infrastructure/terraform/modules/subnet
Get: file:///vagrant/src/hoge/infrastructure/terraform/modules/gateway
Get: file:///vagrant/src/hoge/infrastructure/terraform/modules/route

1 moduleを作成する。

resource "aws_subnet" "public" {
  vpc_id                  = "${var.vpc_id}"
  cidr_block              = "${var.cidr_block}"
  availability_zone       = "${var.availability_zone}"
  tags                    = "${var.tags}"
  lifecycle { create_before_destroy = true }  
}

2 同じファイル、もしくは同じディレクトリにoutputを記載

output "subnet_ids" { value = "${join(",", aws_subnet.public.*.id)}" }

3 同じファイル、もしくは同じディレクトリにvariableを記載


variable "vpc_id" {
  type = "string"
}

4 利用する側はsourceでインポート

module "public_sn_for_admin" {
  source                  = "./modules/subnet"
  vpc_id                  = "${module.vpc.vpc_id}"
  cidr_block              = "${lookup(var.subnets_cidr_range,"public_sn_for_admin")}"
  availability_zone       = "${lookup(var.availability_zones,"az_1a")}"
  tags                    = "${merge(var.public_sn_admin_tags, var.common_tags)}"
}

debug

環境変数で設定する。

export TF_LOG=DEBUG
export TF_LOG_PATH='./terraform.log'

Validate