将现有基础设施置于Terraform的管理之下
Terraform是一种非常有用的工具,主要用于从零开始构建基础设施。
但是,可能有些人希望在现有正在运行的基础设施中引入Terraform,或者希望用Terraform来管理现有的基础设施。
本次将介绍如何使用Terraforming来实现将现有基础设施管理到Terraform中的方法。
「Terraforming」是什么意思?
Terraforming 是一个工具,可以使用 AWS 的 API 从现有的基础设施资源中生成 Terraform 代码。
同类工具中,还有用于 DNSimple 的 Terraforming::DNSimple。
安装
由于其作为RubyGems的一个发布版本,
$ gem install terraforming
另外,我们还提供了Docker镜像,如果您想使用它,请选择。
$ docker pull quay.io/dtan4/terraforming:latest
使用方法
tf 形式的输出
我会将AWS凭据预先放入环境变量中。
如果您是Mac用户,我推荐使用envchain。
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export AWS_DEFAULT_REGION=xx-yyyy-0
只需指定资源名称,就会以tf格式输出。
如果是S3存储桶:
$ terraforming s3
resource "aws_s3_bucket" "hoge" {
bucket = "hoge"
acl = "private"
}
resource "aws_s3_bucket" "fuga" {
bucket = "fuga"
acl = "private"
}
如果要将此写入 s3.tf,则可采取以下方式。
如果要作为 Docker 容器运行,则会如下所示。
$ docker run \
--rm \
--name terraforming \
-e AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX \
-e AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
-e AWS_DEFAULT_REGION=xx-yyyy-0 \
quay.io/dtan4/terraforming:latest \
terraforming s3
输出以tfstate形式的表达
要将现有基础设施放置在Terraform管理之下,仅编写tf文件是不够的。还需要修改作为状态管理文件的terraform.tfstate。
使用 –tfstate 选项会以 tfstate 格式进行输出。
$ terraforming s3 --tfstate
{
"version": 1,
"serial": 1,
"modules": {
"path": [
"root"
],
"outputs": {
},
"resources": {
"aws_s3_bucket.hoge": {
"type": "aws_s3_bucket",
"primary": {
"id": "hoge",
"attributes": {
"acl": "private",
"bucket": "hoge",
"id": "hoge"
}
}
},
"aws_s3_bucket.fuga": {
"type": "aws_s3_bucket",
"primary": {
"id": "fuga",
"attributes": {
"acl": "private",
"bucket": "fuga",
"id": "fuga"
}
}
}
}
}
}
另外,tfstate 可以作为与现有的 terraform.tfstate 合并后的输出形式。
$ terraforming s3 --tfstate --merge=/path/to/tfstate
{
"version": 1,
"serial": 89,
"remote": {
"type": "s3",
"config": {
"bucket": "terraforming-tfstate",
"key": "tf"
}
},
"modules": {
"path": [
"root"
],
"outputs": {
},
"resources": {
"aws_iam_user.dtan4": {
"type": "aws_iam_user",
"primary": {
"id": "dtan4",
"attributes": {
"arn": "arn:aws:iam::012345678901:user/dtan4",
"id": "dtan4",
"name": "dtan4",
"path": "/",
"unique_id": "ABCDEFGHIJKLMN1234567"
}
}
},
"aws_s3_bucket.hoge": {
"type": "aws_s3_bucket",
"primary": {
"id": "hoge",
"attributes": {
"acl": "private",
"bucket": "hoge",
"id": "hoge"
}
}
},
"aws_s3_bucket.fuga": {
"type": "aws_s3_bucket",
"primary": {
"id": "fuga",
"attributes": {
"acl": "private",
"bucket": "fuga",
"id": "fuga"
}
}
}
}
}
}
如果你在远程(S3,Atlas等)上管理terraform.tfstate文件,那么在本地修改后如果不增加serial,将会出现与远程文件不一致的错误。
然而,Terraforming的–merge选项会正确地递增serial(即terraform.tfstate的版本号)。
您只需将此内容覆盖到 terraform.tfstate 文件中即可。
最后执行 terraform plan 来确保没有差异。
$ terraform plan
No changes. Infrastructure is up-to-date. This means that Terraform
could not detect any differences between your configuration and
the real physical resources that exist. As a result, Terraform
doesn't need to do anything.
正在应对的 AWS 资源
在v0.1.0版本中,支持以下资源。
-
- Database Parameter Group
-
- Database Security Group
-
- Database Subnet Group
-
- EC2
-
- ELB
-
- IAM Group
-
- IAM Group Policy
-
- IAM Instance Profile
-
- IAM Policy
-
- IAM Role
-
- IAM Role Policy
-
- IAM User
-
- IAM User Policy
-
- Network ACL
-
- Route53 Record
-
- Route53 Hosted Zone
-
- RDS
-
- S3
-
- Security Group
-
- Subnet
- VPC
最后加上
我介绍了一种使用Terraforming的方法,将现有的基础设施资源转化为Terraform代码。
希望您也能一并查看下面的博客文章,其中详细记录了我们为何决定进行Terraforming等等的小故事。
- Terraforming: 既存のインフラリソースを Terraform コードに落としこむ – 端子録
参考
-
- dtan4/terraforming
-
- Terraforming: 既存のインフラリソースを Terraform コードに落としこむ – 端子録
-
- Import resources into Terraform · Issue #581 · hashicorp/terraform
- Amazon S3 で Terraform の状態管理ファイル terraform.tfstate を管理 / 共有する – Qiita