Connectez AWS à Terraform au lieu de CloudFormation

A Terraform equivalent of the generated AWS template, with an Organization variant and a way to compare it to the wizard.

Connectez AWS à Terraform au lieu de CloudFormation

Créez le même rôle IAM, le même compartiment S3 et l'exportation de coût et d'utilisation que ceux créés par le modèle de l'assistant CostGlass, mais en tant que Terraform, vous pouvez vérifier et conserver le contrôle de version.

Where in CostGlassSettings → Cloud Accounts → AWS wizard
PlanAll plans
Who can do thisOwner or Admin in CostGlass; Terraform access to AWS
Time neededAbout 20 minutes, plus up to 24 hours for the first data
En bref
  • CostGlass génère un modèle CloudFormation pour AWS. Il ne génère pas Terraform. Cette page donne un équivalent Terraform écrit à la main.
  • Vous démarrez toujours l'assistant AWS dans CostGlass, car il crée votre connexion, votre ID externe et votre ID de compte CostGlass.
  • Rien de secret n'est codé en dur : l'ID de compte CostGlass et l'ID externe sont des variables que vous renseignez.
  • Vous collez ensuite les sorties RoleArn et BucketName dans l'assistant, exactement comme avec CloudFormation.
  • Comme il est géré manuellement, comparez ses autorisations avec le modèle de l'assistant avant de postuler. Un script de comparaison est ci-dessous.
Equivalent entretenu à la main
Le modèle CloudFormation généré par l'assistant est la source de vérité. This Terraform matches it as of this guide's publication (checked with terraform validate on AWS provider 5.100). Si CostGlass ajoute ultérieurement une autorisation au modèle, cette page peut être à la traîne. Exécutez toujours la comparaison dans la dernière section avant de postuler.
Avant de commencer
  • Terraform 1.5 ou version ultérieure et fournisseur AWS hashicorp/aws version ~> 5.0. La ressource d'exportation (aws_bcmdataexports_export) nécessite une version 5.x qui l'inclut ; si init indique que le type de ressource est inconnu, exécutez terraform init -upgrade.
  • Les informations d'identification AWS pour le compte qui paie la facture (le compte de gestion d'une organisation), autorisées à créer des rôles IAM, des compartiments S3 et des exportations de données de facturation.
  • L'assistant CostGlass s'ouvre à l'étape de déploiement (expliquée ci-dessous).

Obtenez vos deux valeurs de CostGlass

Le Terraform a besoin de deux valeurs qui appartiennent à votre connexion. Ne les saisissez jamais de mémoire et ne les partagez jamais dans le chat.

1
Démarrez l'assistant
Go to Settings → Cloud Accounts, click the AWS card, choose the same Account type and the same features you will use in Terraform, then click Generate my template.
2
Copiez l'ID externe
On Deploy the CloudFormation template it is shown as External ID (pre-filled in the template). This is the value for external_id.
3
Copiez l'ID du compte CostGlass
In the template preview (or in the file from Download) find the parameter ID de compte CostGlass and copy its Par défaut value, a 12-digit number. This is the value for costglass_account_id.
4
Gardez l'assistant ouvert
Do not click "I have deployed it" until Terraform has finished. Ne démarrez pas une connexion différente, car cela produit un ID externe différent.
Important
Cochez les mêmes fonctionnalités dans l'assistant que vous activez dans Terraform. CostGlass records the wizard's selection, and shows it on the account card.

Compte unique

Créez un dossier avec ces fichiers. Tout est appliqué dans nous-est-1, comme le modèle CloudFormation.

versions.tf
variables.tf
main.tf
sorties.tf
terraform.tfvars (exemple, ne validez pas le vrai)

Variables

VariablesCe que ça faitPar défaut
costglass_account_idLe compte CostGlass AWS autorisé à assumer ce rôle.Aucun. Requis.
external_idYour connection's External ID. Marked sensitive.Aucun. Requis.
bucket_name_prefixLe compartiment est nommé <préfixe>-<votre ID de compte>.costglass-cur-exports
export_nameNom de l’export Coût et utilisation.CoûtGlassCUREExport
s3_prefixDossier dans le seau.cur
enable_instance_schedulerAjoute les seules autorisations d'écriture (démarrer, arrêter, mettre à l'échelle).FAUX
enable_rightsizingAjoute des métriques CloudWatch et des lectures Compute Optimizer.FAUX
enable_uptime_monitoringAjoute des lectures de vérification de l'état, d'alarme et de santé de la cible.FAUX
Astuce
Pass the External ID with an environment variable instead of a file: export TF_VAR_external_id='...'. La valeur est également stockée dans l'état Terraform, protégez donc votre fichier d'état comme un mot de passe.

