AFT: tu asistente personal en tus cuentas de AWS 🥶
Tags: aws, controltower, awtwins, terraform
Published: 2024-03-15 09:05:28

En nuestro último post de #AwtwinS, hablamos sobre ECS, Service Connect y GitHub. En este, nos vamos a desviar un poco; volvemos al inicio de nuestros recursos: nuestras cuentas y su gestión.

🚀 Esta vez vamos a intentar que gestionar las cuentas de AWS no sea una pesadilla y, ¿por qué no?, intentar automatizar al máximo tanto el despliegue como la personalización de las mismas.🚀

¡Para ello contamos con nuestro nuevo amigo, AFT! ¿Quién dijo que administrar las cuentas no podía ser divertido? 🥵

Como siempre, adjuntamos documentación extensa por parte de nuestros colegas de AWS donde explican qué es AFT, pero dejamos un pequeño resumen.

[AFT-AWS](https://docs.aws.amazon.com/es_es/controltower/latest/userguide/aft-overview.html)

🫰 AFT te brinda una ventaja significativa de aprovisionamiento de cuentas basado en Terraform, al mismo tiempo que te permite gestionar las cuentas con AWS Control Tower. ¡Pim, Pam! 🫰

¿Qué nos permite AFT? Dejamos algunos beneficios a continuación:

- Enviar solicitudes de nuevas cuentas y actualizar cuentas en nuestro modelo GitOps (¿no suena eso familiar?).

- Almacenar los metadatos e historial en nuestro repositorio de código.

- Aplicar etiquetas a nivel de cuenta.

- Personalizar nuestras cuentas de forma individual o conjunta (hablaremos más sobre esto después).

- Registro de eventos de datos de CloudTrail.

- Inscribir nuestras cuentas en planes de soporte.

- Eliminar la VPC predeterminada en nuestras cuentas.

Después de explicar las funcionalidades de AFT, se nos plantean muchas situaciones, pero me gustaría explicar una en particular.

Después de entender lo que nos puede aportar, agreguemos más valor al tema común en muchos equipos (pregunta de examen):

Toda nuestra infraestructura está definida con Terraform y sus pipelines, pero ¿quién crea el bucket S3? Es como preguntarse: 🐔'¿Qué va primero, el huevo o la gallina?'🥚

Siempre hay diferentes soluciones disponibles, como Service Catalog, plantillas de CloudFormation o incluso hacerlo de forma manual. Pero, ¿qué tal si lo incluimos en nuestros Terraform y separamos el proceso de arranque de la cuenta de la infraestructura? ¡Interesante, ¿verdad?! ¡Pues manos a la obra!👷

**Requisitos:**
Debemos de tener una Landing Zone creada con Control Tower.

Para no extender mucho el post, dejamos documentación que podéis seguir. No obstante, es como rellenar un formulario :)

[Landing Zone](https://docs.aws.amazon.com/controltower/latest/userguide/quick-start.html)

Crearemos una nueva cuenta de gestión AFT y la asociaremos a una nueva Organizational Unit (OU) llamada AFT Management. Utilizaremos Control Tower para generar la cuenta.

![OU Organizations](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9de1nq8csdrffqisaac0.png)

Esto como bien dice la documentación de AWS, puede tardar alrededor de unos 30 minutos aproximadamente.

**Configuración AFT**

Cierto, a veces con tanta información puedes ir un poco perdido, así que vayamos paso a paso.

En primer lugar AFT necesita disponer de 4 repositorios extras para su correcto funcionamiento. Recomendamos hacer un FORK desde el siguiente enlace, ya que deben seguir una estructura específica de directorios & archivos para funcionar correctamente.

[Repos-AFT](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main/sources/aft-customizations-repos)

Una vez que tengamos los repositorios en nuestro GitHub, vamos a explicar qué hace cada uno de ellos. Toda la información está detallada en los archivos Readme.md de cada repositorio.

**aft-account-request**: Este repositorio contiene las solicitudes de cuenta para AFT. Aquí es donde deberás añadir las cuentas que te gustaría desplegar con AFT.

**aft-account-customizations**: Este repositorio contiene los 'helpers' de Terraform y API para personalizar las cuentas. La personalización de las cuentas puede estar definida en Terraform o en Python aprovechando los 'helpers' de la API.

**aft-account-provisioning-customizations**: AFT nos brinda la oportunidad de personalizar el aprovisionamiento de nuevas cuentas e integrarlo con los sistemas antes de personalizar estas cuentas.

**aft-global-customizations**: Este repositorio contiene los 'helpers' de Terraform y API para las personalizaciones globales. Esto se puede utilizar para personalizar todas las cuentas con recursos definidos. Al igual que antes, se puede aprovisionar con Terraform o Python.

¡Guay! Ya tenemos nuestros 4 repositorios que AFT  utilizará para el deploy de nuestras cuentas.

**Deploy AFT**
Una vez que hayamos creado nuestros repositorios, podemos proceder a desplegar AFT. Para ello, dejo otro ejemplo en el siguiente enlace:

[Repositorio Principal AFT](https://github.com/aws-ia/terraform-aws-control_tower_account_factory)

Como podemos observar en dicho repositorio, tenemos muchos ejemplos de cómo hacer la llamada a dicho módulo. En nuestro caso, como nos interesa trabajar con GitHub, utilizaremos el ejemplo github+tf_oss.

[Github+tf_oss](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/tree/main/examples/github%2Btf_oss)

**Que hace este módulo**? 

Configura la cuenta de Management AFT. Configura CodeStar para que cada vez que hagas un push en tu GitHub se lance la pipeline en CodePipeline, y configura los repositorios que AFT necesita para funcionar.

En primer lugar, comenzaremos realizando un terraform apply de nuestra llamada al módulo, modificando las variables con las ID de nuestras cuentas. Como hemos comentado en otras ocasiones, ¿podemos utilizar GitHub Actions y evitar el uso local? Luego sabemos lo que pasa... 🤫

👾Este deploy debe de ser en la cuenta de Control Tower👾

[Main.tf](https://github.com/aws-ia/terraform-aws-control_tower_account_factory/blob/main/examples/github%2Btf_oss/main.tf)

Recomendamos agregar estas líneas para no ocasionar gastos extras en vuestra PoC:

```

  aft_enable_vpc              = false
  aft_vpc_endpoints            = false
```

Una vez desplegado, deberemos de dirigirnos a nuestra cuenta de _**Control Tower**_ y otorgar permisos al Role de AFT:

![Service Catalog](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7v045dnq7d47cjq6mjii.png)

AWS Control Tower Account Factory Portfolio 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8hxlo63bjutgk52omgdl.png)

Le damos permisos al Role:
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ngyz9lqknjo2lcrmykpf.png)

**Configuración CodeStar**

De igual forma que explicamos con Apprunner, debemos aceptar la conexión pendiente en _Codebuild - Settings_ en nuestra cuenta AFT:

Deberemos de darle permisos a la app de Github para que pueda conectar con los repositorios que necesita AFT. 🙃(Up to you! nosotros solo damos permisos a los repositorios necesarios).

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iefsxnxbihgclu7r449i.png)

