CloudFormation에서 Terraform으로 기존 CloudFormation 템플릿에 대한 Terraform 구성을 생성하기 위한 간단한 cli 도구입니다. | |
인간이 만든 프로젝트. @nathanielks가 관리합니다. |
이 노드 CLI 도구는 Terraform을 사용하여 CloudFormation 템플릿을 관리할 수 있도록 Terraform 구성 파일과 Terraform 상태를 모두 생성하는 데 사용됩니다. 더 명확히 하면 CloudFormation 프로비저닝은 개별 리소스에 대한 Terraform 구성을 생성하지 않고, AWS 콘솔 및 CLI 대신 Terraform을 사용하여 기존 CloudFormation 스택을 관리할 수 있도록 aws_cloudformation_stack
리소스를 생성합니다.
npm i -g @humanmade/cf-to-tf
이는 Terraform 리소스를 생성하도록 설계되었으므로 terraform
설치하는 것이 좋습니다. 바이너리를 자체적으로 설치하거나 brew
와 같은 도구를 사용하여 관리할 수 있습니다.
나중에 cf-to-tf
의 출력을 처리하는 데 도움이 되므로 json2hcl
설치하는 것도 권장됩니다.
다음 CloudFormation 스택 응답을 예로 들어 보겠습니다.
{
"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
이 명령은 lambda-resources
라는 CloudFormation 스택을 가져오고 이에 필요한 Terraform 구성을 생성합니다. 그런 다음 출력을 tee
로 파이프하여 main.tf.json
이라는 파일에 기록합니다. HCL은 JSON과 호환되므로 Terraform은 기본적으로 main.tf.json
을 읽을 수 있습니다.
이 CloudFormation 스택에 연결된 Terraform 상태를 생성하려면 다음을 실행합니다.
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
에서 스택 데이터를 읽도록 하는 것도 가능합니다. 예를 들어, 재사용을 위해 변수에 저장된 aws-cli
호출의 JSON 응답이 있는 경우 다음을 수행할 수 있습니다.
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
등).
여러 지역에서 여러 스택을 가져오는 일괄 작업에서 이 스크립트를 사용하는 방법에 대한 예는 이 요점을 참조하세요.