Exécutez-le et terminez dans CostGlass

1
Initialiser
Run terraform init.
2
Offre
Run terraform plan and read it. Vous devriez voir le rôle, ses politiques, le compartiment et ses paramètres, ainsi que l'exportation. Rien n'est encore créé.
3
Appliquer
Run terraform apply et confirmez. When it finishes it prints RôleArn, Nom du compartiment et ExportArn.
4
Retour dans l'assistant
Click I have deployed it. Paste RôleArn into Role ARN (Outputs: RoleArn) and Nom du compartiment into S3 bucket (Outputs: BucketName). Leave Prefix as cur/ (change it to match s3_prefix, with a trailing slash, if you changed that) and Region as nous-est-1.
5
Vérifier
Click Verify & connect. A partir de là, tout est identique au Guide CloudFormation, y compris l'attente pouvant aller jusqu'à 24 heures pour la première exportation.

Organisation AWS

In the wizard choose AWS Organization. Exécutez le Terraform à compte unique ci-dessus dans le compte de gestion: it creates the bucket, the export and the role CoûtGlassCURReader. Member accounts also need the role CoûtGlassReadOnly. Choisissez l’une des deux manières.

Option A : un StackSet (le plus proche du modèle d'assistant)

Ajoutez ce fichier au même dossier. Il crée un StackSet géré par le service qui déploie le rôle de membre sur chaque compte membre, maintenant et lorsque les comptes rejoindront plus tard. Effectuez d'abord la condition préalable unique : dans le compte de gestion, CloudFormation → StackSets → Activer un accès fiable avec AWS Organizations.

stackset.tf

Option B : un appel de module Terraform par compte membre

Utilisez-le si vous souhaitez que Terraform lui-même possède les rôles ou si vous ne connectez que quelques comptes. Terraform ne peut pas créer de fournisseurs en boucle, chaque compte a donc besoin de son propre alias de fournisseur et de son propre bloc de module. The management account assumes OrganizationAccountAccessRole, which AWS Organizations creates in accounts it created; accounts you invited need an equivalent role.

membres.tf
modules/member_role/main.tf

Ensemble member_account_ids in your variables, for example ["111111111111", "222222222222"], and add a provider and module pair for each extra account.

Remarque
Utilisez l’option A ou l’option B, pas les deux. The management account itself uses CoûtGlassCURReader only, the same as the CloudFormation template.

Vérifiez qu'il correspond à l'assistant

Download the YAML from the wizard (Download), save it next to your Terraform, then compare the permission lists. Cochez d'abord les mêmes caractéristiques des deux côtés.

comparer.sh

Une sortie vide signifie que les deux listes sont égales. Expected differences: for an Organization template the YAML also lists organizations:ListRoots et organizations:DescribeOrganization (used by a helper function that Option A replaces with a Terraform lookup). Pour l'option B, les politiques de compte membre apparaissent dans le plan du module, comparez-les donc séparément avec le modèle de membre dans YAML. Toute autre autorisation apparaissant d'un côté signifie uniquement que Terraform est obsolète ou que vous avez coché différentes fonctionnalités.

Also compare the Billing export columns: they live in local.cur_columns dans main.tf and must equal the SELECT list in the template's QueryStatement.

FAQ

Pourquoi Terraform utilise-t-il us-east-1 ?
La ressource d’exportation Coût et utilisation existe uniquement dans us-east-1. Le rôle et le bucket y sont également créés, exactement comme le modèle CloudFormation.
Puis-je utiliser le modèle CloudFormation pour AWS et Terraform pour Azure et Google Cloud ?
Oui. Chaque cloud est indépendant. Voir Azure et Google Cloud.
Le plan échoue avec un type de ressource inconnu aws_bcmdataexports_export.
Votre fournisseur AWS est trop ancien. Exécutez terraform init -upgrade avec la contrainte ~> 5.0.
La stratégie du compartiment S3 est rejetée.
La configuration applique le bloc d'accès public avant la stratégie pour éviter un problème de synchronisation connu. Si vous divisez les fichiers, conservez cette dépendance.
Comment puis-je le supprimer ?
Remove the connection in CostGlass, empty the bucket, then run terraform destroy. Voir Connectez AWS en supprimant l'accès.

Guides associés