Una vez conectados, deberemos relanzar las pipelines que veremos en nuestro Codepipeline:

![Pipelines](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7tzoenwdawikl6bu7trt.png)

![Release](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k0194xaq7y47g1e9p621.png)

Ahora que tenemos configurado nuestro AFT, podemos empezar a jugar con él. En primer lugar, vamos a provisionar una nueva cuenta de TEST. Para ello, iremos a nuestro repositorio de Github (aft-account-request) y modificaremos el archivo main.tf en la ruta aft-account-request/terraform/main.tf, modificando las variables como en el siguiente ejemplo:

```
module "sandbox5" {
  source = "./modules/aft-account-request"
  control_tower_parameters = {
    AccountEmail              = "email"
    AccountName               = "sandbox-aft5"
    ManagedOrganizationalUnit = "Sandbox (ou-xxxxxxx) " 
    SSOUserEmail              = "email"
    SSOUserFirstName          = "Sandbox"
    SSOUserLastName           = "AFT"
  }

  account_tags = {
    "Learn Tutorial" = "AFT"
  }

  change_management_parameters = {
    change_requested_by = "alex"
    change_reason       = "Learn AWS Control Tower Account Factory for Terraform"
  }
  
  #custom_fields = {
  #  group = "non-prod"
  #}
  account_customizations_name = "testing"
}
```

¡Lanzamos nuestra pipeline haciendo un push y 💥!Podremos ver en Control Tower cómo empieza a aparecer nuestra nueva cuenta "sandbox-aft5" en la OU que hemos seleccionado! 🥳

😎Por otro lado, pongamos atención a esta línea? 🕶️

`account_customizations_name = "testing"`

¡Bien, aquí es donde tenemos más juego!Como bien sabemos, tenemos otro repositorio llamado **aft-customizations** donde ocurrirá la magia. 🫣 Que empiece el juego!🫣¿Y si queremos crear un bucket S3 para que sea creado en el momento de crear la cuenta? Pues vamos allá!

💢 Atención! 💢
Es de vital importancia seguir la estructura indicada en los repositorios para que funcione correctamente.En este caso,lo haremos siguiendo la siguiente estructura:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zb9qwoaykv0mgdelrrlj.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9rfu6ja5ntc79nzg9gmi.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mtno41qx9vzsgkxctuk1.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6crnq4triyq0bisok6ss.png)

Hacemos push a este repositorio y automáticamente se lanzará una nueva pipeline en nuestro CodeCommit, generando así nuestro Bucket S3 (podemos verlo en la cuenta de AFT).

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zps8ut8encm6un3lhe7a.png)

Y como no, si accedemos a nuestra cuenta final (sandbox5), veremos nuestro bucket S3.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x8ge9tarq3c85qamgzek.png)

Como hemos visto, podemos personalizar nuestras cuentas desde el inicio, lo que nos permite generar recursos en las cuentas indicando si queremos que se apliquen en todas, solo en las seleccionadas y, lo más importante, ¡usando Terraform! 🚀

Para más información dejamos un link:

[AFT](https://docs.aws.amazon.com/es_es/controltower/latest/userguide/taf-account-provisioning.html)

✌️ ¡Aviso Importante! Este post está creado con el propósito de compartir conocimientos y experiencias en el entorno de una Prueba de Concepto (PoC).

🚨¡Atención! 🚨 No fijar las versiones de Terraform como en la PoC puede causar graves problemas en tu entorno de producción. Recomendamos siempre indicar la versión del módulo usado y verificar las versiones de Terraform para no ocasionar ningún error.

🤑Por último, cabe señalar que aunque comenzamos experimentando con un bucket, ¡nos hemos vuelto locos probando otros servicios! Recomendamos también tener precaución con las configuraciones de AWS Config para evitar sorpresas desagradables 💸, al igual que con los recursos de networking.🤑

👋 Como siempre, esperamos recibir comentarios, issues y sugerencias para seguir mejorando! 🫵

PD: En los siguientes volvemos con EKS! 😱