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
等)。
有關如何在多個區域中匯入多個堆疊的批次操作中使用此腳本的範例,請參閱此要點。