CloudFormation в Terraform Простой инструмент командной строки для создания конфигурации Terraform для существующих шаблонов CloudFormation. | |
Проект , созданный человеком . Поддерживает @nathanielks. |
Этот инструмент CLI узла используется для создания как файлов конфигурации Terraform, так и состояния Terraform, чтобы вы могли использовать Terraform для управления шаблонами CloudFormation. Чтобы уточнить, он не создает конфигурацию terraform для отдельных ресурсов, предоставляемых CloudFormation, он генерирует ресурс aws_cloudformation_stack
, чтобы вы могли управлять существующими стеками CloudFormation с помощью Terraform вместо или в сочетании с консолью AWS и интерфейсом командной строки.
npm i -g @humanmade/cf-to-tf
Поскольку он был разработан для генерации ресурсов Terraform, было бы неплохо установить terraform
. Вы можете установить двоичный файл отдельно или использовать такой инструмент, как brew
чтобы управлять им за вас.
Также рекомендуется установить json2hcl
, так как это поможет позже обрабатывать выходные данные из cf-to-tf
.
В качестве примера возьмем следующий ответ стека CloudFormation:
{
"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
Эта команда получит стек CloudFormation с именем lambda-resources
и сгенерирует для него необходимую конфигурацию Terraform. Затем мы передаем вывод в tee
, который записывает в файл с именем main.tf.json
. Поскольку HCL совместим с JSON, Terraform может читать файл main.tf.json
изначально.
Чтобы сгенерировать связанное состояние Terraform для этого стека CloudFormation, вы должны выполнить следующее:
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
. Например, если у вас есть ответ JSON от вызова aws-cli
, сохраненный в переменной для повторного использования, вы можете сделать следующее:
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
и т. д.).
Пример использования этого сценария в пакетных операциях, импортирующих несколько стеков в несколько регионов, см. в этой статье.