【快速入门Terraform】尝试用代码管理AWS环境
前言
我是在东南亚创业工作室GAOGAO担任工程师的Mass-min。最近,在GAOGAO上支持合作的Ancar株式会社的圣诞节日历活动中,我写了一篇文章!如果您还没有阅读,请务必阅读!
在敏捷开发中,团队决不能加班的理由是【请停止加班】。
因此,我打算在今天与Ancar先生成立的服务开发过程中获得的技术见解进行输出。
你们正在建设基础设施吗?
各位,你们如何进行基础设施建设呢?
除非是非常庞大规模的产品或对响应要求极高的产品,否则从简便性方面考虑,云端比本地更具优势,我认为这是不言而喻的。
使用AWS、GCP、Azure等服务的公司,占据了现如今世界的大部分市场份额,这话并不夸张。
在这个现代社会中,我觉得能够在云服务控制台上按下按钮来构建环境,然后用文件或其他适当的方式来管理和维护这个环境的团队却意外地很少。
如果能将其记录在文件中,那么在需要再次创建相似环境时,速度将会有很大的差距。特别是对于初创公司来说,在假设验证阶段频繁地构建和破坏环境是很显著的。
而且,如果能将修改的部分准确地反映在文件中,就不需要在控制台界面中去查看设置项了。
因此,会出现一种希望以某种形式来完整地管理环境的需求。
在这里登场的就是Terraform。Terraform使用自己独特的语言来编码和管理云环境,并且可以通过一条命令来设置和删除环境。
Terraform是由HashiCorp公司运营的服务,不是由AWS提供的。不仅限于AWS,Terraform还能够管理GCP、Azure等环境。也就是说,一旦掌握了Terraform的编写方式,就能够在几乎任何环境中进行代码化管理。很棒吧!
所以这次我们来介绍一下Terraform的入门。将EC2实例的配置进行编码,然后进行环境设置。
菜单
-
- 前提
-
- Terraformのインストール
-
- EC2インスタンスの設定
初級編 – TerraformでEC2インスタンスを作成してみる
中級編 – コードの内容を追ってみる
実践編 – Nginxをインストールしてトップページを表示
前提 tí) – precondition
-
- OS: macOS 10.15.1
-
- AWS CLIはインストール済み(credentials設定済み)
まだ入ってない人は以下の手順でインストールしてください
macOS に AWS CLI をインストールする
安装Terraform
在Mac上,你可以使用Homebrew来安装Terraform。
$ brew update
$ brew install terraform
截至2019年12月03日,已经更新至Ver0.12.16版本。
$ terraform -v
Terraform v0.12.16
EC2实例的配置
初级编辑
好的,接下来我们来创建大家期待已久的EC2实例。
首先,让我们创建一个目录来存放Terraform的代码。
$ mkdir terraform
$ cd terraform/
创建和初始化写Terraform代码的文件。
我们将Terraform的代码写在以.tf为扩展名的文件中。由于我们要描述有关EC2实例的内容,所以让我们将文件名命名为ec2.tf。
provider "aws" {
profile = "default"
region = "ap-northeast-1"
}
resource "aws_instance" "terraform-web" {
ami = "ami-0ab3e16f9c414dee7"
instance_type = "t2.micro"
tags = {
Name = "ec2-terraform"
}
}
暂时就这些。在这种状态下,我们将进行terraform项目的初始设置。
$ terraform init
Terraform初始化成功!如果出现任何错误,请检查之前所提到的AWS CLI凭证设置是否完成。请查看AWS CLI配置并进行密钥设置。
查看并确认制定的计划,然后实际执行代码。
好的,接下来让我们来看一下即将创建的 EC2 实例的创建计划。
$ terraform plan
我觉得你突然就像”哇”地出现了。总之,让我们继续下一步,实际上创建实例的过程吧。
$ terraform apply

