CloudFormation zu Terraform Ein einfaches CLI-Tool zum Generieren einer Terraform-Konfiguration für vorhandene CloudFormation-Vorlagen. | |
Ein von Menschen gemachtes Projekt. Verwaltet von @nathanielks. |
Dieses Knoten-CLI-Tool wird zum Generieren sowohl von Terraform-Konfigurationsdateien als auch des Terraform-Status verwendet, sodass Sie Terraform zum Verwalten von CloudFormation-Vorlagen verwenden können. Zur weiteren Verdeutlichung: Es generiert keine Terraform-Konfiguration für die einzelnen von CloudFormation bereitgestellten Ressourcen, sondern eine aws_cloudformation_stack
-Ressource, sodass Sie Ihre vorhandenen CloudFormation-Stacks mit Terraform anstelle oder in Verbindung mit der AWS-Konsole und der CLI verwalten können.
npm i -g @humanmade/cf-to-tf
Da dies zur Generierung von Terraform-Ressourcen konzipiert wurde, wäre es eine gute Idee, terraform
zu installieren. Sie können die Binärdatei selbst installieren oder ein Tool wie brew
verwenden, um sie für Sie zu verwalten.
Es wird außerdem empfohlen, json2hcl
zu installieren, da dies später bei der Verarbeitung der Ausgabe von cf-to-tf
hilft.
Nehmen wir als Beispiel die folgende CloudFormation Stack-Antwort:
{
"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
}
]
}
Ausführen cf-to-tf --stack foobarbaz config | json2hcl | cf-to-tf clean-hcl | terraform fmt -
generiert die folgende Konfiguration:
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
Dieses Tool ist für die Verwendung in Verbindung mit anderen Tools konzipiert. Die Daten werden nur an STDOUT
ausgegeben und können an ein anderes Programm weitergeleitet werden, um die Datei an einen Speicherort zu schreiben. Um beispielsweise eine Konfigurationsdatei für einen Stack namens lambda-resources
zu generieren, könnten wir Folgendes tun:
cf-to-tf -s lambda-resources config | tee main.tf.json
Dieser Befehl ruft einen CloudFormation-Stack mit dem Namen lambda-resources
ab und generiert die erforderliche Terraform-Konfiguration dafür. Anschließend leiten wir die Ausgabe an tee
weiter, das in eine Datei mit dem Namen main.tf.json
schreibt. Da HCL JSON-kompatibel ist, kann Terraform main.tf.json
nativ lesen.
Um den zugehörigen Terraform-Status für diesen CloudFormation-Stack zu generieren, führen Sie Folgendes aus:
cf-to-tf -s lambda-resources state | tee terraform.tfstate
Dadurch wird eine Statusdatei von Grund auf erstellt. Dabei wird davon ausgegangen, dass noch keine Statusdatei vorhanden ist. Ich denke darüber nach, das Tool so zu aktualisieren, dass nur der Ressourcenteil des Status geschrieben wird, sodass dieser zu einer vorhandenen Statusdatei hinzugefügt werden kann, aber das hatte keine unmittelbare Priorität.
Beide Befehle generieren eine komprimierte JSON-Ausgabe, was bedeutet, dass Leerzeichen entfernt wurden. Um die Ausgabe für eine bessere Lesbarkeit hübsch auszudrucken, können Sie die Ausgabe an jq
und dann an tee
weiterleiten:
cf-to-tf -s lambda-resources config | jq '.' | tee main.tf.json
cf-to-tf -s lambda-resources state | jq '.' | tee terraform.tfstate
Es ist auch möglich, ein Tool namens json2hcl
zum Generieren von HCL zu verwenden:
cf-to-tf -s lambda-resources config | json2hcl | tee main.tf
Leider gibt json2hcl
zwar gültige HCL aus, aber nicht in dem Format, das mir gefällt. Um dieses Problem zu lösen, steht auch der Befehl clean-hcl
zur Verfügung. Um HCL in dem Format auszugeben, das Sie normalerweise sehen, können Sie diese Kette ausführen:
cf-to-tf -s lambda-resources config | json2hcl | cf-to-tf clean-hcl | terraform fmt - | tee main.tf
Wir machen dasselbe wie zuvor, aber jetzt leiten wir das Ergebnis auch an cf-to-tf clean-hcl
weiter, das die Datei auf eine bestimmte Weise formatiert, und leiten es dann an terraform fmt -
das die Datei weiter formatiert (In erster Linie richtet dieses Tool =
aus und fügt bei Bedarf Zeilenumbrüche hinzu).
Es ist auch möglich, dass cf-to-tf
Stapeldaten von STDIN
liest. Wenn Sie beispielsweise die JSON-Antwort des aws-cli
-Aufrufs zur Wiederverwendung in einer Variablen gespeichert haben, können Sie Folgendes tun:
JSON="$(aws cloudformation describe-stacks --stack-name lambda-resources)"
echo "$JSON" | cf-to-tf -s - config
Der Befehl verwendet das AWS SDK unter der Haube, um die CloudFormation-Stack-Details abzurufen. Legen Sie daher Ihre Authentifizierungsanmeldeinformationen wie gewohnt fest ( ~/.aws/credentials
, AWS_PROFILE
, AWS_REGION
usw.).
Ein Beispiel für die Verwendung dieses Skripts in Batch-Vorgängen zum Importieren mehrerer Stacks in mehreren Regionen finden Sie in dieser Zusammenfassung.