CloudFormation إلى Terraform أداة cli بسيطة لإنشاء تكوين Terraform لقوالب CloudFormation الموجودة. | |
مشروع من صنع الإنسان . تتم صيانته بواسطة @nathanielks. |
تُستخدم أداة العقدة CLI هذه لإنشاء ملفات تكوين Terraform بالإضافة إلى حالة Terraform بحيث يمكنك استخدام Terraform لإدارة قوالب CloudFormation. لمزيد من التوضيح، لا يُنشئ تكوين terraform لأحكام CloudFormation للموارد الفردية، بل يُنشئ مورد aws_cloudformation_stack
حتى تتمكن من إدارة مجموعات CloudFormation الحالية لديك باستخدام Terraform بدلاً من وحدة تحكم AWS وCLI أو بالاشتراك معها.
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
سيقوم هذا الأمر بإحضار مكدس 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
وما إلى ذلك).
للحصول على مثال لكيفية استخدام هذا البرنامج النصي في العمليات الدفعية لاستيراد مكدسات متعددة في مناطق متعددة، راجع هذا الجوهر.