👋¡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! 💯
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
Estructura repositorio que contiene el terraform y la pipeline
apply-terraform/
├── .github/
│ └── workflows/
│ └── terraform-deploy.yml
└── backend.tf
└── main.tf
└── provider.tf
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
- 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 }}
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
}
- backend.tf: definimos nuestro backend para el estado
terraform{
backend "s3" {
bucket = "yourbuckets3"
encrypt = true
region = "eu-west-1"
key = "terraform.tfstate"
}
}
- 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"
}
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 }}
En este caso muy concreto el template nos solicitará los dos parametros que queremos:
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!
Top comments (0)