CloudFormation ถึง Terraform เครื่องมือ cli ง่ายๆ สำหรับสร้างการกำหนดค่า Terraform สำหรับเทมเพลต CloudFormation ที่มีอยู่ | |
โครงการ ที่มนุษย์สร้างขึ้น ดูแลโดย @nathanielks |
เครื่องมือ CLI ของโหนดนี้ใช้สำหรับสร้างทั้งไฟล์การกำหนดค่า Terraform และสถานะ Terraform เพื่อให้คุณสามารถใช้ Terraform เพื่อจัดการเทมเพลต CloudFormation เพื่อชี้แจงเพิ่มเติม จะไม่มีการสร้างการกำหนดค่า Terraform สำหรับทรัพยากรแต่ละรายการตามข้อกำหนดของ CloudFormation แต่จะสร้างทรัพยากร aws_cloudformation_stack
เพื่อให้คุณสามารถจัดการสแต็ก CloudFormation ที่มีอยู่ด้วย Terraform แทนหรือร่วมกับ AWS Console และ 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
ฯลฯ)
สำหรับตัวอย่างวิธีใช้สคริปต์นี้ในการดำเนินการแบบแบตช์ซึ่งนำเข้าหลายสแต็กในหลายภูมิภาค โปรดดูส่วนสำคัญนี้