콘텐츠로 이동

클라우드 스토리지

S3 호환 오브젝트 스토리지에 접근합니다. presigned URL 지원으로 업로드, 다운로드, 목록 조회, 파일 관리를 수행합니다.

스토리지 설정은 클라우드 스토리지를 참조하세요.

local cloudstorage = require("cloudstorage")

레지스트리 ID로 클라우드 스토리지 리소스 가져오기:

local storage, err = cloudstorage.get("app.infra:files")
if err then
return nil, err
end
storage:upload_object("data/file.txt", "content")
storage:release()
파라미터타입설명
idstring스토리지 리소스 ID

반환: Storage, error

문자열 또는 파일에서 콘텐츠 업로드:

local storage = cloudstorage.get("app.infra:files")
-- 문자열 콘텐츠 업로드
local ok, err = storage:upload_object("reports/daily.json", json.encode({
date = "2024-01-15",
total = 1234
}))
-- 파일에서 업로드
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()
파라미터타입설명
keystring오브젝트 키/경로
contentstring 또는 Reader문자열 또는 파일 reader로서의 콘텐츠
optionstable선택적 메타데이터 및 조건부 쓰기 옵션

반환: boolean, error

옵션 테이블로 메타데이터를 첨부하거나 쓰기를 보호할 수 있습니다:

storage:upload_object("reports/daily.json", body, {
content_type = "application/json",
cache_control = "max-age=3600",
metadata = { owner = "team-a", run_id = "1234" }, -- stored as x-amz-meta-*
only_if_absent = true -- fail if the key already exists
})
옵션타입설명
content_typestringMIME 타입
cache_controlstringCache-Control 헤더
content_dispositionstringContent-Disposition 헤더
content_encodingstringContent-Encoding 헤더
metadatatable사용자 메타데이터(문자열 키/값), x-amz-meta-*로 저장됨
headerstable추가 요청 헤더(문자열 키/값)
if_matchstring현재 오브젝트 ETag가 일치할 때만 쓰기
if_none_matchstringETag와 일치하는 오브젝트가 없을 때만 쓰기("*"는 모든 오브젝트를 의미)
only_if_absentboolean키가 존재하지 않을 때만 쓰기(if_none_match = "*"의 별칭)

조건부 쓰기가 전제 조건을 충족하지 못하면 precondition_failed 오류를 반환합니다.

파일 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()
-- 부분 콘텐츠 다운로드 (처음 1KB)
local partial = vol:open("/partial.bin", "w")
storage:download_object("backups/large-file.bin", partial, {
range = "bytes=0-1023"
})
partial:close()
storage:release()
파라미터타입설명
keystring다운로드할 오브젝트 키
writerWriter대상 파일 writer
options.rangestring바이트 범위 (예: “bytes=0-1023”)
options.if_matchstring오브젝트 ETag가 일치할 때만 다운로드
options.if_none_matchstringETag가 일치하지 않을 때만 다운로드

반환: boolean, error

전제 조건(if_match/if_none_match)을 충족하지 못하면 precondition_failed 오류를 반환합니다.

선택적 접두사 필터링으로 오브젝트 목록 조회:

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
-- 대용량 결과 페이징
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()
파라미터타입설명
options.prefixstring키 접두사로 필터
options.max_keysinteger반환할 최대 오브젝트 수
options.continuation_tokenstring페이징 토큰
options.include_ownerboolean각 오브젝트의 owner(id, display_name) 포함
options.include_versionsboolean오브젝트 버전 나열; 각 항목에 version_id 포함

반환: table, error

결과는 objects, is_truncated, next_continuation_token을 포함합니다. 각 오브젝트에는 key, size, etag, storage_class가 있으며, 선택적으로 last_modified, version_id, owner가 포함됩니다.

목록 결과에서 content_type은 항상 비어 있습니다 — S3 list 작업은 이를 반환하지 않습니다. 오브젝트의 콘텐츠 타입과 메타데이터를 읽으려면 head_object를 사용하세요.

본문을 다운로드하지 않고 단일 오브젝트의 메타데이터를 가져옵니다:

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()
파라미터타입설명
keystring오브젝트 키

반환: table, error

결과 필드:

필드타입설명
sizeinteger오브젝트 크기(바이트)
etagstring엔티티 태그
content_typestringMIME 타입
cache_controlstringCache-Control 헤더
content_dispositionstringContent-Disposition 헤더
content_encodingstringContent-Encoding 헤더
storage_classstring스토리지 클래스
version_idstring버전 ID(버전 관리가 활성화된 경우 존재)
last_modifiedinteger마지막 수정 시각(Unix 초)
metadatatable사용자 메타데이터(x-amz-meta-*)
headerstable원시 응답 헤더(소문자 키)

존재하지 않는 오브젝트는 not_found 오류를 반환합니다.

여러 오브젝트 제거:

local storage = cloudstorage.get("app.infra:files")
storage:delete_objects({
"temp/file1.txt",
"temp/file2.txt",
"temp/file3.txt"
})
storage:release()
파라미터타입설명
keysstring[]삭제할 오브젝트 키 배열

반환: boolean, error

자격 증명 없이 오브젝트를 다운로드할 수 있는 임시 URL을 생성합니다. 외부 사용자와 파일을 공유하거나 애플리케이션을 통해 콘텐츠를 제공하는 데 유용합니다.

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
-- 직접 다운로드를 위해 클라이언트에 URL 반환
return {download_url = url}
파라미터타입설명
keystring오브젝트 키
options.expirationintegerURL 만료까지 초 (기본값: 3600)

반환: string, error

자격 증명 없이 오브젝트를 업로드할 수 있는 임시 URL을 생성합니다. 클라이언트가 서버를 프록시하지 않고 스토리지에 직접 파일을 업로드할 수 있게 합니다.

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
-- 직접 업로드를 위해 클라이언트에 URL 반환
return {upload_url = url}
파라미터타입설명
keystring오브젝트 키
options.expirationintegerURL 만료까지 초 (기본값: 3600)
options.content_typestring업로드에 필요한 콘텐츠 타입
options.content_lengthinteger최대 업로드 크기 바이트

반환: string, error

메서드반환설명
upload_object(key, content, opts?)boolean, error문자열 또는 파일 콘텐츠 업로드
download_object(key, writer, opts?)boolean, error파일 writer로 다운로드
head_object(key)table, error오브젝트 메타데이터 가져오기
list_objects(opts?)table, error접두사 필터로 오브젝트 목록
delete_objects(keys)boolean, error여러 오브젝트 삭제
presigned_get_url(key, opts?)string, error임시 다운로드 URL 생성
presigned_put_url(key, opts?)string, error임시 업로드 URL 생성
release()boolean스토리지 리소스 해제

클라우드 스토리지 작업은 보안 정책 평가 대상입니다.

액션리소스설명
cloudstorage.get스토리지 ID스토리지 리소스 획득
조건종류재시도 가능
빈 리소스 IDerrors.INVALID아니오
리소스를 찾을 수 없음errors.NOT_FOUND아니오
클라우드 스토리지 리소스가 아님errors.INVALID아니오
스토리지 해제됨errors.INVALID아니오
빈 키errors.INVALID아니오
콘텐츠 nilerrors.INVALID아니오
writer가 유효하지 않음errors.INVALID아니오
오브젝트를 찾을 수 없음errors.NOT_FOUND아니오
조건부 전제 조건 실패errors.CONFLICT아니오
권한 거부됨errors.PERMISSION_DENIED아니오
작업 실패errors.INTERNAL아니오

에러 처리는 에러 처리를 참조하세요.