【持续更新】这里简要总结了使用 Terraform 的人在实际工作中应该掌握的”最基本”语法

适用于突然需要在实务中使用的人的确认清单。

Terraform是一种“基础设施即代码(Infrastructure as Code)”工具,由HashiCorp开发,用于通过代码定义和管理云上或本地基础设施。为了帮助需要突然学习该工具的人,无论是因为项目还是工作变动,我们制作了一个简洁的列表,可以快速查看基本语法和要点。

本篇文章是為個人備忘之用,因此省略了詳細解釋。若能查閱官方文件以獲取更多詳情,將不勝感激。

基本语法

资源定义和属性指定采用键值对形式,支持循环和条件分支。与CloudFormation相比,它具有更丰富的表达能力,但并不复杂,因此对工程师来说学习成本相对较低。这里列举了基本语法。

供应商

在Terraform的提供者块中,可以进行特定云提供商或服务的配置。您还可以进行区域、AWS配置文件等设置。

provider "aws" {
  region  = "ap-northeast-1"
  version = "~> 3.0"
}

资源

Terraform的资源块是定义基础设施组件(例如:EC2实例或S3存储桶)的主要语法。每个资源块代表特定类型的资源,并包含所需的属性和配置。

resource "aws_vpc" "this" {
  cidr_block = var.cidr_block
  tags = {
    Name = var.vpc_name
  }
}

变量

Terraform的变量参数允许自定义基础设施配置。通过变量声明进行定义,并通过var.变量名进行引用。

variable "instance_type" {
  description = "EC2 instance type"
  default     = "t2.micro"
}

输出

Terraform的Outputs是一种用于显示作为Terraform配置执行结果所得到的数据的方法。它们通过output块进行定义,并在terraform apply后显示出来。通过这种方式,用户可以方便地查看资源属性和计算结果等信息。用户还可以在将这些输出与其他系统或工作流整合时使用它们。

output "instance_public_ip" {
  value = aws_instance.example.public_ip
}

数据来源

Terraform的数据源是用于引用和读取现有基础设施资源数据的方法。可以通过数据块定义并获取其他资源的信息和配置。使用此功能可以在Terraform配置中使用外部资源和未经管理的资源的信息。

data "aws_s3_bucket" "existing_bucket" {
  bucket = "my-existing-s3-bucket" # 参照したいS3バケットの名前を指定
}
output "bucket_arn" {
  value = data.aws_s3_bucket.existing_bucket.arn
}

模块

Terraform的模块是可重复使用的Terraform代码单元。使用module块进行调用,并通过变量进行自定义配置。模块可以具有自己的输入变量、输出和资源,是提高代码重用和组织性的强大工具。

.
├── main.tf
└── modules
    └── network
        ├── main.tf
        ├── outputs.tf
        └── variables.tf
# モジュール定義
resource "aws_vpc" "my_vpc" {
  cidr_block = var.cidr_block
  tags = {
    Name = "MyVPC"
  }
}

resource "aws_subnet" "my_subnet" {
  vpc_id     = aws_vpc.my_vpc.id
  cidr_block = var.subnet_cidr_block
  tags = {
    Name = "MySubnet"
  }
}
# モジュールで用いる変数(引数)
variable "cidr_block" {
  description = "CIDR for VPC"
  type        = string
}

variable "subnet_cidr_block" {
  description = "CIDR for Subnet"
  type        = string
}
# モジュールの出力を定義
output "vpc_id" {
  value = aws_vpc.my_vpc.id
}

output "subnet_id" {
  value = aws_subnet.my_subnet.id
}
# モジュールを呼び出す
module "network_module" {
  source            = "./modules/network"
  cidr_block        = "10.0.0.0/16"
  subnet_cidr_block = "10.0.1.0/24"
}

output "created_vpc_id" {
  value = module.network_module.vpc_id
}

output "created_subnet_id" {
  value = module.network_module.subnet_id
}

功能

Terraform中包含了很多方便的内置函数和控制结构。这些包括条件表达式、join函数和用于控制资源重复的for_each等。这些功能旨在提高代码的灵活性和可重用性。

