web-dev-qa-db-fra.com

Convertir AWS CloudFormation en modèle Terraform

Je souhaite convertir automatiquement les modèles AWS CloudFormation (yaml) en modèles Terraform (hcl).

Quelqu'un peut-il suggérer des outils, des approches, etc.?

9
Gleb Kosteiko

D'un point de vue conceptuel, CFT et TF ne sont pas des fonctionnalités équivalentes. Vous ne pourrez pas exprimer tout ce que CFT peut déployer dans TF.

D'un point de vue pratique, c'est en quelque sorte possible, mais vous devez écrire un convertisseur de grammaire; et cela devient très complexe (presque impossible) si votre CFT utilise des fonctions intrinsèques https://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html

À mon avis, vous devriez utiliser terraform aws_cloudformation_stack pour déployer votre CFT existant au lieu d'essayer de le convertir ( https://www.terraform.io/docs/providers/aws/r/cloudformation_stack.html ) .

9
Marc Hebrard

Jusqu'à présent, je n'ai pas vu de moyen simple de convertir CFN écrit en YAML ou JSON en code terraform.

Cependant, vous pouvez essayer de déployer les ressources via CFN, puis utilisez terraforming sur le compte dans lequel vous avez déployé CFN. Vous pouvez aspirer la plupart des ressources dans le code terraform mais pas toutes. Le code aura besoin d'une refactorisation et les ressources restantes (lambdas etc.) doivent être réécrites dans TF ou "traduites" de CFN en terraform.

Une autre option consiste à utiliser terraform aws_cloudformation_stack pour déployer la pile CFN pour vous et la gérer à partir de là.

8
look3y

Il n'y a pas d'outil pour convertir Cloudformation en Terraform, sauf si vous parlez simplement de gérer des modèles Cloudformation via aws_cloudformation_stack.

Et il est probable que vous ne voudriez même pas utiliser un tel outil de toute façon. Imaginez un modèle Cloudformation qui crée quatre sous-réseaux, probablement écrits à l'aide de copier/coller JSON ou YAML avec quatre ressources distinctes ("PublicSubnet0", "PublicSubnet1", etc.). La façon dont vous le feriez probablement dans Terraform est avec aws_subnet et count = 4. Tout convertisseur que vous utilisez doit être suffisamment intelligent pour gérer cela. Mais il devrait également être suffisamment intelligent pour savoir que "PrivateSubnet0" serait un tout autre aws_subnet avec son propre count. C'est très difficile à faire pour n'importe quel logiciel.

Donc, si vous vous souciez de la qualité du code dans vos scripts Terraform, faites-le manuellement.

1
ricksebak