Usar Terraform con OtterStorage
Provisiona y versiona tus buckets de OtterStorage como código usando el provider AWS apuntando al endpoint S3.
OtterStorage es compatible con la API S3, así que puedes gestionar tus buckets con el provider aws oficial de Terraform sin herramientas extra. Solo necesitas redirigir el endpoint S3 al de OtterStorage y desactivar algunas validaciones específicas de AWS. Esta guía muestra un main.tf completo para crear un bucket con versionado y reglas de ciclo de vida.
Requisitos previos
- Terraform 1.0 o superior instalado.
- El provider
hashicorp/awsversión 5.x. - Una access key y una secret key de un bucket de OtterStorage. Consulta cómo generarlas en la documentación.
Datos de conexión que usaremos en los ejemplos:
- Endpoint S3:
https://s3.otterstorage.io - Región:
eu-mad
Configurar el provider
El provider aws apunta por defecto a los endpoints de Amazon. Para usar OtterStorage hay que sobrescribir el endpoint de S3 y desactivar las comprobaciones que el provider haría contra los servicios de AWS (validación de credenciales, de región y resolución del account ID), ya que no existen fuera de AWS.
También activamos s3_use_path_style = true: OtterStorage direcciona los buckets por ruta (https://s3.otterstorage.io/mi-bucket) en lugar de por subdominio virtual, lo que evita problemas de DNS y de certificados.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
access_key = var.otter_access_key
secret_key = var.otter_secret_key
region = "eu-mad"
# OtterStorage no es AWS: desactivamos las validaciones específicas de AWS.
skip_credentials_validation = true
skip_region_validation = true
skip_requesting_account_id = true
# Direccionamiento por ruta y endpoint de OtterStorage.
s3_use_path_style = true
endpoints {
s3 = "https://s3.otterstorage.io"
}
}
Variables para las credenciales
No escribas nunca las claves directamente en el código. Decláralas como variables sensibles y pásalas por entorno o por un fichero .tfvars que no subas al control de versiones.
# variables.tf
variable "otter_access_key" {
description = "Access key del bucket de OtterStorage"
type = string
sensitive = true
}
variable "otter_secret_key" {
description = "Secret key del bucket de OtterStorage"
type = string
sensitive = true
}
Puedes suministrar los valores mediante variables de entorno, que Terraform reconoce con el prefijo TF_VAR_:
export TF_VAR_otter_access_key="TU_ACCESS_KEY"
export TF_VAR_otter_secret_key="TU_SECRET_KEY"
Crear un bucket
El recurso aws_s3_bucket crea el bucket. El nombre debe ser único dentro de tu cuenta de OtterStorage.
# main.tf
resource "aws_s3_bucket" "backups" {
bucket = "easydatahost-backups"
}
Activar el versionado
El versionado se gestiona con un recurso aparte, aws_s3_bucket_versioning. Con él, cada sobrescritura o borrado conserva las versiones anteriores del objeto.
resource "aws_s3_bucket_versioning" "backups" {
bucket = aws_s3_bucket.backups.id
versioning_configuration {
status = "Enabled"
}
}
Reglas de ciclo de vida
Con aws_s3_bucket_lifecycle_configuration defines reglas para caducar objetos o versiones antiguas automáticamente. En OtterStorage no se cobra por peticiones ni por borrados, así que puedes establecer políticas de limpieza agresivas sin coste adicional por las operaciones de expiración.
resource "aws_s3_bucket_lifecycle_configuration" "backups" {
bucket = aws_s3_bucket.backups.id
# El versionado debe estar configurado antes de aplicar reglas
# sobre versiones no actuales.
depends_on = [aws_s3_bucket_versioning.backups]
rule {
id = "expirar-versiones-antiguas"
status = "Enabled"
filter {
prefix = "snapshots/"
}
# Borra el objeto actual a los 90 días.
expiration {
days = 90
}
# Borra versiones no actuales a los 30 días.
noncurrent_version_expiration {
noncurrent_days = 30
}
}
}
main.tf completo
Reuniendo todo, este es un proyecto mínimo y funcional. Puedes dejarlo en un único main.tf o repartirlo entre providers.tf, variables.tf y main.tf.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
access_key = var.otter_access_key
secret_key = var.otter_secret_key
region = "eu-mad"
skip_credentials_validation = true
skip_region_validation = true
skip_requesting_account_id = true
s3_use_path_style = true
endpoints {
s3 = "https://s3.otterstorage.io"
}
}
variable "otter_access_key" {
type = string
sensitive = true
}
variable "otter_secret_key" {
type = string
sensitive = true
}
resource "aws_s3_bucket" "backups" {
bucket = "easydatahost-backups"
}
resource "aws_s3_bucket_versioning" "backups" {
bucket = aws_s3_bucket.backups.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_lifecycle_configuration" "backups" {
bucket = aws_s3_bucket.backups.id
depends_on = [aws_s3_bucket_versioning.backups]
rule {
id = "expirar-versiones-antiguas"
status = "Enabled"
filter {
prefix = "snapshots/"
}
expiration {
days = 90
}
noncurrent_version_expiration {
noncurrent_days = 30
}
}
}
Inicializar y aplicar
Una vez listos los ficheros y exportadas las credenciales, ejecuta el flujo habitual de Terraform:
# Descarga el provider y prepara el directorio de trabajo.
terraform init
# Muestra los cambios que se van a aplicar sin tocar nada.
terraform plan
# Crea los recursos en OtterStorage.
terraform apply
Terraform mostrará el plan y pedirá confirmación antes de aplicar. Para destruir lo creado, usa terraform destroy. Recuerda que el estado (terraform.tfstate) contiene datos sensibles: guárdalo en un backend remoto o protégelo adecuadamente.
Consejos
- Mantén
s3_use_path_style = true: es la configuración recomendada para OtterStorage. - Si gestionas varios buckets con claves distintas, usa varios bloques
provider "aws"conaliasy referéncialos en cada recurso. - Como no facturamos peticiones ni borrados, las reglas de ciclo de vida y las operaciones de limpieza no añaden coste alguno.
- Para más detalles sobre claves, regiones y límites, revisa la documentación.
¿Listo para probarlo?
Crea tu cuenta y obtén tus claves en minutos.