Reglas de ciclo de vida (Lifecycle)
Automatiza la expiración de objetos, la limpieza de versiones antiguas y el aborto de subidas multiparte incompletas en tus buckets de OtterStorage.
Las reglas de ciclo de vida (lifecycle) permiten que OtterStorage borre objetos, versiones no actuales y subidas multiparte incompletas de forma automática, según su edad y su prefijo. Con la API compatible con S3 defines la configuración una sola vez y OtterStorage se encarga de aplicarla cada día, sin que tengas que ejecutar limpiezas manuales. En OtterStorage no cobramos por peticiones ni por borrados, así que estas reglas solo te ahorran almacenamiento, nunca añaden coste por las operaciones de eliminación.
Cómo funciona
Una configuración de lifecycle es un conjunto de reglas. Cada regla tiene un identificador, un estado (Enabled o Disabled), un filtro que decide a qué objetos se aplica (normalmente por prefijo) y una o varias acciones. OtterStorage evalúa las reglas periódicamente y ejecuta las acciones sobre los objetos que cumplen las condiciones.
Las acciones más habituales son:
- Expiration: expira (borra) objetos cuando superan una edad determinada en días.
- NoncurrentVersionExpiration: expira versiones no actuales (las versiones antiguas que deja el versionado al sobrescribir o borrar un objeto).
- AbortIncompleteMultipartUpload: aborta subidas multiparte que nunca llegaron a completarse y libera el espacio de sus fragmentos.
La edad se cuenta siempre en días completos desde la creación del objeto (o desde que la versión dejó de ser la actual). Las acciones se ejecutan de forma asíncrona, por lo que un objeto puede tardar unas horas en desaparecer tras cumplir su condición.
Expiración de objetos por prefijo y edad
El caso más común: borrar automáticamente el contenido de una carpeta lógica pasados unos días. El prefijo es la parte inicial de la clave del objeto (por ejemplo tmp/ o logs/2024/), y Expiration.Days indica los días tras los cuales el objeto expira.
Esta regla expira todo lo que cuelgue de tmp/ a los 30 días:
{
"Rules": [
{
"ID": "expirar-tmp-30d",
"Status": "Enabled",
"Filter": { "Prefix": "tmp/" },
"Expiration": { "Days": 30 }
}
]
}
Si quieres aplicar la regla a todo el bucket, usa un prefijo vacío con "Filter": { "Prefix": "" }. Para limitar la regla a objetos por encima o por debajo de cierto tamaño, puedes añadir ObjectSizeGreaterThan u ObjectSizeLessThan dentro del filtro.
Expiración de versiones no actuales
Si el bucket tiene el versionado activado, cada vez que sobrescribes o borras un objeto se conserva la versión anterior como versión no actual. Estas versiones siguen ocupando almacenamiento. Con NoncurrentVersionExpiration defines cuántos días quieres conservarlas antes de borrarlas.
Esta regla limpia las versiones no actuales a los 90 días de dejar de ser la versión vigente:
{
"Rules": [
{
"ID": "limpiar-versiones-90d",
"Status": "Enabled",
"Filter": { "Prefix": "" },
"NoncurrentVersionExpiration": { "NoncurrentDays": 90 }
}
]
}
El campo NoncurrentDays cuenta desde el momento en que la versión deja de ser la actual, no desde que se creó. Opcionalmente puedes añadir NewerNoncurrentVersions para conservar siempre las N versiones más recientes y expirar solo las que queden por debajo de ese umbral; por ejemplo, conservar las 3 últimas y borrar el resto pasados 90 días.
Aborto de subidas multiparte incompletas
Las subidas grandes se hacen en varias partes (multipart upload). Si una subida se interrumpe y nunca se completa ni se aborta, sus fragmentos quedan almacenados y ocupan espacio sin formar ningún objeto visible. La acción AbortIncompleteMultipartUpload los limpia automáticamente.
Esta regla aborta cualquier subida multiparte que lleve más de 7 días sin completarse:
{
"Rules": [
{
"ID": "abortar-multipart-7d",
"Status": "Enabled",
"Filter": { "Prefix": "" },
"AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 7 }
}
]
}
Es una de las reglas más rentables: recupera espacio que de otro modo se acumularía de forma silenciosa. Te recomendamos incluirla en prácticamente todos los buckets.
Configuración completa de ejemplo
Lo normal es combinar varias acciones en una sola configuración. El siguiente lifecycle.json reúne los tres ejemplos anteriores: expira tmp/ a 30 días, limpia versiones no actuales a 90 días y aborta multipart incompletos a 7 días.
{
"Rules": [
{
"ID": "expirar-tmp-30d",
"Status": "Enabled",
"Filter": { "Prefix": "tmp/" },
"Expiration": { "Days": 30 }
},
{
"ID": "limpiar-versiones-90d",
"Status": "Enabled",
"Filter": { "Prefix": "" },
"NoncurrentVersionExpiration": { "NoncurrentDays": 90 }
},
{
"ID": "abortar-multipart-7d",
"Status": "Enabled",
"Filter": { "Prefix": "" },
"AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 7 }
}
]
}
Cada regla es independiente: puedes combinar acciones distintas en una misma regla (por ejemplo Expiration y AbortIncompleteMultipartUpload juntas si comparten filtro) o mantenerlas separadas, como en este ejemplo, para que sean más fáciles de leer y mantener.
Aplicar la configuración con la AWS CLI
Guarda el JSON anterior en un archivo lifecycle.json y aplícalo con put-bucket-lifecycle-configuration. Asegúrate de tener configurado el endpoint de OtterStorage; consulta la guía de la AWS CLI para los detalles de credenciales y perfil.
aws s3api put-bucket-lifecycle-configuration \
--endpoint-url https://s3.otterstorage.io \
--region eu-mad \
--bucket mi-bucket \
--lifecycle-configuration file://lifecycle.json
El comando no devuelve salida si tiene éxito: reemplaza por completo la configuración de lifecycle del bucket por la que envías. Para consultar la configuración activa en cualquier momento, usa get-bucket-lifecycle-configuration:
aws s3api get-bucket-lifecycle-configuration \
--endpoint-url https://s3.otterstorage.io \
--region eu-mad \
--bucket mi-bucket
La respuesta es el mismo JSON de reglas que aplicaste. Para eliminar todas las reglas de un bucket, usa delete-bucket-lifecycle con el mismo endpoint, región y bucket.
Buenas prácticas de coste
El lifecycle es la herramienta más directa para mantener el almacenamiento bajo control. Algunas recomendaciones:
- Aborta siempre los multipart incompletos. Una regla
AbortIncompleteMultipartUploada 7 días en todos los buckets evita que se acumulen fragmentos huérfanos invisibles. - Expira lo efímero por prefijo. Coloca lo temporal bajo prefijos como
tmp/,cache/ologs/y aplícales expiración corta. Una buena convención de nombres hace que las reglas sean triviales. - Limita el historial de versiones. Si usas versionado,
NoncurrentVersionExpirationevita que las versiones antiguas crezcan sin límite. Combínalo conNewerNoncurrentVersionspara conservar siempre unas pocas versiones recientes. - Empieza con
Disabledy comprueba. Si tienes dudas sobre el alcance de una regla, créala con"Status": "Disabled"o con plazos amplios, verifica qué objetos coinciden y luego ajústala. Recuerda que las expiraciones son irreversibles. - Revisa periódicamente. Usa
get-bucket-lifecycle-configurationpara auditar las reglas activas y eliminar las que ya no apliquen.
Como no cobramos por peticiones ni por borrados, el único factor de coste es el almacenamiento ocupado: cuanto antes expire lo que no necesitas, menos pagas. Para proteger buckets que no deben tocarse, consulta Legal Hold, que bloquea cualquier cambio de configuración de lifecycle mientras esté activo.
¿Listo para probarlo?
Crea tu cuenta y obtén tus claves en minutos.