一起体验使用Terraform将基础设施代码化 ~ 第一部分:基础知识
目标读者
-
- 「インフラ」という言葉に抵抗がある
-
- 基本的にサーバ等はインフラチームが管理しており、自分はあまり触ったことが無い
- AWSのインフラ構築は全てコンソール上で行っており、作業が属人化して困っている
为了的目标
-
- インフラへの抵抗感をなくしてもらう
インフラのコード化(Infrastructure as Code)を取り入れる事で相当インフラ構築が楽になることを実感してもらう
Terraform 是什么东西?
Terraform是一个工具,它可以将基础设施编排的过程变成代码。
这个工具可以用代码来管理基础设施的建立、修改和删除等操作。
(在这个例子中没有提到AWS,但它还支持其他各种基础设施,如Azure、Docker、Heroku等)。
示例
实际上是什么样的东西呢?原网站的首页上有例子,
创建ELB和EC2实例需要按这样的方式编写代码。
resource "aws_elb" "frontend" {
name = "frontend-load-balancer"
listener {
instance_port = 8000
instance_protocol = "http"
lb_port = 80
lb_protocol = "http"
}
instances = ["${aws_instance.app.*.id}"]
}
resource "aws_instance" "app" {
count = 5
ami = "ami-408c7f28"
instance_type = "t1.micro"
}
基础Terraform
要在terraform中构建基础设施,需要分为三个阶段的流程。
-
- 编写代码
-
- 在计划中确认设置是否正确
- 实际应用
所以,直到实际申请之前,实际上不会发生任何事情。
只有应用后,才会开始尝试构建基础设施。
试用一下看看
1. 安装Terraform
使用官方提供的每个环境的二进制文件来进行安装。
在Mac上可以使用brew进行安装。
$ brew install terraform
$ terraform -v
Terraform v0.9.4
※ 目前来说,v0.10.2是最新版本。
2. 设置网络供应商
基本上,Terraform需要首先声明要使用哪个提供商。由于本例中使用AWS,宣言如下。
provider "aws" {
access_key = "ACCESS_KEY_HERE"
secret_key = "SECRET_KEY_HERE"
region = "ap-northeast-1"
}
使用AWS时,需要提供access_key和secret_key。然而,我认为一些人可能会对直接将凭证值写入代码感到不安。
我将介绍解决这个问题的方案。
使用环境变量
如果将以下两个项作为环境变量导出,那么在执行terraform命令时将自动读取凭据信息。
-
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
使用变量
在terraform中,我们使用variable块来定义变量。
通过在variable块中写入variable “{变量名}” {},可以声明变量。
此外,要引用该变量,可以使用${var.变量名}的方式。变为如下所示。
variable "access_key" {}
variable "secret_key" {}
provider "aws" {
access_key = "${var.access_key}"
secret_key = "${var.secret_key}"
region = "ap-northeast-1"
}
这是一个使用变量块声明了两个 access_key 和 secret_key,并在 provider 块中进行引用和使用的形式。
现在,已经可以声明变量了。但是如果没有给变量赋值,那么在运行时将会出错。
那么怎么进行赋值呢?
使用环境变量
$ export TF_VAR_access_key = "xxxxxxxxx"
$ export TF_VAR_secret_key = "xxxxxxxxx"
ⅱ. 用文件传递
如果提前以文件名 terraform.tfvars 的形式创建,Terraform 在运行时会加载已定义的变量。
另外,还可以选择不将文件名命名为terraform.tfvars。
只需在执行terraform时按照以下方式指定文件即可。
aws_access_key = "xxxx"
aws_secret_key = "xxxx"
$ terraform apply -var-file="{変数ファイル名}"
ⅲ. 通过Terraform命令的选项来传递值。
最后,是关于在执行terraform时指定变量的方法。
$ terraform apply -var "access_key=xxxx" -var "secret_key=xxxxx"
尝试确认变量是否被赋值。
那么我们立即将凭证信息从外部传递进来吧。
在Terraform中,我们可以通过确认它分配给`output`属性的值来进行尝试。
variable "aws_access_key" {}
variable "aws_secret_key" {}
output "aws_access_key" {
value = "${var.aws_access_key}"
}
output "aws_secret_key" {
value = "${var.aws_secret_key}"
}
aws_access_key = "test_access_key"
aws_secret_key = "test_secret_key"
在test.tf文件中,仅定义了aws_access_key和aws_secret_key这两个变量,并通过terraform.tfvars进行了实际变量的赋值。
好了,那么让我们实际应用一下,看看会得到什么结果吧。
$ terraform apply
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
aws_access_key = test_access_key
aws_secret_key = test_secret_key
我确认每个变量都已正确赋值。
下一次会告知
明天,我打算利用这些变量等机制来创建一个简单的网络服务器配置。