CloudFormation vers Terraform Un outil cli simple pour générer une configuration Terraform pour les modèles CloudFormation existants. | |
Un projet créé par l'homme . Maintenu par @nathanielks. |
Cet outil CLI de nœud est utilisé pour générer à la fois les fichiers de configuration Terraform ainsi que l'état Terraform afin que vous puissiez utiliser Terraform pour gérer les modèles CloudFormation. Pour plus de clarté, il ne génère pas de configuration Terraform pour les ressources individuelles fournies par CloudFormation, il génère une ressource aws_cloudformation_stack
afin que vous puissiez gérer vos piles CloudFormation existantes avec Terraform au lieu ou en conjonction avec la console AWS et la CLI.
npm i -g @humanmade/cf-to-tf
Comme cela a été conçu pour générer des ressources Terraform, ce serait une bonne idée d'installer terraform
. Vous pouvez installer le binaire par lui-même ou utiliser un outil comme brew
pour le gérer pour vous.
Il est également recommandé d'installer json2hcl
car cela facilitera le traitement ultérieur de la sortie de cf-to-tf
.
Utilisons la réponse CloudFormation Stack suivante comme exemple :
{
"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
}
]
}
Exécution de cf-to-tf --stack foobarbaz config | json2hcl | cf-to-tf clean-hcl | terraform fmt -
générera la configuration suivante :
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
Cet outil est conçu pour être utilisé conjointement avec d’autres outils. Il affichera uniquement les données vers STDOUT
et est conçu pour être redirigé vers un autre programme pour écrire le fichier vers un emplacement. Par exemple, pour générer un fichier de configuration pour une pile nommée lambda-resources
, nous pourrions procéder comme suit :
cf-to-tf -s lambda-resources config | tee main.tf.json
Cette commande récupérera une pile CloudFormation nommée lambda-resources
et générera la configuration Terraform requise pour celle-ci. Nous redirigeons ensuite la sortie vers tee
qui écrira dans un fichier nommé main.tf.json
. Étant donné que HCL est compatible JSON, Terraform peut lire le main.tf.json
de manière native.
Pour générer l'état Terraform associé à cette pile CloudFormation, vous devez exécuter la commande suivante :
cf-to-tf -s lambda-resources state | tee terraform.tfstate
Cela créera un fichier d'état à partir de zéro. Cela suppose que vous n’avez pas déjà de fichier d’état existant. J'envisage de mettre à jour l'outil pour écrire uniquement la partie ressource de l'état afin qu'elle puisse être ajoutée à un fichier d'état existant, mais ce n'était pas une priorité immédiate.
Ces deux commandes généreront une sortie JSON compressée, ce qui signifie que les espaces ont été supprimés. Pour imprimer joliment la sortie pour une meilleure lisibilité, vous pouvez diriger la sortie vers jq
, puis vers tee
:
cf-to-tf -s lambda-resources config | jq '.' | tee main.tf.json
cf-to-tf -s lambda-resources state | jq '.' | tee terraform.tfstate
Il est également possible d'utiliser un outil appelé json2hcl
pour générer du HCL :
cf-to-tf -s lambda-resources config | json2hcl | tee main.tf
Malheureusement, bien que json2hcl
génère du HCL valide, ce n'est pas dans le format que j'aime. Pour résoudre ce problème, la commande clean-hcl
est également disponible. Pour générer du HCL dans le format que vous verrez normalement, vous pouvez exécuter cette chaîne :
cf-to-tf -s lambda-resources config | json2hcl | cf-to-tf clean-hcl | terraform fmt - | tee main.tf
Nous faisons la même chose que nous faisions auparavant, mais maintenant nous transmettons également le résultat à cf-to-tf clean-hcl
qui formate le fichier d'une certaine manière, puis le transmettons à terraform fmt -
qui formate davantage le fichier. (principalement, cet outil aligne =
et ajoute des nouvelles lignes si nécessaire).
Il est également possible que cf-to-tf
lise les données de la pile à partir de STDIN
. Par exemple, si la réponse JSON de l'appel aws-cli
est stockée dans une variable pour être réutilisée, vous pouvez effectuer les opérations suivantes :
JSON="$(aws cloudformation describe-stacks --stack-name lambda-resources)"
echo "$JSON" | cf-to-tf -s - config
La commande utilise le SDK AWS sous le capot pour récupérer les détails de la pile CloudFormation, alors définissez vos informations d'authentification comme vous le feriez normalement ( ~/.aws/credentials
, AWS_PROFILE
, AWS_REGION
, etc.).
Pour un exemple d'utilisation de ce script dans des opérations par lots important plusieurs piles dans plusieurs régions, reportez-vous à ce résumé.