De CloudFormation a Terraform Una herramienta CLI sencilla para generar la configuración de Terraform para plantillas de CloudFormation existentes. | |
Un proyecto hecho por humanos . Mantenido por @nathanielks. |
Esta herramienta CLI de nodo se utiliza para generar archivos de configuración de Terraform así como el estado de Terraform para que pueda usar Terraform para administrar plantillas de CloudFormation. Para aclarar aún más, no genera una configuración de terraform para las provisiones de CloudFormation de recursos individuales, genera un recurso aws_cloudformation_stack
para que pueda administrar sus pilas de CloudFormation existentes con Terraform en lugar de o junto con la consola y la CLI de AWS.
npm i -g @humanmade/cf-to-tf
Como esto fue diseñado para generar recursos de Terraform, sería una buena idea instalar terraform
. Puede instalar el binario usted mismo o utilizar una herramienta como brew
para administrarlo por usted.
También se recomienda instalar json2hcl
ya que esto ayudará a procesar la salida de cf-to-tf
más adelante.
Usemos la siguiente respuesta de CloudFormation Stack como ejemplo:
{
"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
}
]
}
Ejecutando cf-to-tf --stack foobarbaz config | json2hcl | cf-to-tf clean-hcl | terraform fmt -
generará la siguiente configuración:
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
Esta herramienta está diseñada para usarse junto con otras herramientas. Solo enviará los datos a STDOUT
y está diseñado para ser canalizado a otro programa para escribir el archivo en una ubicación. Por ejemplo, para generar un archivo de configuración para una pila denominada lambda-resources
, podríamos hacer lo siguiente:
cf-to-tf -s lambda-resources config | tee main.tf.json
Este comando buscará una pila de CloudFormation llamada lambda-resources
y generará la configuración de Terraform requerida para ella. Luego canalizamos la salida a tee
, que se escribirá en un archivo llamado main.tf.json
. Debido a que HCL es compatible con JSON, Terraform puede leer main.tf.json
de forma nativa.
Para generar el estado de Terraform asociado para esta pila de CloudFormation, ejecutaría lo siguiente:
cf-to-tf -s lambda-resources state | tee terraform.tfstate
Esto creará un archivo de estado desde cero. Se supone que aún no tiene un archivo de estado existente. Estoy considerando actualizar la herramienta para escribir solo la parte de recursos del estado para poder agregarla a un archivo de estado existente, pero esa no era una prioridad inmediata.
Ambos comandos generarán una salida JSON comprimida, lo que significa que se han eliminado los espacios en blanco. Para imprimir la salida de forma bonita y mejorar la legibilidad, puede canalizar la salida a jq
y luego a tee
:
cf-to-tf -s lambda-resources config | jq '.' | tee main.tf.json
cf-to-tf -s lambda-resources state | jq '.' | tee terraform.tfstate
También es posible utilizar una herramienta llamada json2hcl
para generar HCL:
cf-to-tf -s lambda-resources config | json2hcl | tee main.tf
Desafortunadamente, aunque json2hcl
genera HCL válido, no está en el formato que me gusta. Para solucionar ese problema, el comando clean-hcl
también está disponible. Para generar HCL en el formato que verá normalmente, puede ejecutar esta cadena:
cf-to-tf -s lambda-resources config | json2hcl | cf-to-tf clean-hcl | terraform fmt - | tee main.tf
Estamos haciendo lo mismo que hacíamos antes, pero ahora también estamos canalizando el resultado a cf-to-tf clean-hcl
que formatea el archivo de cierta manera, y luego lo canalizamos a terraform fmt -
que formatea aún más el archivo. (principalmente, esta herramienta alinea =
y agrega nuevas líneas cuando sea necesario).
También es posible hacer que cf-to-tf
lea datos de la pila desde STDIN
. Por ejemplo, si tiene la respuesta JSON de la llamada aws-cli
almacenada en una variable para su reutilización, puede hacer lo siguiente:
JSON="$(aws cloudformation describe-stacks --stack-name lambda-resources)"
echo "$JSON" | cf-to-tf -s - config
El comando utiliza el SDK de AWS para recuperar los detalles de la pila de CloudFormation, así que configure sus credenciales de autenticación como lo haría normalmente ( ~/.aws/credentials
, AWS_PROFILE
, AWS_REGION
, etc.).
Para ver un ejemplo de cómo utilizar este script en operaciones por lotes que importan varias pilas en varias regiones, consulte esta esencia.