# for_eachを使用して複数のサブネットを作成
resource "aws_subnet" "main" {
  for_each = {
    "a" = "10.0.1.0/24",
    "b" = "10.0.2.0/24"
  }

  vpc_id     = aws_vpc.main.id
  cidr_block = each.value
  tags = {
    Name = "Subnet-${each.key}"
  }
}
# 文字列操作
output "joined_string" {
  value = join("-", ["Hello", "Terraform"])
}
// 出力: "Hello-Terraform"
# 条件関数
output "conditioned_value" {
  value = conditional(true, "Hello", "Terraform")
}
// 出力: "Hello"
# リスト操作
output "example_list" {
  value = list("Hello", "Terraform")
}
// 出力: ["Hello", "Terraform"]

# 要素取得
output "second_element" {
  value = element(["Hello", "Terraform"], 1)
}
// 出力: ["Hello", "Terraform"]
# 日付生成
output "current_timestamp" {
  value = timestamp()
}
// 出力は現在の日時のISO 8601形式の文字列

本地环境设置方法

在Terraform的本地环境配置中,主要有两种方法。其一是在Docker容器中运行Terraform的方法。这种方法可以方便进行环境隔离和版本管理,初始设置也可以快速完成。另一种方法是直接在本地计算机上安装Terraform。这种方法简单直观,适用于不需要通过Docker来使用Terraform的场景。

在本地计算机上安装

# tfenvのインストール
brew install tfenv

# 利用可能なTerraformのバージョン一覧を表示
tfenv list-remote

# 特定のバージョンをインストール
tfenv install <desired_version>

# インストールリスト一覧
tfenv list

# 利用するバージョン指定
tfenv use <desired_version>

# 現在のバージョンを確認
terraform version

使用Docker

# 公式イメージを利用
docker run \                                                                             
  -v ~/.aws:/root/.aws \
  -v $(pwd):/terraform \
  -w /terraform \
  -it \
  --entrypoint=ash \
  hashicorp/terraform:1.5

通过使用S3进行远程后端的tfstate版本管理。

使用S3作为远程后端来保存和管理Terraform的tfstate。非常适合多个开发者之间的共享和版本控制。此外,还提供使用DynamoDB等提供锁机制,确保多个人同时修改tfstate的安全措施。因此,可以实现安全高效的基础设施管理。

# Terraformのstateファイルを保存するためのS3バケットを作成
aws s3api create-bucket --bucket your-tfstate-bucket-name --region ap-northeast-1 --create-bucket-configuration LocationConstraint=ap-northeast-1

# バケットバージョニングの有効化
aws s3api put-bucket-versioning --bucket your-tfstate-bucket-name --versioning-configuration Status=Enabled

# 同時実行を防ぐためのロックを提供するDynamoDBテーブルを作成
aws dynamodb create-table --table-name your-tfstate-lock-table --attribute-definitions AttributeName=LockID,AttributeType=S --key-schema AttributeName=LockID,KeyType=HASH --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 --region ap-northeast-1

# main.tf または backend.tf などの設定ファイルに以下を追加
terraform {
  backend "s3" {
    bucket         = "your-tfstate-bucket-name"
    key            = "path/to/your/key"
    region         = "ap-northeast-1"
    dynamodb_table = "your-tfstate-lock-table"
    encrypt        = true
  }
}

Terraform 命令

Terraform命令可以高效管理基础架构的生命周期。通过简单的命令,可以控制从初始化到资源预览、应用和销毁的步骤,大大减少手动错误和冗余。此外,还可以实现一致状态管理和变更审计,支持可靠的基础架构运营。

# 新しいTerraformプロジェクトを初期化するためのコマンド。
terraform init

# 変更の確認や、どのリソースが作成/変更/削除されるかをプレビューする。
terraform plan

# 実際に変更を適用するコマンド
terraform apply

# 設定したリソースを全て削除する。
terraform destroy

# 現在の`tfstate`を管理・調整するためのコマンド
terraform state
广告
将在 10 秒后关闭
bannerAds