Skip to content

Objects

Objects store files and other byte payloads: uploads, function zips, exports, backups, and media. Create a bucket, then upload and download by key. Use multipart for large files and presigned URLs when a browser or CI job should talk to storage directly without a long-lived key.

Call it with skippr objects.

Status: Preview. See the API action reference for the full command list.

At a glance

NeedUse
Store or replace bytesPUT /{bucket}/{key}
Download bytesGET /{bucket}/{key}
Read metadata onlyHEAD /{bucket}/{key}
Find keys by prefixGET /{bucket}?list-type=2&prefix=…
Upload in partsInitiate, upload each numbered part, then complete
Grant temporary direct accessPresigned GET or PUT URL

Prerequisites

  • Sign in with skippr login, or use Cloud access-key credentials for SigV4. See Cloud User Directory.
  • A policy that permits the required objects:<Operation> actions.

Do not use backing-store or bootstrap credentials. Objects requests use the Cloud capability code objects, not an AWS product service code.

Create a bucket

The same bucket create is CLI, Terraform, CDKTF TypeScript, or CDKTF Python. For provider credentials and the shared cloud provider block, see Terraform and CDKTF. Object bytes stay on the CLI or SDK; they are not Terraform resources.

bash
skippr objects create-bucket --bucket app-files
hcl
resource "cloud_object_bucket" "app_files" {
  bucket = "app-files"
}
ts
import { CloudProvider, CloudObjectBucket } from "@skippr/provider-cloud";

const cloud = new CloudProvider(this, "cloud", { region: "eu-central-1" });

new CloudObjectBucket(this, "app-files", {
  bucket: "app-files",
  provider: cloud,
});
python
from skippr_cdktf import CloudProvider, CloudObjectBucket

cloud = CloudProvider(self, "cloud", region="eu-central-1")

CloudObjectBucket(
    self,
    "app-files",
    bucket="app-files",
    provider=cloud,
)

Upload and download an object

Upload a text object, then download it:

bash
skippr objects put-object --bucket app-files --key hello.txt --content-type text/plain --input - <<JSON
{"body": "hello from Skippr Cloud"}
JSON
skippr objects get-object --bucket app-files --key hello.txt

PutObject returns the ETag in the etag response header. GetObject returns the bytes and, when present, content-type, content-length, and etag.

Endpoint behavior

FactValue
CLIskippr objects create-bucket, put-object, get-object, …
AddressingPath style: /{bucket}/{key}
AuthenticationHeader SigV4 or query-string SigV4
SigV4Service objects
Target headerNone; the HTTP method, path, and query select the operation
Object bodyBinary request or response body
Listing bodyJSON
Multipart bodiesXML where shown below

Sign the exact host, path, query string, and HTTP method you send. Do not use a backing-store endpoint or virtual-hosted bucket name.

Operations by task

Manage buckets

OperationRequestResult
CreateBucketPUT /{bucket}JSON bucket result
ListBucketsGET /JSON buckets array
DeleteBucketDELETE /{bucket}204; the bucket must be empty

Work with objects

OperationRequestResult
PutObjectPUT /{bucket}/{key} with bytes200 with etag
GetObjectGET /{bucket}/{key}Object bytes
HeadObjectHEAD /{bucket}/{key}Metadata headers, no body
DeleteObjectDELETE /{bucket}/{key}204
ListObjectsV2GET /{bucket}?list-type=2&prefix=…&max-keys=…JSON key summaries

Upload in parts

  1. POST /{bucket}/{key}?uploads starts an upload and returns UploadId in XML.
  2. PUT /{bucket}/{key}?partNumber=1&uploadId=… uploads a part and returns its ETag header. Part numbers start at 1.
  3. POST /{bucket}/{key}?uploadId=… completes the upload. Send an XML CompleteMultipartUpload body containing each PartNumber and matching ETag.
  4. DELETE /{bucket}/{key}?uploadId=… aborts an unfinished upload.

Completion fails with ValidationException if the parts body is empty, a part is missing, or an ETag does not match.

Create presigned access

Presign a GET or PUT against https://objects.cloud.skippr.io/{bucket}/{key} with the same region and objects service code. The URL carries X-Amz-Algorithm, X-Amz-Credential, X-Amz-Date, X-Amz-Expires, X-Amz-SignedHeaders, and X-Amz-Signature, so the caller does not send an Authorization header.

The maximum expiry is 604,800 seconds (7 days). The signed method is part of the contract: a presigned GET cannot be used for PUT.

Limits, ignored fields, and errors

ContractPreview behavior
List sizemax-keys defaults to 1,000 and is clamped to 1–1,000
List continuationThe current ListObjectsV2 response has no continuation token
Multipart part numberMust be at least 1
Presigned expiryAt most 7 days
Delete bucketFails while the bucket contains objects

Objects uses the common JSON error body:

json
{
  "code": "ResourceNotFoundException",
  "message": "object not found: hello.txt",
  "requestId": "..."
}

Common responses are:

  • HTTP 404 with ResourceNotFoundException for a missing bucket or object (DeleteBucket of a missing bucket is 404; DeleteObject of a missing key succeeds).
  • HTTP 200 for a repeated CreateBucket of the same tenant and name.
  • HTTP 400 with ValidationException for a non-empty bucket, an invalid bucket name, or an invalid multipart request.
  • HTTP 401 at the gateway for expired or invalid SigV4 or presigned credentials.

Customer KMS headers are accepted but not applied and report noop_sse_kms in x-cloud-ignored. Object tags are accepted but not persisted in Preview and report deferred_tags.