Conecte AWS con Terraform en lugar de CloudFormation

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

Conecte AWS con Terraform en lugar de CloudFormation

Cree la misma función de IAM, depósito S3 y exportación de costo y uso que crea la plantilla del asistente CostGlass, pero como Terraform puede revisar y mantener el control de versiones.

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 resumen
  • CostGlass genera una plantilla de CloudFormation para AWS. No genera Terraform. Esta página ofrece un equivalente de Terraform escrito a mano.
  • Aún inicia el asistente de AWS en CostGlass, porque crea su conexión, su ID externo y su ID de cuenta CostGlass.
  • Ningún secreto está codificado: el ID de la cuenta de CostGlass y el ID externo son variables que usted completa.
  • Luego pega las salidas de RoleArn y BucketName en el asistente, exactamente como con CloudFormation.
  • Debido a que se mantiene manualmente, compare sus permisos con la plantilla del asistente antes de realizar la solicitud. A continuación se muestra un script de comparación.
Equivalente mantenido manualmente
La plantilla de CloudFormation que genera el asistente es la fuente de la verdad. This Terraform matches it as of this guide's publication (checked with terraform validate on AWS provider 5.100). Si CostGlass agrega un permiso a la plantilla más adelante, esta página puede retrasarse. Realice siempre la comparación en la última sección antes de presentar la solicitud.
Antes de empezar
  • Terraform 1.5 o posterior y proveedor de AWS hashicorp/aws versión ~> 5.0. El recurso de exportación (aws_bcmdataexports_export) necesita una versión 5.x que lo incluya; Si init dice que el tipo de recurso es desconocido, ejecute terraform init -upgrade.
  • Las credenciales de AWS para la cuenta que paga la factura (la cuenta de administración de una organización), permitieron crear roles de IAM, depósitos de S3 y exportaciones de datos de facturación.
  • El asistente de CostGlass se abre en el paso Implementar (que se explica a continuación).

Obtenga sus dos valores de CostGlass

Terraform necesita dos valores que pertenezcan a su conexión. Nunca los escribas de memoria ni los compartas en el chat.

1
Iniciar el asistente
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
Copie la identificación externa
On Deploy the CloudFormation template it is shown as External ID (pre-filled in the template). This is the value for external_id.
3
Copie el ID de la cuenta CostGlass
In the template preview (or in the file from Download) find the parameter CostoGlassAccountId and copy its Predeterminado value, a 12-digit number. This is the value for costglass_account_id.
4
Mantener el asistente abierto
Do not click "I have deployed it" until Terraform has finished. No inicie una conexión diferente, porque eso producirá una ID externa diferente.
Importante
Marque las mismas funciones en el asistente que habilita en Terraform. CostGlass records the wizard's selection, and shows it on the account card.

cuenta única

Crea una carpeta con estos archivos. Todo se aplica en nosotros-este-1, como la plantilla de CloudFormation.

versiones.tf
variables.tf
principal.tf
salidas.tf
terraform.tfvars (ejemplo, no confirme el real)

variables

variablesque hacePredeterminado
costglass_account_idLa cuenta CostGlass AWS permitió asumir el rol.Ninguno. Requerido.
external_idYour connection's External ID. Marked sensitive.Ninguno. Requerido.
bucket_name_prefixEl depósito se llama <prefijo>-<su ID de cuenta>.costglass-cur-exports
export_nameNombre de la exportación de Costo y Uso.CostoGlassCURExportar
s3_prefixCarpeta en el cubo.cur
enable_instance_schedulerAgrega los únicos permisos de escritura (iniciar, detener, escalar).FALSO
enable_rightsizingAgrega métricas de CloudWatch y lecturas de Compute Optimizer.FALSO
enable_uptime_monitoringAgrega verificación de estado, alarma y lecturas de salud del objetivo.FALSO
Consejo
Pass the External ID with an environment variable instead of a file: export TF_VAR_external_id='...'. El valor también se almacena en el estado Terraform, así que proteja su archivo de estado como una contraseña.

