🎵 Desplegando infraestructura en AWS desde Backstage 🎵

👋¡Estamos de vuelta! 👋 Después de algún otro tiempo desaparecidos y alguna que otra certificación en el bolsillo y algún que otro proyecto nuevo en mente. ¡Vamos a darle caña! 🚀

¿Cuántas veces hemos discutido sobre si la infraestructura debería gestionarse por un lado y la aplicación por otro, si todo en el mismo sitio, o en dos,tres, cuatro portales diferentes, hasta acabar volviéndote loco sin saber que usar. Vamos a simplificar las cosas y ver cómo podemos usar el mismo frontal que los desarrolladores para desplegar un “template” de Terraform recogiendo variables directamente desde allí. 🤯

En primer lugar me gustaría dar dos pinceladas sobre Backstage:

Si todavía no sabes que es, aún por todo lo que está siendo sonado, te estás perdiendo algo interesante. Backstage es una plataforma de desarrollo open-source creada por Spotify. Te permite hacer un montón de cosas diferentes, desde microservicios hasta documentación, e incluso gestionar infraestructura. En este post nos vamos a centrar en cómo usar Backstage para desplegar infraestructura en AWS con Terraform. ¡Al lio!

En este caso tal y cómo muchos ya sabéis, nosotros no somos desarrolladores al estilo, así que hemos necesitado alguna ayuda para poder configurar un backstage de TEST, ¡Y menuda ayuda! Aquí os dejamos una serie de tutoriales de [return(GIS)]-Gisela donde te explica una infinidad de cosas y os pueden ayudar con la configuración, personalización y despliegue de vuestro backstage. 💯¡Totalmente recomendado! 💯

Backstage – return(GIS)

En nuestro caso vamos a simplificar todo muchísimo para no extendernos una infinidad y asegurarnos de que realmente podemos lanzar nuestra infraestructura desde un portal como Backstage.

Estructura del Repositorio que contiene el template

s3-template/
├── terraform/
│ └── s3.yaml └── catalog-info.yaml 
Enter fullscreen mode Exit fullscreen mode

Estructura repositorio que contiene el terraform y la pipeline

apply-terraform/
├── .github/
│ └── workflows/
│ └── terraform-deploy.yml
└── backend.tf
└── main.tf
└── provider.tf
Enter fullscreen mode Exit fullscreen mode

Vamos a explicar ahora que contiene cada uno de estas configuraciones:

  • Catalog-info.yaml: Este archivo básicamente es un mapa para Backstage, le indica donde dónde encontrar nuestro template en Github. Lo subes al repositorio, lo importas a Backstage, ¡y a funcionar! ¡Ya tienes tu template disponible para seleccionar en backstage!
apiVersion: backstage.io/v1alpha1
kind: Location
metadata: name: s3-template-location description: Repositorio en GitHub para el template de creación de buckets S3 con Terraform annotations: backstage.io/managed-by: backstage
spec: targets: - terraform/s3.yaml 
Enter fullscreen mode Exit fullscreen mode
  • Template: Este template básicamente le dice a Backstage cómo crear un bucket S3. Los usuarios entrarán, rellenarán un par de campos y backstage se encarga de todo lo demás!
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata: name: s3-bucket-terraform title: S3 Bucket con Terraform description: Crea un bucket S3 utilizando Terraform
spec: owner: user:guest type: service parameters: - title: configurar bucket s3 required: - s3name - acl properties: s3name: title: s3name type: string description: Unique name of the component ui:autofocus: true ui:options: rows: 5 acl: title: acl type: string description: private ui:autofocus: true ui:options: rows: 5 steps: - id: github-action name: github-action action: github:actions:dispatch input: workflowId: terraform-deploy.yml repoUrl: 'github.com?repo=apply-terraform&owner=**YOURUSER**' branchOrTagName: "main" workflowInputs: s3name: ${{ parameters.s3name }} acl: ${{ parameters.acl }}
Enter fullscreen mode Exit fullscreen mode

Bien, ya tendríamos la parte de backstage pura y dura, vamos a darle uso con una prueba concreta. En este caso, vamos a utilizar un bucket S3 para la PoC. Necesitamos definir algunos archivos de Terraform y una pipeline que los depliegue usando las variables que recogemos. Para ello, crearemos los siguientes archivos en nuestro segundo repositorio: apply-terraform

  • main.tf: por simplificar pondremos la creación usando el siguiente código:
resource "aws_s3_bucket" "example" { bucket = var.s3name acl = var.acl
} variable "s3name" { type = string
} variable "acl" { type = string
} 
Enter fullscreen mode Exit fullscreen mode
  • backend.tf: definimos nuestro backend para el estado
terraform{ backend "s3" { bucket = "yourbuckets3" encrypt = true region = "eu-west-1" key = "terraform.tfstate" }
} 
Enter fullscreen mode Exit fullscreen mode
  • provider.tf: provider a utilizar
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } }
} # Configure the AWS Provider
provider "aws" { region = "eu-west-1"
}
Enter fullscreen mode Exit fullscreen mode

Y por último la pipeline, la cuál hace exactamente lo que necesitamos: recoge los inputs (s3name y acl) que le pasamos desde Backstage y luego usa Terraform para crear el S3 s3 en AWS. 💥¡Magia! 💥

name: Terraform pipeline on: workflow_dispatch: inputs: s3name: description: 'Name of s3 bucket' required: true acl: description: 'ACL' required: true
env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
jobs: apply_s3: runs-on: ubuntu-latest steps: - name: Checkout codigo uses: actions/checkout@v2 - name: Setup Terraform uses: hashicorp/setup-terraform@v1 - name: Terraform Init run: terraform init - name: Terraform apply run: terraform apply -auto-approve -var s3name=${{ github.event.inputs.s3name }} -var acl=${{ github.event.inputs.acl }}
Enter fullscreen mode

En este caso muy concreto el template nos solicitará los dos parametros que queremos:

Backstage variables

Pipeline

En esta PoC, como siempre, hemos ido por la vía rápida, pero es importante mencionar que solo hemos tocado un 1% de lo que Backstage puede ofrecer. Por ejemplo, no hemos integrado el registro de componentes en el catálogo de Backstage ni configurado pipelines CI/CD para monitorizar flujos directamente desde Backstage. Si quieres más información, te recomiendo que revises la documentación oficial de Backstage o le eches un vistazo a los videos mencionados anteriormente para llevar tu configuración de Backstage al siguiente nivel y personalizarlo a tu gusto.

Nosotros hemos usado la acción github:actions:dispatch, pero Backstage soporta un montón de otras acciones para poder hacer de tu infra algo mejor que lo que hace este post 🥵

Algunos links interesantes:

Documentación oficial
Actions
Generate Docs

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

¡Nos vemos en el siguiente!


Discover more from Coursity

Subscribe to get the latest posts sent to your email.

Leave a Comment

Your email address will not be published. Required fields are marked *

Discover more from Coursity

Subscribe now to keep reading and get access to the full archive.

Continue reading

Scroll to Top