Amazon S3 Integration
The Amazon S3 integration connects your S3 buckets to Ultralytics Platform. Your images stay in your buckets — Platform indexes them in place, so you can browse, annotate, and train YOLO models without uploading a copy. With AI features on, Platform can also use them for smart annotation, auto-annotation, similar-image search, and cloud training.
Amazon S3 datasets require a Pro or Enterprise plan. Free workspaces see the integration and are prompted to upgrade when connecting. Existing Amazon S3 datasets stay fully accessible if a subscription ends — only new connections and imports require Pro.
Create an IAM User#
Read access covers everything except image generation, which also creates objects. Platform never modifies or deletes your objects. Use a dedicated IAM user — never root credentials:
-
In the AWS console, go to IAM > Users and create a user with no console access.
-
Attach a policy granting list and read access to the buckets you want to connect:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*" }, { "Effect": "Allow", "Action": ["s3:ListBucket", "s3:GetObject"], "Resource": ["arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*"] } ] }s3:ListAllMyBucketsis optional — it lets Platform discover your buckets so you don't have to type their names.For image generation, also allow
s3:PutObject:{ "Effect": "Allow", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::my-bucket/generated/*", "arn:aws:s3:::my-bucket/*/generated/*", "arn:aws:s3:::my-bucket/.ultralytics-write-check" ] }S3 has no create-only permission, so this scopes writes to
generated/folders and the.ultralytics-write-checkkey Platform uses to test write access (that test is always rejected, so nothing is stored). Platform's own writes never overwrite. -
Open the user's Security credentials tab, create an access key, and copy the access key ID and secret access key.
Platform rejects temporary AWS credentials. Keys issued by AWS STS — including anything starting with ASIA, role
session credentials, and IAM Identity Center keys — expire while a dataset is still connected, so a dedicated IAM
user's long-lived access key is required.
Connect to Platform#
- Go to Settings > Integrations and select Amazon S3 from the integration list.
- Enter the access key ID, secret access key, and bucket region (for example
us-east-1). - Click Find available buckets, then select the buckets to connect. If the policy doesn't permit discovery, enter a known bucket name manually.
- Click Connect. Platform verifies it can list and read each selected bucket before saving anything, and checks whether the key can also write to it with a request S3 always rejects, so nothing is stored.

Each connected credential has an AI features switch. After you change the IAM policy, connect the same IAM user again to recheck write access.
You need the workspace admin or owner role to connect cloud storage. You can add up to 50 buckets at a time, and discovery lists up to 300 of the buckets the key can see.
Reconnecting the same IAM user later adds new buckets to the existing integration. A saved credential is only replaced once its replacement can still read every bucket you've already connected. If any bucket can't be read, the error names it, including buckets connected earlier with the same IAM user.
A connection reads buckets in the region you enter. If your buckets live in several regions, connect once per region.
Credentials are encrypted at rest with AES-256-GCM, are never returned to the browser, and are never exposed to training workloads. To revoke access, deactivate the access key in AWS IAM.
AI Features#
Each connected credential has an AI features switch in Settings > Integrations, on by default. While it's on, Ultralytics GPUs and AI model providers may use that credential's images for:
- SAM smart annotation, and single-image and batch auto-annotation
- Similar-image search and clustering analysis
- Cloud training
- Image generation, on buckets with write access
AI model providers are involved only for image generation, whose prompts Google Gemini plans from the source image, and for paid annotation models, which run on your workspace's own provider key. Platform keeps no copy of your images: features read them on demand, cloud training uses temporary copies for the duration of a run, and similar-image search keeps an embedding of each image, which is deleted when the image leaves Platform.
Turn the switch off to keep images off Ultralytics GPUs and AI model providers. Turning it off stops new AI work; work already running finishes. Datasets on that credential then show AI features off with a link back to these settings, and each unavailable feature explains why. Manual annotation, sharing, and local training keep working, and the labels, models, and search results you already created are kept.
You need the workspace admin or owner role to change the switch. You can also set it with the REST API, using the integration ID returned by GET /api/integrations/buckets:
curl -X PATCH \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"processing": false}' \
https://platform.ultralytics.com/api/integrations/buckets/INTEGRATION_IDImage Generation#
Generate similar images works on Amazon S3 datasets whose bucket the IAM user can write to, while AI features are on. Images you add are written to a generated/ folder inside the dataset's folder, then added to the dataset like any other indexed image. Platform only creates new objects there and never overwrites or deletes existing ones. If the action says it needs write access, grant it if needed and connect the same IAM user again in Settings > Integrations.
Create a Dataset from an S3 Bucket#
- Click New Dataset and open the Cloud tab.
- Pick a connected bucket and browse to the folder containing your data.
- Confirm the folder, adjust the dataset name, and create the dataset.
Platform lists the folder once and indexes what it finds:
- Images —
.jpg,.jpeg,.png,.webp, and.avifobjects are indexed with dimensions read through bounded requests. Platform does not persist a second copy of the source image. - Labels — YOLO
.txtsidecars are parsed into Platform annotations, matched by the standardimages/→labels/layout or as same-folder siblings. - Metadata — a YAML file provides class names and pose keypoint shape, exactly like an archive upload.
data.yamlanddata.ymlare preferred when the folder holds several. - Task — a sample of the label files decides the task, so segment, pose, and OBB folders are recognized from their label shape rather than the task you picked in the dialog.
- Splits —
train,val, andtestfolder names in the object key assign splits automatically.
The dataset then behaves like any other: browse and annotate it, set it public or private, share it with your team, and train on it through managed training. Originals are streamed on demand, and indexed images do not consume your Platform storage quota.
A single import indexes up to 500,000 objects, and label or YAML files up to 1 MB each. Larger buckets should be split across multiple datasets.
Every indexed image is pinned to its S3 object ETag, and Platform fails closed if an object changes underneath it. Add new objects instead of overwriting existing ones.
Failed Imports#
If an import fails — an empty folder, a typo in the path, or revoked permissions — the dataset shows the error on its page. Editors can click Retry import to restart it with the stored bucket and folder, or create a new dataset pointing at the corrected path.
A retry re-lists the folder rather than resuming: objects added since the first attempt are picked up, and objects that are no longer there are dropped from the dataset.
Training#
Managed training works through the normal training flow while AI features are on. Training uses Platform's own copies of the pinned images for the duration of the run, and your AWS credentials are never exposed to training workloads. With AI features off, the training dialog explains why cloud training is unavailable and offers local training instead.
Disconnect a Connection#
Disconnecting deletes the stored credentials without touching anything in AWS. Datasets built from those buckets stay in your workspace with their classes, labels, and annotations, but their images cannot be loaded, previewed, or trained on until the same IAM user is connected again. You can still rename them, edit their labels, or delete them while disconnected.
To disconnect, go to Settings > Integrations, select Amazon S3, click Disconnect next to the credential, and confirm. Opening one of its datasets then shows Amazon S3 Disconnected with a link back to these settings, and the dataset returns automatically once you reconnect.
You can also disconnect with the REST API, using the integration ID returned by GET /api/integrations/buckets:
curl -X DELETE \
-H "Authorization: Bearer YOUR_API_KEY" \
https://platform.ultralytics.com/api/integrations/buckets/INTEGRATION_IDfrom ultralytics_platform import Platform
client = Platform() # reads ULTRALYTICS_API_KEY
integrations = client.storage_integrations.list()
client.storage_integrations.delete("INTEGRATION_ID")To revoke access at the source instead, deactivate or delete the access key in AWS IAM.
Current Limitations#
S3-backed datasets exclude features that need Platform-owned copies of your images: dataset cloning, immutable version snapshots, face blurring, and pasting images from other datasets. Smart annotation, auto-annotation, similar-image search, clustering, cloud training, and image generation need AI features on.
Deleting an S3-backed dataset, or individual images from it, removes Platform's references only — your objects are never touched.
Also see the Google Cloud Storage and Azure Blob Storage integrations.
FAQ#
No. Platform lists the bucket once and indexes the image dimensions and labels it finds. Originals are streamed on demand for browsing and annotation. With AI features on, Ultralytics GPUs read them on demand, managed training uses temporary copies for the duration of a run, and similar-image search keeps an embedding of each image, which is deleted with the image. The only objects Platform ever writes are the generated images you add, under
generated/. Indexed images do not count against your storage quota.A dataset is indexed once when it is created. New objects are not picked up until you create a new dataset or retry a failed import, and every indexed image is pinned to its version, so overwriting an object makes Platform fail closed on that image. Add new objects instead of replacing existing ones.
Only for image generation, and only when the IAM user has
s3:PutObjectand AI features are on. Platform creates new objects undergenerated/in the dataset's folder and never overwrites or deletes existing ones.Disconnect the integration in Settings > Integrations to delete the stored credentials, or deactivate or delete the access key in AWS IAM. Neither action touches the data in your buckets. To keep images off Ultralytics GPUs without disconnecting, turn off AI features.
Comments
Ask a question, share your results, or help someone else.