Pular para o conteúdo

Cloud Storage

Acesse armazenamento de objetos compativel com S3. Upload, download, listagem e gerenciamento de arquivos com suporte a URLs pre-assinadas.

Para configuração de armazenamento, veja Cloud Storage.

local cloudstorage = require("cloudstorage")

Obter um recurso de cloud storage por ID do 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âmetroTipoDescrição
idstringID do recurso de armazenamento

Retorna: Storage, error

Upload de conteudo de string ou arquivo:

local storage = cloudstorage.get("app.infra:files")
-- Upload de conteudo string
local ok, err = storage:upload_object("reports/daily.json", json.encode({
date = "2024-01-15",
total = 1234
}))
-- Upload de arquivo
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âmetroTipoDescrição
keystringChave/caminho do objeto
contentstring ou ReaderConteudo como string ou file reader
optionstableMetadados opcionais e opções de escrita condicional

Retorna: boolean, error

Anexe metadados ou proteja a escrita com uma tabela de opções:

storage:upload_object("reports/daily.json", body, {
content_type = "application/json",
cache_control = "max-age=3600",
metadata = { owner = "team-a", run_id = "1234" }, -- armazenado como x-amz-meta-*
only_if_absent = true -- falha se a chave já existir
})
OpçãoTipoDescrição
content_typestringTipo MIME
cache_controlstringHeader Cache-Control
content_dispositionstringHeader Content-Disposition
content_encodingstringHeader Content-Encoding
metadatatableMetadados do usuário (chaves/valores string), armazenados como x-amz-meta-*
headerstableHeaders de requisição adicionais (chaves/valores string)
if_matchstringEscreve somente se o ETag atual do objeto corresponder
if_none_matchstringEscreve somente se nenhum objeto corresponder ao ETag ("*" significa qualquer)
only_if_absentbooleanEscreve somente se a chave não existir (alias para if_none_match = "*")

Uma escrita condicional que falha sua pré-condição retorna um erro precondition_failed.

Baixar um objeto para um file writer:

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()
-- Baixar conteudo parcial (primeiro 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âmetroTipoDescrição
keystringChave do objeto para baixar
writerWriterFile writer de destino
options.rangestringFaixa de bytes (ex: “bytes=0-1023”)
options.if_matchstringBaixa somente se o ETag do objeto corresponder
options.if_none_matchstringBaixa somente se o ETag não corresponder

Retorna: boolean, error

Uma pré-condição que falha (if_match/if_none_match) retorna um erro precondition_failed.

Listar objetos com filtragem opcional por prefixo:

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 através 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âmetroTipoDescrição
options.prefixstringFiltrar por prefixo de chave
options.max_keysintegerMaximo de objetos a retornar
options.continuation_tokenstringToken de paginação
options.include_ownerbooleanInclui o owner de cada objeto (id, display_name)
options.include_versionsbooleanLista versões dos objetos; cada item inclui version_id

Retorna: table, error

Resultado contem objects, is_truncated, next_continuation_token. Cada objeto tem key, size, etag, storage_class e, opcionalmente, last_modified, version_id e owner.

Em resultados de listagem o content_type é sempre vazio — operações de listagem do S3 não o retornam. Use head_object para ler o tipo de conteúdo e os metadados de um objeto.

Obtenha os metadados de um único objeto sem baixar seu corpo:

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âmetroTipoDescrição
keystringChave do objeto

Retorna: table, error

Campos do resultado:

CampoTipoDescrição
sizeintegerTamanho do objeto em bytes
etagstringEntity tag
content_typestringTipo MIME
cache_controlstringHeader Cache-Control
content_dispositionstringHeader Content-Disposition
content_encodingstringHeader Content-Encoding
storage_classstringClasse de armazenamento
version_idstringID da versão (presente quando o versionamento está habilitado)
last_modifiedintegerHorário da última modificação (segundos Unix)
metadatatableMetadados do usuário (x-amz-meta-*)
headerstableHeaders brutos da resposta (chaves em minúsculas)

Um objeto inexistente retorna um erro not_found.

Remover multiplos objetos:

local storage = cloudstorage.get("app.infra:files")
storage:delete_objects({
"temp/file1.txt",
"temp/file2.txt",
"temp/file3.txt"
})
storage:release()
ParâmetroTipoDescrição
keysstring[]Array de chaves de objetos para deletar

Retorna: boolean, error

Criar uma URL temporaria que permite baixar um objeto sem credenciais. Util para compartilhar arquivos com usuários externos ou servir conteudo através da sua aplicação.

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
-- Retornar URL ao cliente para download direto
return {download_url = url}
ParâmetroTipoDescrição
keystringChave do objeto
options.expirationintegerSegundos até URL expirar (padrão: 3600)

Retorna: string, error

Criar uma URL temporaria que permite fazer upload de um objeto sem credenciais. Permite que clientes facam upload de arquivos diretamente para o armazenamento sem fazer proxy pelo seu 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
-- Retornar URL ao cliente para upload direto
return {upload_url = url}
ParâmetroTipoDescrição
keystringChave do objeto
options.expirationintegerSegundos até URL expirar (padrão: 3600)
options.content_typestringContent type obrigatorio para upload
options.content_lengthintegerTamanho maximo de upload em bytes

Retorna: string, error

MétodoRetornaDescrição
upload_object(key, content, opts?)boolean, errorUpload de string ou conteudo de arquivo
download_object(key, writer, opts?)boolean, errorDownload para file writer
head_object(key)table, errorObter metadados do objeto
list_objects(opts?)table, errorListar objetos com filtro de prefixo
delete_objects(keys)boolean, errorDeletar multiplos objetos
presigned_get_url(key, opts?)string, errorGerar URL temporaria de download
presigned_put_url(key, opts?)string, errorGerar URL temporaria de upload
release()booleanLiberar recurso de storage

Operações de cloud storage estao sujeitas a avaliação de política de segurança.

AçãoRecursoDescrição
cloudstorage.getID do StorageAdquirir um recurso de storage
CondiçãoTipoRetentável
ID de recurso vazioerrors.INVALIDnão
Recurso não encontradoerrors.NOT_FOUNDnão
Não e recurso cloud storageerrors.INVALIDnão
Storage liberadoerrors.INVALIDnão
Chave vaziaerrors.INVALIDnão
Conteudo nilerrors.INVALIDnão
Writer não validoerrors.INVALIDnão
Objeto não encontradoerrors.NOT_FOUNDnão
Pré-condição condicional falhouerrors.CONFLICTnão
Permissão negadaerrors.PERMISSION_DENIEDnão
Operação falhouerrors.INTERNALnão

Veja Error Handling para trabalhar com erros.