Terraformの準備
前回までは、開発環境を構築するためのDockerの準備、IAMの作成などを行った。
今回は、準備運動としてTerraformの操作を試してみる。
Terraformのコマンド
# Terraformの作業ディレクトリを初期化する。
# awsを操作するためのpluginなどをダウンロードして、planできる状態にする。
terraform init
# 実行したディレクトリ内の.tfファイルを適用した場合の差分を表示する。
terraform plan
# .tfファイルをもとにインフラを構築する。一度planした結果を表示し、
# yesを入力することで実際にインフラが構築される。
terraform apply
tfstate
terraform applyを完了すると、ディレクトリ内にterraform.tfstateというファイルが作成される。このファイルは、terafform applyをした結果、現在のインフラの状態が保存されている。
このtfstateは、ディレクトリをまたいだリソースの参照を行う際に必要となる。作成されたtfstateをremote_stateで指定することで別ディレクトリのリソースを参照できる。今回の内容では、S3に保存して進めていく。
remote_state
Terraformは同じディレクトリ内の.tfファイルであれば、apply時にすべてまとめて適用してくれる。ただ、通常はリソース毎にファイルをディレクトリで分割して管理していきたいことが多い。そう言った場合は、remote_stateを使用することで異なるディレクトリに分かれたリソースを参照することができる。
まずは、下記のディレクトリ構成で試してみる。
test
|--vpc
- vpc.tf
|--ec2
- ec2.tf
resource "aws_vpc" "vpc" {
cidr_block = "10.10.0.0/16"
instance_tenancy = "default"
}
resource "aws_subnet" "public_subnet" {
vpc_id = "${aws_vpc.vpc.id}"
cidr_block = "10.10.1.0/24"
availability_zone = "ap-northeast-1a"
}
provider "aws" {
region = "ap-northeast-1"
}
# outputのセクションの追記
# subnetのidをvalueにセットしている
output "public_subnet_id" {
value = "${aws_subnet.public_subnet.id}"
}
terraform {
backend "s3" {
bucket = "terraform-test-20200506"
key = "test/vpc/terraform.tfstate"
region = "ap-northeast-1"
}
}
★この時、terraform initを実施したところ、エラーが発生してしまった。
terraform s3 bucket does not exist
はまってしまったが、同じフォルダに.tfstate(だったかな?)が作成されており、それを削除することで解決できた。
resource "aws_instance" "sandbox" {
ami = "ami-785c491f"
instance_type = "t2.micro"
# remote_state���w��
subnet_id = data.terraform_remote_state.vpc.outputs.public_subnet_id
}
provider "aws" {
region = "ap-northeast-1"
}
# remote_state を設定する。vpcという名前で参照できるようにする。
data "terraform_remote_state" "vpc" {
backend = "s3"
config = {
bucket = "terraform-test-20200506"
key = "test/vpc/terraform.tfstate"
region = "ap-northeast-1"
}
}
terraform {
backend "s3" {
bucket = "terraform-test-20200506"
key = "test/ec2/terraform.tfstate"
region = "ap-northeast-1"
}
}
作業が終わったら、特に必要なければ今回作成したものは
terraform destroy
で削除しておく。