terraform - taka512/memo GitHub Wiki
terraformとはGCP,AWSなどのクラウドサービスの構成管理ツール
マニュアル
コマンド
初期化
terraform init
構文チェック
terraform validate
インデント調整
terraform fmt
計画実行(dry-run)
terraform plan
適用
terraform apply
現在の状態表示
terraform show
リソースの廃棄(削除)
terraform destroy
状態管理用ファイル
- 何もしないとローカルに適用状態を管理するファイルが出力される
- terraform.tfstate
- S3に置くように設定する事は可能
terraform {
backend "s3" {
・・・
}
}
記法
output
- https://www.terraform.io/language/values/outputs
- outputとは
- https://qiita.com/kyntk/items/2cdd38c2438ac257ac4e
- 子モジュールの属性を親モジュールに公開できる
- terraform applyを実行後に出力される
- terraform_remote_stateを使うことで他の構成からアクセスできる
グローバル変数
- https://troylindsayblog.wordpress.com/2018/04/12/one-way-to-implement-global-variables-in-terraform/
- outputを利用してグローバル設定的な事を定義可能
outputを定義
// config/hoge.tf
output "cidr_hoge" {
value = "10.10.0.0/16"
}
variables.tf に定義すると
// variables.tf
module "global_var" {
source = "../config"
}
下記のようにアクセスできるようになる
module.global_var.cidr_hoge
locals
- マニュアル: https://www.terraform.io/language/values/locals
- 特徴: https://qiita.com/hajimeni/items/4afcac38e4f275edb852
- スコープがモジュール内に閉じた変数
- 他のLocal Valueを参照してあたらしいLocal Valueを定義できる。
- 関数や式展開を利用できる。
- 外部から値を設定・上書きできない。
locals {
pub_left = cidrsubnet(module.global_var.cidr_xxx, 8, 1)
pub_right = cidrsubnet(module.global_var.cidr_xxx, 8, 2)
以下のようにアクセスできる
local.pub_right
variable
- マニュアル: https://www.terraform.io/language/values/variables
- 特徴
- Input Variableは実行時にファイル・環境変数・オプション・対話的入力など、様々な注入方法を利用して- 外部から値を設定・上書きできる。
- 課題
- 他のVariableを参照して新しいVariableを定義できない。
- 関数を利用できない。
「.tfvars」などで外部から値を指定
$ terraform apply \
-var-file="secret.tfvars" \
-var-file="production.tfvars"
リスト
variable "cidrs" {
description = "cider"
type = list(string)
default = []
}
cidrs = [ "10.0.0.0/16", "10.1.0.0/16" ]
マップ
variable "amis" {
type = map(string)
default = {
"us-east-1" = "ami-b374d5a5"
"us-west-2" = "ami-4b32be2b"
}
}
resource "aws_instance" "example" {
ami = "${lookup(var.amis, var.region)}"
instance_type = "t2.micro"
}
for_each
- https://www.terraform.io/language/meta-arguments/for_each
- 繰り返し定義の記述を簡略化できる
resource "aws_iam_user" "the-accounts" {
for_each = toset( ["Todd", "James", "Alice", "Dottie"] )
name = each.key
}
module "bucket" {
for_each = toset(["assets", "media"])
source = "./publish_bucket"
name = "${each.key}_bucket"
}
tomap
tomap({"a" = 1, "b" = 2})
merge
merge({a="b"}, {a=[1,2], c="z"}, {d=3})
data
外部リソースを定義
data "aws_ami" "web" {
・・・
}
以下のようにで「ata.aws_ami.xxx」でアクセスできるようになる
resource "aws_instance" "web" {
ami = data.aws_ami.web.id
instance_type = "t1.micro"
}
cidrsubnet
> cidrsubnet("172.31.0.0/16", 8, 0)
"172.31.0.0/24"
> cidrsubnet("172.31.0.0/16", 8, 1)
"172.31.1.0/24"
明示的依存
resource "aws_instance" "example" {
ami = "ami-2757f631"
instance_type = "t2.micro"
# Tells Terraform that this EC2 instance must be created only after the
# S3 bucket has been created.
depends_on = ["aws_s3_bucket.example"]
}
link
- Terraform を使用するためのベスト プラクティス
- Terraform Course - Automate your AWS cloud infrastructure
- 公式ドキュメント
- 完全初心者向けTerraform入門(AWS)
- 複数AWSアカウントのインフラを同じコードで Terraform管理するプラクティス
- Terraformのレビューを自動化するために、Conftestを導入してGithub ActionsでCIまで設定してみる
- Terraform-Provider
- tfcmt で Terraform の CI/CD を改善する
- tfcmt は terraform plan, apply の結果を GitHub の Pull Request (以下 PR) にコメントとして通知する CLI ツール
- terraform cloud MedPeer SREチームによるAWSアカウント運用効率化
- Retty の Terraform CI/CD 解体新書