通过使用Terraform进行AWS环境的建设介绍
首先
你好!
我是CYBIRD Advent Calendar 2022的第8天负责人,我是“もっふんにゃ”。
第7天是@tomoko_ishizaka的“用故事来理解AWS的IAM及账户基础知识”的内容。
请务必一并查看!
今年四月,我以工程师身份作为新毕业生入职。
在经历培训之后,我现在正在基础设施团队接受实地训练,然而在其中我意外地遇到了具有革命性概念和工具的情况。
这就是“基础设施即代码”这一概念以及代表其体现的工具“Terraform”。
这次,我想要向大家介绍一下让我震撼的“Terraform”,从安装到基础设施的建立、修改、销毁、变量定义以及输出值的设定!
Terraform是什么?
Terraform是HashiCorp提供的Infrastructure as Code(IaC)工具。使用IaC工具可以通过配置文件而不是图形化的用户界面,进行基础架构的搭建、变更和管理。
作为一个长时间在控制台上敲击键盘的人,使用设置文件(源代码)只需轻松点击一下,就能革命性地方便地构建基础设施的工具。当我遇到它时,感到非常惊叹。
管理所有的基础设施
Terraform可以在超过1000个提供商中,例如AWS,Azure,GCP,Kubernetes,Helm,GitHub,Splunk,DataDog等中管理资源。
这次我们将使用AWS进行基础架构的构建!
安装Terraform
要使用Terraform,需要先安装它。
您可以在此处找到适合您系统的包并下载ZIP文件,或通过命令行获取二进制文件以安装Terraform。
由於這次我們是在Mac上進行,所以我們將使用Homebrew在終端中通過命令行進行安裝。
Homebrew 是一款免费且开源的 macOSX 包管理系统。
请从这里安装 Homebrew。
首先,安装HashiCorp tap。
$ brew tap hashicorp/tap
接下来,我们将使用hashicorp/tap/terraform安装Terraform。
$ brew install hashicorp/tap/terraform
要将Terraform更新到最新版本,请更新Homebrew。
$ brew update
运行升级命令,下载最新的Terraform版本。
$ brew upgrade hashicorp/tap/terraform
确认安装
打开一个新的终端窗口,确保安装成功。
$ terraform -version
Terraform v1.3.5
on darwin_amd64
如果版本能够显示如上所述,那么安装就没有问题!可以使用terraform -help命令列出Terraform可用的子命令。
$ terraform -help
Usage: terraform [global options] <subcommand> [args]
The available commands for execution are listed below.
The primary workflow commands are given first, followed by
less common or more advanced commands.
Main commands:
init Prepare your working directory for other commands
validate Check whether the configuration is valid
plan Show changes required by the current configuration
apply Create or update infrastructure
destroy Destroy previously-created infrastructure
##...省略
建设基础设施
在完成Terraform的安装后,现在终于开始构建!
这次我们将启动Amazon Web Services (AWS)的EC2实例并开始构建基础设施。
* EC2实例是在AWS上运行的虚拟机。
* 我们将在免费使用范围内进行构建。
要在AWS上使用Terraform构建基础设施,需要满足以下两个条件:
· 安装AWS CLI
· 拥有AWS账户的访问密钥
安装 AWS 命令行界面。
首先,我们需要安装AWS CLI。
这次我们将从MacOS的终端进行安装。
使用curl命令来下载文件。
$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
请指定下载的文件,然后执行MacOS的安装程序。
$ sudo installer -pkg AWSCLIV2.pkg -target /
由于安装已完成,我们将进行确认。
$ which aws
/usr/local/bin/aws
$ aws --version
aws-cli/2.7.24 Python/3.8.8 Darwin/18.7.0 botocore/2.4.5
如果按上述的方式进行,AWS CLI可以正确安装。
将访问密钥设置为环境变量。

