Terraformって何?
Hashicorp社が開発しているオープンソースのインフラの自動構築ツール。
インフラのリソースをコードとして定義することができ、コードに従ってリソースを構築してくれる。
インフラリソースをコードで定義することを**Infrastructure as Code(IaC)**という。
Terraform以外にもIaCツールとして以下のようなものがある。
ツール名 | 管理対象 | 対応 | コード定義 |
---|---|---|---|
AWS Cloud Formation | マネージドサービス全般の構成 | AWS | YAML |
Azure Resource Manager | マネージドサービス全般の構成 | Azure | JSON |
Deployment Manager | マネージドサービス全般の構成 | GCP | YAML等 |
Serverless Framework | サーバレスサービス全般の構成 | AWS Azure GCP Alibaba Cloud |
YAML |
Terraformの実行順序
npmやbundlerに近い。
- Terraformファイルを書く
- terraform initで初期化する
- 実行結果を確認してファイルを修正
- 実際に実行してインフラを構築
- 変更したい場合は、ファイルを編集して再度実行
管理ファイル
tfという拡張子のファイルで管理する。
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "3.5.0"
}
}
}
provider "google" {
credentials = file("<NAME>.json")
project = "<PROJECT_ID>"
region = "us-central1"
zone = "us-central1-c"
}
resource "google_compute_network" "vpc_network" {
name = "terraform-network"
}
terraform
terraformブロックには、terraform自体の設定を記述する。依存するライブラリのバージョンや、メタ情報を管理するstateファイルの置き場所を指定する。
provider
リージョンや認証情報など、AWSやGCPなどのサービスと通信するための設定を記述する。
resource
実際に構築するインフラの設定を記述する。
resource "リソース名" "変数名"
の形で指定でき、変数を使用してresourceの中身を参照できる。
GCPをTerraformでリソース管理してみる
1. インストール
公式サイトから、TerraformのCLIをインストールする。
ここからバイナリをダウンロードして解凍。
インストールを確認。
$ terraform --version
Terraform v1.0.11
2. やること
VPCを利用してGCPにプライベートなネットワークを立ち上げ、ネットワーク内にインスタンスを立ち上げる。
3. リソースの作成
GCPに関するDocumentを見ながら、tfファイルを作成していく。
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "3.5.0"
}
}
}
provider "google" {
credentials = file(var.credentials_file)
project = var.project
region = var.region
zone = var.zone
}
resource "google_compute_network" "vpc_network" {
name = "terraform-network"
}
resource "google_compute_instance" "vm_instance" {
name = "terraform-instance"
machine_type = "f1-micro"
boot_disk {
initialize_params {
image = "debian-cloud/debian-9"
}
}
network_interface {
network = google_compute_network.vpc_network.name
access_config {
}
}
}
variable "project" {
default = "<your project name>"
}
variable "credentials_file" {
default = "<your path to service account json file>"
}
variable "region" {
default = "us-central1"
}
variable "zone" {
default = "us-central1-c"
}
初期化
下記コマンドを実行する。
$ terraform init
ファイルと同じディレクトリに下記ディレクトリ / ファイルが作成される。
.terraform
.terraform.lock.hcl
確認
下記コマンドを実行する。
$ terraform plan
ファイルの文法やアカウントの権限にミスがあると、ここでチェックしてくれる。
エラーの場合
$ terraform plan
╷
│ Error: Unsupported attribute
│
│ on main.tf line 13, in provider "google":
│ 13: project = "${lookup(var.project_name.tf_sample, "${terraform.workspace}")}"
│ ├────────────────
│ │ var.project_name is object with 1 attribute "tf-sample"
│
│ This object does not have an attribute named "tf_sample".
╵
╷
│ Error: error archiving directory: could not archive missing directory: ./../src
│
│ with data.archive_file.function_zip,
│ on main.tf line 42, in data "archive_file" "function_zip":
│ 42: data "archive_file" "function_zip" {
│
╵
成功した場合
$ terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# google_compute_instance.vm_instance will be created
+ resource "google_compute_instance" "vm_instance" {
+ can_ip_forward = false
+ cpu_platform = (known after apply)
+ deletion_protection = false
+ guest_accelerator = (known after apply)
+ id = (known after apply)
+ instance_id = (known after apply)
+ label_fingerprint = (known after apply)
+ machine_type = "f1-micro"
+ metadata_fingerprint = (known after apply)
+ min_cpu_platform = (known after apply)
+ name = "terraform-instance"
+ project = (known after apply)
+ self_link = (known after apply)
+ tags_fingerprint = (known after apply)
+ zone = (known after apply)
+ boot_disk {
+ auto_delete = true
+ device_name = (known after apply)
+ disk_encryption_key_sha256 = (known after apply)
+ kms_key_self_link = (known after apply)
+ mode = "READ_WRITE"
+ source = (known after apply)
+ initialize_params {
+ image = "debian-cloud/debian-9"
+ labels = (known after apply)
+ size = (known after apply)
+ type = (known after apply)
}
}
+ network_interface {
+ name = (known after apply)
+ network = "terraform-network"
+ network_ip = (known after apply)
+ subnetwork = (known after apply)
+ subnetwork_project = (known after apply)
+ access_config {
+ nat_ip = (known after apply)
+ network_tier = (known after apply)
}
}
+ scheduling {
+ automatic_restart = (known after apply)
+ on_host_maintenance = (known after apply)
+ preemptible = (known after apply)
+ node_affinities {
+ key = (known after apply)
+ operator = (known after apply)
+ values = (known after apply)
}
}
}
# google_compute_network.vpc_network will be created
+ resource "google_compute_network" "vpc_network" {
+ auto_create_subnetworks = true
+ delete_default_routes_on_create = false
+ gateway_ipv4 = (known after apply)
+ id = (known after apply)
+ ipv4_range = (known after apply)
+ name = "terraform-network"
+ project = (known after apply)
+ routing_mode = (known after apply)
+ self_link = (known after apply)
}
Plan: 2 to add, 0 to change, 0 to destroy.
実行
下記コマンドを実行する。
$ terraform apply
変更したい場合は、ファイルを変更 -> apply でリソースの変更が可能。
削除
下記コマンドを実行する。
$ terraform destroy
作成したリソースが削除される。
##注意点
あくまで管理できるのはインフラの構成のみ。
サービスアカウントの設定やAPIの有効化などは管理できない。