Ir al contenido

Almacenamiento en la Nube

Acceder a almacenamiento de objetos compatible con S3. Cargar, descargar, listar y gestionar archivos con soporte de URL prefirmadas.

Para configuración de almacenamiento, consulte Almacenamiento en la Nube.

local cloudstorage = require("cloudstorage")

Obtener un recurso de almacenamiento en la nube por ID de registro:

local storage, err = cloudstorage.get("app.infra:files")
if err then
return nil, err
end
storage:upload_object("data/file.txt", "content")
storage:release()
ParámetroTipoDescripción
idstringID de recurso de almacenamiento

Devuelve: Storage, error

Cargar contenido desde string o archivo:

local storage = cloudstorage.get("app.infra:files")
-- Cargar contenido string
local ok, err = storage:upload_object("reports/daily.json", json.encode({
date = "2024-01-15",
total = 1234
}))
-- Cargar desde archivo
local fs = require("fs")
local vol = fs.get("app:data")
local file = vol:open("/large-file.bin", "r")
storage:upload_object("backups/large-file.bin", file)
file:close()
storage:release()
ParámetroTipoDescripción
keystringClave/ruta del objeto
contentstring o ReaderContenido como string o lector de archivo
optionstableMetadatos opcionales y opciones de escritura condicional

Devuelve: boolean, error

Adjunta metadatos o protege la escritura con una tabla de opciones:

storage:upload_object("reports/daily.json", body, {
content_type = "application/json",
cache_control = "max-age=3600",
metadata = { owner = "team-a", run_id = "1234" }, -- almacenado como x-amz-meta-*
only_if_absent = true -- falla si la clave ya existe
})
OpciónTipoDescripción
content_typestringTipo MIME
cache_controlstringCabecera Cache-Control
content_dispositionstringCabecera Content-Disposition
content_encodingstringCabecera Content-Encoding
metadatatableMetadatos de usuario (claves/valores string), almacenados como x-amz-meta-*
headerstableCabeceras de solicitud adicionales (claves/valores string)
if_matchstringEscribir solo si el ETag actual del objeto coincide
if_none_matchstringEscribir solo si ningún objeto coincide con el ETag ("*" significa cualquiera)
only_if_absentbooleanEscribir solo si la clave no existe (alias de if_none_match = "*")

Una escritura condicional que falla su precondición devuelve un error precondition_failed.

Descargar un objeto a un escritor de archivo:

local storage = cloudstorage.get("app.infra:files")
local fs = require("fs")
local vol = fs.get("app:temp")
local file = vol:open("/downloaded.json", "w")
local ok, err = storage:download_object("reports/daily.json", file)
file:close()
-- Descargar contenido parcial (primeros 1KB)
local partial = vol:open("/partial.bin", "w")
storage:download_object("backups/large-file.bin", partial, {
range = "bytes=0-1023"
})
partial:close()
storage:release()
ParámetroTipoDescripción
keystringClave del objeto a descargar
writerWriterEscritor de archivo destino
options.rangestringRango de bytes (ej., “bytes=0-1023”)
options.if_matchstringDescargar solo si el ETag del objeto coincide
options.if_none_matchstringDescargar solo si el ETag no coincide

Devuelve: boolean, error

Una precondición fallida (if_match/if_none_match) devuelve un error precondition_failed.

Listar objetos con filtro de prefijo opcional:

local storage = cloudstorage.get("app.infra:files")
local result, err = storage:list_objects({
prefix = "reports/2024/",
max_keys = 100
})
for _, obj in ipairs(result.objects) do
print(obj.key, obj.size, obj.etag)
end
-- Paginar a traves de resultados grandes
local token = nil
repeat
local result = storage:list_objects({
prefix = "logs/",
max_keys = 1000,
continuation_token = token
})
for _, obj in ipairs(result.objects) do
process(obj)
end
token = result.next_continuation_token
until not result.is_truncated
storage:release()
ParámetroTipoDescripción
options.prefixstringFiltrar por prefijo de clave
options.max_keysintegerObjetos maximos a devolver
options.continuation_tokenstringToken de paginacion
options.include_ownerbooleanIncluir el owner de cada objeto (id, display_name)
options.include_versionsbooleanListar versiones de objetos; cada elemento incluye version_id

Devuelve: table, error

El resultado contiene objects, is_truncated, next_continuation_token. Cada objeto tiene key, size, etag, storage_class, y opcionalmente last_modified, version_id y owner.

