CloudFormation から Terraform へ 既存の CloudFormation テンプレートの Terraform 構成を生成するためのシンプルな cli ツール。 | |
人間が作ったプロジェクト。 @nathanielks によって管理されています。 |
このノード CLI ツールは、Terraform 構成ファイルと Terraform 状態の両方を生成するために使用され、Terraform を使用して CloudFormation テンプレートを管理できるようになります。さらに明確にすると、CloudFormation がプロビジョニングする個々のリソースの Terraform 設定は生成されません。AWS コンソールや CLI の代わりに、またはこれらと組み合わせて、既存の CloudFormation スタックを Terraform で管理できるように、 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
など)。
複数のリージョンに複数のスタックをインポートするバッチ操作でこのスクリプトを使用する方法の例については、この要点を参照してください。