Ejecútelo y finalice en CostGlass

1
Inicializar
Run terraform init.
2
Plan
Run terraform plan and read it. Debería ver el rol, sus políticas, el depósito y su configuración, y la exportación. No se ha creado nada todavía.
3
Aplicar
Run terraform apply y confirmar. When it finishes it prints rolArn, Nombre del depósito y ExportArn.
4
De vuelta en el asistente
Click I have deployed it. Paste rolArn into Role ARN (Outputs: RoleArn) and Nombre del depósito into S3 bucket (Outputs: BucketName). Leave Prefix as canalla/ (change it to match s3_prefix, with a trailing slash, if you changed that) and Region as nosotros-este-1.
5
Verificar
Click Verify & connect. A partir de aquí todo es idéntico al Guía de CloudFormation, incluida la espera de hasta 24 horas para la primera exportación.

Organización AWS

In the wizard choose AWS Organization. Ejecute Terraform de cuenta única arriba en cuenta de gestión: it creates the bucket, the export and the role CostGlassCURReader. Member accounts also need the role CostoGlassReadOnly. Elija una de dos formas.

Opción A: un StackSet (el más cercano a la plantilla del asistente)

Agregue este archivo a la misma carpeta. Crea un StackSet administrado por el servicio que implementa la función de miembro en cada cuenta de miembro, ahora y cuando las cuentas se unan más adelante. Primero cumpla con el requisito previo único: en la cuenta de administración, CloudFormation → StackSets → Habilite el acceso confiable con AWS Organizations.

conjunto de pilas.tf

Opción B: una llamada al módulo Terraform por cuenta de miembro

Úselo si desea que Terraform sea propietario de los roles o si solo conecta algunas cuentas. Terraform no puede crear proveedores en un bucle, por lo que cada cuenta necesita su propio alias de proveedor y bloque de módulo. The management account assumes OrganizationAccountAccessRole, which AWS Organizations creates in accounts it created; accounts you invited need an equivalent role.

miembros.tf
módulos/miembro_rol/main.tf

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

Nota
Utilice la opción A o la opción B, no ambas. The management account itself uses CostGlassCURReader only, the same as the CloudFormation template.

Compruebe que coincida con el asistente

Download the YAML from the wizard (Download), save it next to your Terraform, then compare the permission lists. Primero marque las mismas características en ambos lados.

comparar.sh

La salida vacía significa que las dos listas son iguales. Expected differences: for an Organization template the YAML also lists organizations:ListRoots y organizations:DescribeOrganization (used by a helper function that Option A replaces with a Terraform lookup). Para la opción B, las políticas de cuentas de miembros aparecen en el plan del módulo, así que compárelas por separado con la plantilla de miembros dentro de YAML. Cualquier otro permiso que aparezca en un lado solo significa que Terraform está desactualizado o que marcó diferentes funciones.

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

FAQ

¿Por qué Terraform usa us-east-1?
El recurso de exportación Costo y uso solo existe en us-east-1. El rol y el depósito también se crean allí, exactamente como la plantilla de CloudFormation.
¿Puedo utilizar la plantilla CloudFormation para AWS y Terraform para Azure y Google Cloud?
Sí. Cada nube es independiente. Ver Azure y Google Cloud.
El plan falla con un tipo de recurso desconocido aws_bcmdataexports_export.
Su proveedor de AWS es demasiado antiguo. Ejecute terraform init -upgrade con la restricción ~> 5.0.
La política del depósito S3 es rechazada.
La configuración aplica el bloqueo de acceso público antes de la política para evitar un problema de sincronización conocido. Si divide los archivos, mantenga esa dependencia.
¿Cómo lo elimino?
Remove the connection in CostGlass, empty the bucket, then run terraform destroy. Ver Conecte AWS y elimine el acceso.

Guías relacionadas