想要理解[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上的构建方法进行全面讲解!