哇!实例已经成功创建了!就像这样,我们可以通过编写代码设置来启动EC2实例!
中级编辑
我们能够创建好了,但是我对我们正在做的事情不太了解。让我们深入一点吧。
顺便提一下,这里是Terraform的AWS相关官方文档。查询官方文档是最快的方式。
命令
首先,关于Terraform的命令。现在提到的三个类型分别如下。
因此,當編寫代碼時,需要確認計劃中的環境變化,並在確認無問題後執行應用。
请将以下内容翻译成中文:
コード
接下来,让我们来看一下ec2.tf文件。我在每一行下面都写了注释。
provider "aws" { # AWS以外にも、GCPやAzure、Herokuなどがここに入る
profile = "default" # キーを指定せず、AWS CLIに設定したdefaultのcredentials情報を用いる
region = "ap-northeast-1" # Terraformのコードで環境を作成する対象のリージョン
}
resource "aws_instance" "terraform-web" { # EC2インスタンスに関する記述。コード内ではterraform-webという名前でアクセスできる
ami = "ami-0ab3e16f9c414dee7" # どのAMIをベースにインスタンスを作成するか、ID指定
instance_type = "t2.micro" # インスタンスタイプ指定
tags = {
Name = "ec2-terraform" # タグに Name: ec2-terraform をセット
}
}
你已经明白了吧。
在provider中指定要使用的服务,并设置认证信息和区域。
然后,将想要构建的每个内容写在resource中,就像这样。
现在只设置了EC2,但RDS、S3和VPC也可以以相同的方式写入。随着继续写下去,你会逐渐理解,但能够进行代码管理真的非常轻松!
实践篇
祝大家圣诞快乐!不过,仅仅启动一个EC2实例还不够有趣。最后,我们将安装Nginx并显示首页来结束。
安全组设置
要通过浏览器访问并显示Nginx的首页,需要接收对80端口的访问。另外,为了安装Nginx,还需要通过ssh连接访问实例。所以还需要打开22端口。让我们来进行这些设置吧。
provider "aws" {
profile = "default"
region = "ap-northeast-1"
}
# セキュリティグループ
resource "aws_security_group" "terraform-web-sg" {
egress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = [
"0.0.0.0/0"
]
}
tags = {
Name = "sg-terraform"
}
}
# インバウンドのルール
resource "aws_security_group_rule" "inbound_http" {
security_group_id = aws_security_group.terraform-web-sg.id
type = "ingress"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = [
"0.0.0.0/0"
]
}
resource "aws_security_group_rule" "inbound_ssh" {
security_group_id = aws_security_group.terraform-web-sg.id
type = "ingress"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = [
"0.0.0.0/0"
]
}
# EC2
resource "aws_instance" "terraform-web" {
ami = "ami-0ab3e16f9c414dee7"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.terraform-web-sg.id] # <= 追加
tags = {
Name = "ec2-terraform"
}
}
首先,安全组的 egress 规则是出站规则,ingress 规则是入站规则的描述。如果想要在安全组中添加多个规则,可以使用 aws_security_group_rule 进行描述。在 EC2 的描述中,还需要添加关于安全组 ID 的描述。
我们来敲击terraform apply并查看控制台。

已经创建了一个设有适当多条规则的安全组!

EC2实例的安全组已经正确分配了!
安装Nginx
来吧,既然已经到这里了,就再坚持一下。让我们安装Nginx吧。
在这里,为了进行ssh连接,需要进行密钥设置,所以事先创建一个密钥对。由于与主题无关,所以省略详细内容。具体方法请参考 AWS 官方文档。
好的,钥匙文件已经创建好了。我把创建的文件放在~/.ssh/test_terraform.pem中,然后将其写入代码中。为了避免冗长,以下只包含与EC2相关的描述部分。
# EC2
resource "aws_instance" "terraform-web" {
ami = "ami-0ab3e16f9c414dee7"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.terraform-web-sg.id]
key_name = "test_terraform" # <= 追加
tags = {
Name = "ec2-terraform"
}
provisioner "remote-exec" { # <= 追加
connection {
host = self.public_dns
type = "ssh"
user = "ec2-user"
private_key = file("~/.ssh/test_terraform.pem")
}
inline = [
"sudo yum -y update && sudo yum install -y nginx && sudo service nginx start"
]
}
}
如往常一样,应用程序已完成!资源:新增1个,更改0个,销毁1个。一旦显示这个消息,就表示操作已经完成。
让我们确认一下Nginx是否正常运行!首先尝试使用Terraform创建的环境来显示其内容的命令。
$ terraform show
可能你会发现突然冒出来了,但这就是构建的环境内容。
在EC2的描述中,我相信你会找到一个名为public_ip的字段。这就是给创建的EC2实例分配的公共IP地址!
那么,让我们尝试在浏览器中访问这个IP地址!

哇哦!成功地显示了Nginx的主页!这样一来,我们可以通过代码来进行环境设置并自动化部署了!太棒了Terraform!!???
概括
通过使用Terraform,现在可以将之前在云控制台上手动操作的环境进行代码化管理了!换句话说,可以将以前通过CLI创建环境的步骤清晰地代码化。总之,通过代码化,我们可以将环境的变更差异等全部在Git中进行管理。由于可以清晰地看到是谁在什么时候如何进行了变更,因此相比以前,现在可以更安心地进行环境搭建和维护。另外,一旦将常见的基础架构形态进行代码化,就可以在其他应用程序中重复使用。简直是超快速的基础架构搭建!因此,让我们将基础架构转化为代码,建立起安心、安全的开发体系吧!
另外,本次示例代码已在GitHub上提供,欢迎您使用于学习目的!