En este tutorial, profundizaremos en la creación de módulos Terraform para gestionar buckets S3 en Amazon Web Services (AWS). Aunque la utilización de módulos existentes es esencial, aprender a crear los propios proporciona flexibilidad, reutilización y composición en las configuraciones de Terraform.
Estructura del Módulo
Un módulo Terraform se compone de varios archivos, siendo los principales:
- main.tf: Contiene la configuración principal del módulo.
- variables.tf: Define las variables utilizadas en el módulo.
- outputs.tf: Contiene las salidas del módulo, proporcionando información a otras partes de la configuración.
- README.md y LICENSE: Documentación y licencia del módulo para su distribución.
Estos archivos permiten una estructura organizada y comprensible. La configuración del módulo que crearemos se centrará en gestionar buckets S3 para alojar sitios web estáticos en AWS.
Configuración del Módulo
Dentro del archivo main.tf, definiremos los recursos necesarios para el bucket S3, configurándolo para alojar un sitio web estático de manera pública:
resource "aws_s3_bucket" "s3_bucket" {
bucket = var.bucket_name
tags = var.tags
}
resource "aws_s3_bucket_website_configuration" "s3_bucket" {
bucket = aws_s3_bucket.s3_bucket.id
index_document {
suffix = "index.html"
}
error_document {
key = "error.html"
}
}
resource "aws_s3_bucket_acl" "s3_bucket" {
bucket = aws_s3_bucket.s3_bucket.id
acl = "public-read"
}
resource "aws_s3_bucket_policy" "s3_bucket" {
bucket = aws_s3_bucket.s3_bucket.id
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Sid = "PublicReadGetObject",
Effect = "Allow",
Principal = "*",
Action = "s3:GetObject",
Resource = [
aws_s3_bucket.s3_bucket.arn,
"${aws_s3_bucket.s3_bucket.arn}/*",
],
},
],
})
}
Este código establece un bucket S3 público con configuración para un sitio web estático.
Variables del Módulo
Dentro de variables.tf, definimos las variables necesarias:
variable "bucket_name" {
description = "Nombre único del bucket S3."
type = string
}
variable "tags" {
description = "Etiquetas para el bucket."
type = map(string)
default = {}
}
Estas variables permiten la personalización del módulo al ser utilizado.
Salidas del Módulo
Dentro de outputs.tf, especificamos las salidas del módulo:
output "arn" {
description = "ARN del bucket"
value = aws_s3_bucket.s3_bucket.arn
}
output "name" {
description = "Nombre (ID) del bucket"
value = aws_s3_bucket.s3_bucket.id
}
output "domain" {
description = "Nombre de dominio del bucket"
value = aws_s3_bucket_website_configuration.s3_bucket.website_domain
}
Estas salidas proporcionan información útil sobre el bucket creado.
Integración del Módulo en la Configuración Principal
Dentro del archivo principal de la configuración, hacemos referencia al nuevo módulo:
module "website_s3_bucket" {
source = "./modules/aws-s3-static-website-bucket"
bucket_name = "<NOMBRE_UNICO_DEL_BUCKET>"
tags = {
Terraform = "true"
Environment = "dev"
}
}
Es esencial reemplazar <NOMBRE_UNICO_DEL_BUCKET>
con un nombre único para el bucket S3, ya que los nombres deben ser globales.
Conclusiones
En este tutorial, hemos creado un módulo Terraform para gestionar buckets S3 en AWS. Al seguir buenas prácticas, hemos estructurado el módulo de manera clara y proporcionado flexibilidad mediante variables y salidas. Esta modularidad facilita la gestión de recursos en Terraform, mejorando la reutilización y la colaboración en proyectos de infraestructura.
Recuerda que al utilizar este módulo, es crucial ajustar las variables según tus necesidades específicas. ¡Esperamos que este tutorial te haya sido útil en tu viaje con Terraform!