ORACLE CLOUD OBJECT STORAGE → STACKIT · TUTORIAL
OCI Object Storage to STACKIT Object Storage, step by step
Both sides speak an S3 API, which makes the data copy the easy part. The work is in what surrounds it: bucket names, credentials, lifecycle rules, versioning and pre-authenticated links. This tutorial assesses a small OCI estate with two buckets, a lifecycle policy, a pre-authenticated request and an object, shows what StackToIT maps and what it hands to your architects, and walks the copy through the two S3 endpoints.
A bucket, assessed
The estate was written for this page and assessed on 4 November 2026. Left: the versioned media bucket. Right: the record the run keeps for it in assessment.json, copied from the run. assessment.json is written as a single line, so the pane shows selected fields of each unit, indented and nested as in the file, with the values unchanged.
resource "oci_objectstorage_bucket" "media" {
compartment_id = var.compartment_id
namespace = var.namespace
name = "media"
access_type = "NoPublicAccess"
storage_tier = "Standard"
versioning = "Enabled"
}{
"id": "oci_objectstorage_bucket.media",
"wave": 1,
"result": {
"class": "RECONFIGURE",
"confidence": "LOW",
"target": {
"service": "STACKIT Object Storage"
},
"reason": "A bucket becomes a STACKIT Object Storage bucket with an S3 API. Clients change endpoint and credentials; lifecycle, replication and access rules are rewritten."
}
}Mapped, with a cost to clients
The bucket becomes a STACKIT Object Storage bucket with an S3 API. Clients change endpoint and credentials; lifecycle, replication and access rules are rewritten.
Why LOW and not MEDIUM
The archive bucket, linked to nothing the catalogue lacks, is MEDIUM: the ceiling while the oci provider has no lock file entry. The media bucket is LOW because the lifecycle policy, the pre-authenticated request and the object that point at it are unknown to the catalogue.
Six settings stay with you
access_type, compartment_id, name, namespace, storage_tier and versioning are listed as critical settings left to you; no STACKIT bucket block is written for this source.
The lifecycle policy the run hands over
The lifecycle policy, the pre-authenticated request and the object are not in the catalogue of this build. Each is MANUAL_REVIEW with nothing assessed or drafted. The rule below deletes objects under tmp/ after 30 days. assessment.json is written as a single line, so the pane shows selected fields of each unit, indented and nested as in the file, with the values unchanged.
resource "oci_objectstorage_object_lifecycle_policy" "media" {
namespace = var.namespace
bucket = oci_objectstorage_bucket.media.name
rules {
name = "expire-tmp"
action = "DELETE"
is_enabled = true
time_amount = 30
time_unit = "DAYS"
target = "objects"
object_name_filter {
inclusion_prefixes = ["tmp/"]
}
}
}{
"id": "oci_objectstorage_object_lifecycle_policy.media",
"wave": 2,
"result": {
"class": "MANUAL_REVIEW",
"confidence": "LOW",
"reason": "oci_objectstorage_object_lifecycle_policy is not in the knowledge base catalogue; an architect has to decide the target. Nothing of this resource is assessed or drafted (unknown source type)."
}
}STACKIT lists the calls
The supported-operations page lists Put, Get and Delete Bucket Lifecycle Configuration, so a rule like this can be set through the S3 API. Re-create it there and test it on a bucket with test data.
The pre-authenticated request
The request in the demo gives read access to exports/report.csv until 1 January 2027. STACKIT lists query-parameter authentication for presigned URLs; each OCI link needs a replacement, and its consumers need the new one.
The migration in order
1. Assess and read the data-movement file
migration/data-movement.md lists both buckets as stateful units with the mechanism UNKNOWN and the state DECISION_REQUIRED. The method depends on the size of the data, the downtime the business tolerates and the consistency the application needs; the Terraform states none of them, so they are yours to supply.
2. Create the STACKIT buckets
Names on STACKIT must be unique across the whole system, 3 to 63 characters, letters, numbers and hyphens, starting and ending with a letter or number. On OCI a name only has to be unique within the tenancy namespace, so a short name such as media is likely taken. Plan a naming scheme first.
3. Create credentials
The run names a credentials group and a credential as part of the STACKIT target. On STACKIT you create credentials inside a credential group in the Portal; the dialog shows the access key ID and the secret access key once. On OCI the S3 API uses a customer secret key, whose secret also cannot be retrieved after generation. Store both in your secret store before you close anything.
4. Copy through the two S3 endpoints
Oracle offers a path-style endpoint of the form https://NAMESPACE.compat.objectstorage.REGION.oci.customer-oci.com; STACKIT documents https://object.storage.eu01.onstackit.cloud with the region eu01; its client set-up page names no other region, so take the endpoint for any other region from STACKIT. A sync tool with one remote per side, for example rclone, can copy bucket to bucket. Oracle does not support AWS signature version 2, so use a client that signs with version 4. STACKIT limits a project to 500 MB/s of transfer and 2,500 requests per second, so 10 TB takes at least about 5.5 hours. This is general practice; the run performs no copy.
5. Check versions and sizes
STACKIT keeps at most 1,000 versions per object and takes objects up to 5 TB, in up to 10,000 parts of at most 5 GB. Compare object counts and total bytes per bucket before you switch clients.
6. Switch clients, then retire
Change endpoint and credentials in each application, run both buckets in parallel for as long as your rollback plan needs, and delete the OCI buckets and their links last.
Where the two services differ in practice
| Topic | Oracle Cloud Object Storage | STACKIT Object Storage |
|---|---|---|
| Bucket names | Unique within the tenancy namespace | Unique across the whole system, 3 to 63 characters |
| Endpoint and region | Path-style or virtual-hosted endpoint per OCI region; clients that cannot set the OCI region reach the home region only | https://object.storage.eu01.onstackit.cloud, region eu01 |
| Credentials | Customer secret key per user; the secret cannot be retrieved later | Credentials in credential groups, up to 1,000 groups per project; the secret is shown once |
| Access control | No object ACLs; IAM groups, compartments and policies | Get ACL calls are listed, Put ACL calls are not; bucket policies up to 20,480 bytes |
| Lifecycle and versioning | Lifecycle policy and versioning on the bucket | Lifecycle and versioning calls are listed; 1,000 versions per object |
| Temporary links | Pre-authenticated requests | Presigned URLs by query parameters |
| Storage tiers | storage_tier Standard or Archive on the bucket, as in the demo | No storage-class call is listed; storage_tier is left to you |
STACKIT facts are from the supported-operations, limits, credentials and CLI-client pages; a call that is not listed there is not confirmed as unsupported, only not listed. Get Bucket Notification Configuration is the only notification call listed, so event-driven consumers need their own design.
What to change before you apply
Write the STACKIT side
No STACKIT bucket block is written for this source. Create the buckets, the credential group and the credentials from the target the report names, with the naming scheme you chose.
Decide the archive data
The archive bucket uses the Archive tier. The tier does not carry over as a setting, so decide where cold data lives and what retrieval you accept.
Rewrite the access model
OCI access runs through IAM groups and policies. On STACKIT, access is per credentials and bucket policy; map each consumer.
Pin the provider
Commit the lock file for oracle/oci 9.11.0. Until then every unit is capped at MEDIUM and the source check by OpenTofu is not run.
Questions storage teams ask
Can I copy directly between the two S3 endpoints?
Yes in principle: both offer an S3 API, so a client with two remotes can read from one and write to the other. Check the signature version first, since Oracle does not support signature version 2.
Does the lifecycle policy move over automatically?
No. The run classifies it MANUAL_REVIEW. STACKIT lists the lifecycle configuration calls, so you recreate the rule through the S3 API.
What happens to pre-authenticated links?
They are tied to the OCI bucket. Issue new links from STACKIT and tell the consumers; there is no mapping the run can make for them.
Does StackToIT copy the objects?
No. It records which buckets hold data and leaves the mechanism and the cutover to a person.
Sources
Your next move: STACKIT.
Tell us about your estate. We show you what StackToIT delivers for it: target architecture, Terraform artifacts and a structured migration plan.