$ export AWS_ACCESS_KEY_ID= <アクセスキー入力>
$ export AWS_SECRET_ACCESS_KEY= <シークレットアクセスキー入力>
写配置
将用于描述基础设施的文件集合称为「Terraform配置文件」。
由于Terraform文件集必须放置在其自己的目录中,所以需要创建一个目录。
$ mkdir learn-terraform-aws-instance
切换到目录。
$ cd learn-terraform-aws-instance
创建定义基础设施的文件。
$ touch main.tf
在文本编辑器中打开main.tf文件,并将以下配置粘贴到文件中,然后保存。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = "us-west-2"
}
#----------------------------------------
# EC2インスタンスの作成
#----------------------------------------
resource "aws_instance" "app_server" {
ami = "ami-830c94e3"
instance_type = "t2.micro"
tags = {
Name = "ExampleAppServerInstance"
}
}
初始化目录
使用创建的配置,构建EC2实例。
从互联网上获取Terraform执行所需的插件并初始化目录。
$ terraform init
如果显示以下内容,则表示执行成功。
Terraform has been successfully initialized!
设置的格式和验证
执行terraform fmt命令可以自动对代码进行缩进格式化。
$ terraform fmt
此外,当执行terraform validate命令时,如果出现问题,它会显示文件名和行数。
如果没有问题,则显示如下。
$ terraform validate
Success! The configuration is valid.
建立基础设施
使用terraform apply命令应用配置。
※ 需要等待Terraform可使用EC2实例,执行可能需要几分钟。
$ terraform apply
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:
aws_instance.app_server will be created
+ resource "aws_instance" "app_server" {
+ ami = "ami-830c94e3"
+ arn = (known after apply)
##....省略
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:
如果构建内容没有问题,则在”输入一个值:”处输入”是”。
Enter a value: yes
aws_instance.app_server: Creating...
aws_instance.app_server: Still creating... [10s elapsed]
aws_instance.app_server: Still creating... [20s elapsed]
aws_instance.app_server: Still creating... [30s elapsed]
aws_instance.app_server: Still creating... [40s elapsed]
aws_instance.app_server: Still creating... [50s elapsed]
aws_instance.app_server: Creation complete after 54s [id=i-*****************]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

当我在AWS控制台上确认时,发现它被成功构建了!
确认状态
您可以使用terraform show命令来查看当前基础设施的状态。
$ terraform show
# aws_instance.app_server:
resource "aws_instance" "app_server" {
ami = "ami-830c94e3"
arn = "arn:aws:ec2:us-west-2:************:instance/i-*****************"
associate_public_ip_address = true
availability_zone = "us-west-2c"
cpu_core_count = 1
cpu_threads_per_core = 1
disable_api_stop = false
disable_api_termination = false
ebs_optimized = false
get_password_data = false
hibernation = false
id = "i-*****************"
instance_initiated_shutdown_behavior = "stop"
instance_state = "running"
instance_type = "t2.micro"
ipv6_address_count = 0
##....省略
修改基础设施
对已构建的资源进行修改。
在这里我们将改变实例的AMI。
详细来说,在通过AWS启动实例后,无法更改AMI,所以我们需要销毁先前启动的实例并重新启动新的实例!(这些都将由Terraform自动完成!)
在main.tf的resource块中,将当前的AMI ID替换为其他值。
resource "aws_instance" "app_server" {
- ami = "ami-830c94e3" #削除
+ ami = "ami-08d70e59c07c61a3a" #追加
instance_type = "t2.micro"
}
在这次变更中,AMI将从Ubuntu 12.04更改为Ubuntu 16.04。
应用修改
如果更改了设置,请重新执行terraform apply,以确认更改内容。
$ terraform apply
如果没有问题,请回答”Enter a value:”并输入”yes”。
Enter a value: yes
根据执行计划,Terraform已经销毁了之前创建的现有实例并启动了新实例。
这样就使变更生效了。
摧毁基础设施
当不再需要基础设施时,为了降低安全风险并减少成本,有一项需要废弃的事项。
除了构建和修改基础设施之外,Terraform还可以销毁和重新创建受管理的基础设施。
放弃
请放心,Terraform destroy命令将终止Terraform管理的资源。不会破坏与本次创建的Terraform项目管理无关的资源。
销毁创建的资源。
$ terraform destroy
如果没有问题,请在“输入一个值:”后面回答“是”。
Enter a value: yes
Terraform将按适当的顺序销毁考虑依赖关系的多个资源,从而销毁了本次创建的资源!
定义输入变量
在这个配置中,我们使用了硬编码的值。
在Terraform的配置中,可以包含变量,这样可以使其更加灵活。
用变量设置实例名称
在learn-terraform-aws-instance文件夹中新建一个名为variables.tf的文件,用于定义实例名称的变量。
$ touch variables.tf
创建一个用于定义新变量instance_name的代码块。
打开variables.tf文件,将以下配置粘贴并保存文件。
variable "instance_name" {
description = "Value of the Name tag for the EC2 instance"
type = string
default = "Tamagotoji"
}
除非另外声明instance_name的值,否则上述内容默认为Tamagotoji。
打开main.tf文件,根据以下更改来使用新变量,并保存文件。
resource "aws_instance" "app_server" {
ami = "ami-08d70e59c07c61a3a"
instance_type = "t2.micro"
tags = {
- Name = "ExampleAppServerInstance" #削除
+ Name = var.instance_name #追加
}
}
应用配置
应用配置。
$ terraform apply
如果没有问题,请回答”Yes”并输入一个值。
Enter a value: yes
使用-var选项传递变量并覆盖默认实例名称,以便再次应用设置。
$ terraform apply -var "instance_name=Moffunnya"
如果没有问题,请输入一个值:回答“是”。
Enter a value: yes
现在,您可以通过variables.tf文件中的变量来输入值了!
※即使在命令行中设置了变量,也不会保存在variables.tf或main.tf等配置文件中。
在命令行输出所需的信息。
您可以在命令行中配置,以输出关于所需的构建基础设施环境的信息。
设置用于输出的EC2实例
在learn-terraform-aws-instance目录中创建一个名为outputs.tf的文件。
$ touch output.tf
在outputs.tf中粘贴以下设置,并定义EC2实例的ID和IP地址的输出。
output "instance_id" {
description = "ID of the EC2 instance"
value = aws_instance.app_server.id
}
output "instance_public_ip" {
description = "Public IP address of the EC2 instance"
value = aws_instance.app_server.public_ip
}
确认和适应输出值
通过 terraform apply 命令来应用配置。
$ terraform apply
如果没有问题的话,请回答“Enter a value:”为“是”。
Enter a value: yes
当应用配置后,Terraform会将输出值显示在屏幕上。
您可以使用terraform output命令查询已配置为输出的值。
$ terraform output
instance_id = "i-*****************"
instance_public_ip = "**.**.**.**"
您可以使用命令行来确认您在output.tf中设置的输出值!
最后
辛苦了!这次我们介绍了有关”Terraform”的内容,包括安装、基础设施的构建、更改、销毁、变量定义和输出值设置。如果你之前一直在控制台上构建基础设施,想必你也和我一样感到非常激动吧!!!
我认为在进行类似环境配置的场景时很常见,如果你拥有一些Terraform的特定配置文件,可能在意想不到的地方会派上用场!请务必尝试各种不同的配置!
CYBIRD 2022年的第9天节目是由@ayany0_zzZ呈现的《使用AR.js在家中召唤恐龙》!请务必观看!!
请参考以下网站