将现有基础设施置于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
广告
将在 10 秒后关闭
bannerAds