想要理解[Terraform]的人非常必看!
Terraform是什么?
HashiCorp开发了一款用于通过使用代码(模板文件)自动化基础架构建设和配置的工具。
使用名为HCL(HashiCorp Configuration Language)的语言将基础架构配置描述在扩展名为.tf的文件中,通过Terraform命令执行该文件,将按照该配置创建基础架构。
此外,除了AWS,它还支持Azure、Docker、Google Cloud等各种提供商(※1)。
优点
-
- 公式ドキュメントがわかりやすい。
少量の記述量で宣言が可能
Workspaceという機能を利用することで環境を切り替えられ、一度書いたことのあるリソースを再利用して使い回すことが可能
ググラビリティ(※2)が高い
Terraformを利用している企業が非常に多いという理由で、ググラビリティが非常に高い
学習コストの低さ
ポータビリティー(※3)に優れている
管理が簡素化できる
転職に有利
現在、システム開発やシステム保守に関して、AWSやAzureを採用している企業は多いため、Terraformの知識がある人材は重宝される。
AWSやAzureなどを採用する企業が増える可能性が高い。
缺点 (quē
-
- 常に管理更新が必要
-
- Terraformのインフラ保守や管理に継続的に投資が必要
再利用がしづらい
必要な属性すべてに対して同じコマンドを繰り返すことになり、手間になってしまう
经常使用的命令
Terraform常用的主要命令是Init、Plan和Apply。我将把其他经常使用的命令总结如下。
开始
初始化工作空间的命令。
为了执行Terraform,需要初始化工作空间来准备所需的环境。通过执行Init命令来初始化工作空间。
$ terraform init
计划
这是一个用于参考计划的命令。
$ terraform plan
申请
这是用于创建资源的命令。
使用Apply命令来读取.tf文件的信息并创建资源。
$ terraform apply
展示
这是一个用来检查资源情况的命令。
Show虽然不是经常使用的命令,但它是创建资源所必需的命令。
$ terraform show
摧毁
这是用于删除生成的资源的命令。
销毁虽不是常用命令,但在删除资源时需要使用。
$ terraform destroy
记述的要点
听说描述时要意识到3个步骤会更好。
步骤1:将所需资源转化为Terraform形式。
当需要列出所有必要资源时,描述量会相当大。在这种情况下,可以复制现有文件并更改各个资源的名称,以节省大量时间和精力。
第二步骤:使用workspace功能。
Terraform拥有一个名为workspace的功能,可以用同一份代码在不同环境中切换数值等。
第三步:将main.tf的公共部分模块化。
对于AWS,Terraform的main.tf资源中预先定义了变量选项。因此,我们将AWS资源的公共部分模块化。通过这样做,声明AWS资源的部分将成为可在其他main.tf中重复使用的代码。
使用Terraform的方法
请使用以下命令进行安装。
$ brew cask install terraform
# インストールされているか、バージョンを確認する
$ terraform version
创建模板文件。
※扩展名为“*.tf”。(Terraform会自动将此扩展名的文件识别为模板)。
$ mkdir terraform-test
$ cd terraform-test
$ touch main.tf
3.在之前创建的文件中进行提供者设置。
※如果使用AWS,可以在provider块中指定aws,并在该块中填写AWS的凭证信息(access_key,secret_key)和区域(region)的设置。
provider "aws" {
access_key = "ACCESS_KEY_HERE"
secret_key = "SECRET_KEY_HERE"
region = "ap-northeast-1"
}
使用环境变量提取凭据信息。
* 设置 “AWS_ACCESS_KEY_ID” 和 “AWS_SECRET_ACCESS_KEY”。执行terraform命令时,凭据信息和区域将自动加载,因此不需要设置access_key和secret_key。
provider "aws" {
region = "ap-northeast-1"
}
在Terraform中设置资源。
如果提供程序是AWS,资源类型会以aws_*的名称在Terraform中预定义。
资源名称可以任意设置,最好使用容易理解其用途的名称。
在每个AWS资源的块中,以设置项名称 = 设置值的格式来设置各个AWS资源的配置值。
※关于每个AWS资源需要设置的项目,请参考各个资源的官方参考资料。
# VPCの設定
resource "aws_vpc" "myVPC" {
cidr_block = "10.1.0.0/16"
instance_tenancy = "default"
enable_dns_support = "true"
enable_dns_hostnames = "false"
tags {
Name = "myVPC"
}
}
6. 设定网络网关。
resource "aws_internet_gateway" "myGW" {
vpc_id = "${aws_vpc.myVPC.id}"
depends_on = "${aws_vpc.myVPC}" # myVPCに依存することを明示。
}
7. 默认值不是单个值,而是指定为Map。
variable "images" {
default = {
us-east-1 = "ami-1ecae776"
us-west-2 = "ami-e7527ed7"
us-west-1 = "ami-d114f295"
eu-west-1 = "ami-a10897d6"
eu-central-1 = "ami-a8221fb5"
ap-southeast-1 = "ami-68d8e93a"
ap-southeast-2 = "ami-fd9cecc7"
ap-northeast-1 = "ami-cbf90ecb"
sa-east-1 = "ami-b52890a8"
}
}
在进行terraform命令执行时,若写入了output,则会在控制台上输出指定的属性值。
output "<アウトプットする属性の説明>" {
value = "<アウトプットする属性値>"
}
output "public ip of cm-test" {
value = "${aws_instance.cm-test.public_ip}"
}
使用以下命令在AWS上进行环境搭建。
$ terraform plan
使用以下命令,应用模板在AWS上创建资源。
$ terraform apply
11. 完成的状态。
variable "images" {
default = {
us-east-1 = "ami-1ecae776"
us-west-2 = "ami-e7527ed7"
us-west-1 = "ami-d114f295"
eu-west-1 = "ami-a10897d6"
eu-central-1 = "ami-a8221fb5"
ap-southeast-1 = "ami-68d8e93a"
ap-southeast-2 = "ami-fd9cecc7"
ap-northeast-1 = "ami-cbf90ecb"
sa-east-1 = "ami-b52890a8"
}
}
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_vpc" "myVPC" {
cidr_block = "10.1.0.0/16"
instance_tenancy = "default"
enable_dns_support = "true"
enable_dns_hostnames = "false"
tags {
Name = "myVPC"
}
}
resource "aws_internet_gateway" "myGW" {
vpc_id = "${aws_vpc.myVPC.id}"
}
resource "aws_subnet" "public-a" {
vpc_id = "${aws_vpc.myVPC.id}"
cidr_block = "10.1.1.0/24"
availability_zone = "ap-northeast-1a"
}
resource "aws_route_table" "public-route" {
vpc_id = "${aws_vpc.myVPC.id}"
route {
cidr_block = "0.0.0.0/0"
gateway_id = "${aws_internet_gateway.myGW.id}"
}
}
resource "aws_route_table_association" "puclic-a" {
subnet_id = "${aws_subnet.public-a.id}"
route_table_id = "${aws_route_table.public-route.id}"
}
resource "aws_security_group" "admin" {
name = "admin"
description = "Allow SSH inbound traffic"
vpc_id = "${aws_vpc.myVPC.id}"
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_instance" "cm-test" {
ami = "${var.images.ap-northeast-1}"
instance_type = "t2.micro"
key_name = "cm-yawata.yutaka"
vpc_security_group_ids = [
"${aws_security_group.admin.id}"
]
subnet_id = "${aws_subnet.public-a.id}"
associate_public_ip_address = "true"
root_block_device = {
volume_type = "gp2"
volume_size = "20"
}
ebs_block_device = {
device_name = "/dev/sdf"
volume_type = "gp2"
volume_size = "100"
}
tags {
Name = "cm-test"
}
}
output "public ip of cm-test" {
value = "${aws_instance.cm-test.public_ip}"
}
不理解的单词列表
※1 互联网服务提供商
指负责连接互联网和用户线路的连接服务提供商。
※2 搜索可见度
指Google搜索结果中相关的数量。
※3 可移植性
软件等能够在不同系统间迁移的特性。
提供参考
用10分钟理解Terraform
在AWS上学习使用Terraform
Terraform入門:自动化基础设施配置管理
Terraform入门指南,专为非技术人员设计。
Terraform初学者在投入实战之前所做的事项
Terraform是什么?介绍Terraform的基本知识和四个优点。
Terraform是什么?详细解释Terraform的使用方法和优点!从安装步骤到在AWS上的构建方法进行全面讲解!