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
| Need | Use |
|---|---|
| Store or replace bytes | PUT /{bucket}/{key} |
| Download bytes | GET /{bucket}/{key} |
| Read metadata only | HEAD /{bucket}/{key} |
| Find keys by prefix | GET /{bucket}?list-type=2&prefix=… |
| Upload in parts | Initiate, upload each numbered part, then complete |
| Grant temporary direct access | Presigned 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.
skippr objects create-bucket --bucket app-filesresource "cloud_object_bucket" "app_files" {
bucket = "app-files"
}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,
});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:
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.txtPutObject returns the ETag in the etag response header. GetObject returns the bytes and, when present, content-type, content-length, and etag.
Endpoint behavior
| Fact | Value |
|---|---|
| CLI | skippr objects create-bucket, put-object, get-object, … |
| Addressing | Path style: /{bucket}/{key} |
| Authentication | Header SigV4 or query-string SigV4 |
| SigV4 | Service objects |
| Target header | None; the HTTP method, path, and query select the operation |
| Object body | Binary request or response body |
| Listing body | JSON |
| Multipart bodies | XML 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
| Operation | Request | Result |
|---|---|---|
CreateBucket | PUT /{bucket} | JSON bucket result |
ListBuckets | GET / | JSON buckets array |
DeleteBucket | DELETE /{bucket} | 204; the bucket must be empty |
Work with objects
| Operation | Request | Result |
|---|---|---|
PutObject | PUT /{bucket}/{key} with bytes | 200 with etag |
GetObject | GET /{bucket}/{key} | Object bytes |
HeadObject | HEAD /{bucket}/{key} | Metadata headers, no body |
DeleteObject | DELETE /{bucket}/{key} | 204 |
ListObjectsV2 | GET /{bucket}?list-type=2&prefix=…&max-keys=… | JSON key summaries |
Upload in parts
POST /{bucket}/{key}?uploadsstarts an upload and returnsUploadIdin XML.PUT /{bucket}/{key}?partNumber=1&uploadId=…uploads a part and returns its ETag header. Part numbers start at 1.POST /{bucket}/{key}?uploadId=…completes the upload. Send an XMLCompleteMultipartUploadbody containing eachPartNumberand matchingETag.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
| Contract | Preview behavior |
|---|---|
| List size | max-keys defaults to 1,000 and is clamped to 1–1,000 |
| List continuation | The current ListObjectsV2 response has no continuation token |
| Multipart part number | Must be at least 1 |
| Presigned expiry | At most 7 days |
| Delete bucket | Fails while the bucket contains objects |
Objects uses the common JSON error body:
{
"code": "ResourceNotFoundException",
"message": "object not found: hello.txt",
"requestId": "..."
}Common responses are:
- HTTP 404 with
ResourceNotFoundExceptionfor a missing bucket or object (DeleteBucketof a missing bucket is 404;DeleteObjectof a missing key succeeds). - HTTP 200 for a repeated
CreateBucketof the same tenant and name. - HTTP 400 with
ValidationExceptionfor 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.