En los resultados de listado content_type siempre está vacío — las operaciones de listado de S3 no lo devuelven. Usa head_object para leer el tipo de contenido y los metadatos de un objeto.

Obtén los metadatos de un solo objeto sin descargar su cuerpo:

local storage = cloudstorage.get("app.infra:files")
local meta, err = storage:head_object("reports/daily.json")
if err then
return nil, err
end
print(meta.size, meta.etag, meta.content_type)
for k, v in pairs(meta.metadata) do
print("meta", k, v)
end
storage:release()
ParámetroTipoDescripción
keystringClave del objeto

Devuelve: table, error

Campos del resultado:

CampoTipoDescripción
sizeintegerTamaño del objeto en bytes
etagstringEntity tag
content_typestringTipo MIME
cache_controlstringCabecera Cache-Control
content_dispositionstringCabecera Content-Disposition
content_encodingstringCabecera Content-Encoding
storage_classstringClase de almacenamiento
version_idstringID de versión (presente cuando el versionado está habilitado)
last_modifiedintegerHora de última modificación (segundos Unix)
metadatatableMetadatos de usuario (x-amz-meta-*)
headerstableCabeceras de respuesta crudas (claves en minúsculas)

Un objeto inexistente devuelve un error not_found.

Eliminar multiples objetos:

local storage = cloudstorage.get("app.infra:files")
storage:delete_objects({
"temp/file1.txt",
"temp/file2.txt",
"temp/file3.txt"
})
storage:release()
ParámetroTipoDescripción
keysstring[]Array de claves de objeto a eliminar

Devuelve: boolean, error

Crear una URL temporal que permite descargar un objeto sin credenciales. Util para compartir archivos con usuarios externos o servir contenido a traves de su aplicación.

local storage, err = cloudstorage.get("app.infra:files")
if err then
return nil, err
end
local url, err = storage:presigned_get_url("reports/quarterly.pdf", {
expiration = 3600
})
storage:release()
if err then
return nil, err
end
-- Devolver URL al cliente para descarga directa
return {download_url = url}
ParámetroTipoDescripción
keystringClave del objeto
options.expirationintegerSegundos hasta que expire la URL (predeterminado: 3600)

Devuelve: string, error

Crear una URL temporal que permite cargar un objeto sin credenciales. Permite a los clientes cargar archivos directamente al almacenamiento sin pasar por su servidor.

local storage, err = cloudstorage.get("app.infra:files")
if err then
return nil, err
end
local url, err = storage:presigned_put_url("uploads/user-123/avatar.jpg", {
expiration = 600,
content_type = "image/jpeg",
content_length = 1024 * 1024
})
storage:release()
if err then
return nil, err
end
-- Devolver URL al cliente para carga directa
return {upload_url = url}
ParámetroTipoDescripción
keystringClave del objeto
options.expirationintegerSegundos hasta que expire la URL (predeterminado: 3600)
options.content_typestringTipo de contenido requerido para carga
options.content_lengthintegerTamano maximo de carga en bytes

Devuelve: string, error

MétodoDevuelveDescripción
upload_object(key, content, opts?)boolean, errorCargar contenido string o archivo
download_object(key, writer, opts?)boolean, errorDescargar a escritor de archivo
head_object(key)table, errorObtener metadatos del objeto
list_objects(opts?)table, errorListar objetos con filtro de prefijo
delete_objects(keys)boolean, errorEliminar multiples objetos
presigned_get_url(key, opts?)string, errorGenerar URL de descarga temporal
presigned_put_url(key, opts?)string, errorGenerar URL de carga temporal
release()booleanLiberar recurso de almacenamiento

Las operaciones de almacenamiento en la nube estan sujetas a evaluacion de politica de seguridad.

AccionRecursoDescripción
cloudstorage.getID de StorageAdquirir un recurso de almacenamiento
CondiciónTipoReintentable
ID de recurso vacioerrors.INVALIDno
Recurso no encontradoerrors.NOT_FOUNDno
No es recurso de almacenamiento en la nubeerrors.INVALIDno
Almacenamiento liberadoerrors.INVALIDno
Clave vaciaerrors.INVALIDno
Contenido nilerrors.INVALIDno
Writer no validoerrors.INVALIDno
Objeto no encontradoerrors.NOT_FOUNDno
Precondición condicional fallidaerrors.CONFLICTno
Permiso denegadoerrors.PERMISSION_DENIEDno
Operación fallidaerrors.INTERNALno

Consulte Manejo de Errores para trabajar con errores.