CloudFormation 到 Terraform 一个简单的 cli 工具,用于为现有 CloudFormation 模板生成 Terraform 配置。 | |
一个人造项目。由@nathanielks 维护。 |
此节点 CLI 工具用于生成 Terraform 配置文件以及 Terraform 状态,以便您可以使用 Terraform 来管理 CloudFormation 模板。为了进一步澄清,它不会为 CloudFormation 提供的各个资源生成 terraform 配置,而是生成aws_cloudformation_stack
资源,以便您可以使用 Terraform 而不是或与 AWS 控制台和 CLI 一起管理现有的 CloudFormation 堆栈。
npm i -g @humanmade/cf-to-tf
由于这是为了生成 Terraform 资源而设计的,因此最好安装terraform
。您可以自行安装二进制文件,也可以使用像brew
这样的工具来管理它。
还建议安装json2hcl
,因为这将有助于稍后处理cf-to-tf
的输出。
让我们使用以下 CloudFormation Stack 响应作为示例:
{
"Stacks": [
{
"StackId": "arn:aws:cloudformation:eu-central-1:123456789012:stack/foobarbaz/255491f0-71b8-11e7-a154-500c52a6cefe",
"Description": "FooBar Stack",
"Parameters": [
{
"ParameterValue": "bar",
"ParameterKey": "foo"
},
{
"ParameterValue": "baz",
"ParameterKey": "bar"
},
{
"ParameterValue": "qux",
"ParameterKey": "baz"
}
],
"Tags": [
{
"Value": "bar",
"Key": "foo"
},
{
"Value": "qux",
"Key": "baz"
}
],
"Outputs": [
{
"Description": "Foobarbaz",
"OutputKey": "FooBarBaz",
"OutputValue": "output value"
}
],
"CreationTime": "2017-07-26T04:08:57.266Z",
"Capabilities": [
"CAPABILITY_IAM"
],
"StackName": "foobarbaz",
"NotificationARNs": [],
"StackStatus": "CREATE_COMPLETE",
"DisableRollback": true
}
]
}
运行cf-to-tf --stack foobarbaz config | json2hcl | cf-to-tf clean-hcl | terraform fmt -
将生成以下配置:
resource "aws_cloudformation_stack" "network" {
capabilities = ["CAPABILITY_IAM"]
disable_rollback = true
name = "foobarbaz"
parameters = {
foo = "bar"
bar = "baz"
baz = "qux"
}
tags = {
foo = "bar"
baz = "qux"
}
}
Usage: cf-to-tf [options] [command]
Options:
-s, --stack <stack> The CloudFormation stack to import
-r, --resource-name <resourceName> The name to assign the terraform resource
-h, --help output usage information
Commands:
config Generates Terraform configuration in JSON
state Generates Terraform state file in JSON
template Prints the CloudFormation Stack Template
clean-hcl Cleans generated HCL according to my preferences
该工具旨在与其他工具结合使用。它只会将数据输出到STDOUT
,并被设计为通过管道传输到另一个程序以将文件写入某个位置。例如,要为名为lambda-resources
堆栈生成配置文件,我们可以执行以下操作:
cf-to-tf -s lambda-resources config | tee main.tf.json
此命令将获取名为lambda-resources
CloudFormation 堆栈并为其生成所需的 Terraform 配置。然后,我们将输出通过管道传送到tee
后者将写入名为main.tf.json
的文件。由于 HCL 与 JSON 兼容,Terraform 可以本机读取main.tf.json
。
要为此 CloudFormation 堆栈生成关联的 Terraform 状态,您将运行以下命令:
cf-to-tf -s lambda-resources state | tee terraform.tfstate
这将从头开始创建一个状态文件。它假设您还没有现有的状态文件。我正在考虑更新该工具以仅写入状态的资源部分,以便可以将其添加到现有的状态文件中,但这不是当务之急。
这两个命令都会生成压缩的 JSON 输出,这意味着空格已被删除。为了漂亮地打印输出以增强可读性,您可以将输出通过管道传送到jq
,然后传送到tee
:
cf-to-tf -s lambda-resources config | jq '.' | tee main.tf.json
cf-to-tf -s lambda-resources state | jq '.' | tee terraform.tfstate
还可以使用名为json2hcl
的工具来生成 HCL:
cf-to-tf -s lambda-resources config | json2hcl | tee main.tf
不幸的是,虽然json2hcl
输出有效的 HCL,但它不是我喜欢的格式。为了解决这个问题,还可以使用clean-hcl
命令。要以您通常看到的格式输出 HCL,您可以执行此链:
cf-to-tf -s lambda-resources config | json2hcl | cf-to-tf clean-hcl | terraform fmt - | tee main.tf
我们正在做与之前相同的事情,但现在我们还将结果通过管道传输到cf-to-tf clean-hcl
它以某种方式格式化文件,然后将其传输到terraform fmt -
它进一步格式化文件(主要是,该工具对齐=
并在必要时添加换行符)。
还可以让cf-to-tf
从STDIN
读取堆栈数据。例如,如果您将aws-cli
调用的 JSON 响应存储在变量中以供重复使用,则可以执行以下操作:
JSON="$(aws cloudformation describe-stacks --stack-name lambda-resources)"
echo "$JSON" | cf-to-tf -s - config
该命令在底层使用 AWS SDK 来检索 CloudFormation 堆栈详细信息,因此请像平常一样设置您的身份验证凭证( ~/.aws/credentials
、 AWS_PROFILE
、 AWS_REGION
等)。
有关如何在多个区域中导入多个堆栈的批量操作中使用此脚本的示例,请参阅此要点。