Amazon S3
Reads the objects under a bucket and prefix of Amazon S3, in place, by ETag, so agents can answer from the documents a team keeps there. Access is by an IAM role the client’s own account grants, never an access key.
At a glance
Section titled “At a glance”| Collector | Amazon S3, version 1.0.0 |
|---|---|
| Reads | Amazon Web Services: Amazon S3 (the vendor's documentation) |
| Family | Storage |
| Kind | Files |
| Ways to connect | Service account |
| Scopes |
|
| Read only | Yes, except: [object Object] |
| Vendor's API can move money | No |
| Personal data | Content |
| Hosts it may contact | *.amazonaws.com, s3.console.aws.amazon.com |
| Vendor API versions | Amazon S3 REST API (ListObjectsV2, GetObject), AWS STS AssumeRole |
| Lowest engine version | 0.45.0 |
What it reads
Section titled “What it reads”- Objects under the bucket (and
prefix, if given): text, Markdown, CSV, PDF, Word (.docx), PowerPoint (.pptx) and Excel (.xlsx), as the folder and SharePoint collectors read them. - The cursor is each object’s ETag: an unchanged object is never fetched again, and one that has gone (deleted, or moved out of the prefix) is withdrawn.
- Skipped and counted: any other format, an object over
max_mb(50 by default) and a document that will not open. - Names starting with
.and keys ending in/are ignored.
How to connect
Section titled “How to connect”- In the account that owns the bucket, create an IAM role that grants
s3:ListBucketon the bucket (for the prefix) ands3:GetObjecton its objects, and whose trust policy lets the deployment’s identity assume it, with an external ID if you want one. - In LightHouse, open Connectors, choose Amazon S3, give the bucket, prefix, region, role ARN and external ID, a label and how often to read. No access key is ever pasted, stored or sealed: the ARN and external ID are identifiers, and the trust policy is the permission.
- In code, add a
kind: s3source card withbucket,prefix,region,role_arn,external_id,labelandrequires. Withoutrole_arnthe deployment’s own identity reads the bucket, for a bucket in the same account.
Permissions
Section titled “Permissions”s3:ListBucket on the prefix and s3:GetObject on its objects, through sts:AssumeRole. The collector only reads: it calls ListObjectsV2 and GetObject, and AssumeRole to take on the role for an hour; it never puts, copies, deletes or changes an ACL.
S3 is reached through the AWS SDK (boto3), not an HTTP client the network recorder can see, so its read-only test replaces boto3.client with a recorder and asserts that every operation is one of those three and that no put_, delete_, copy_ or create_ call appears. The manifest’s read_operations lists the STS call, which is a POST that changes nothing in the bucket.
Limits
Section titled “Limits”- Objects over
max_mb(50 by default) and unsupported formats are skipped and counted. bucketmust be an S3 bucket name,role_arnan IAM role’s ARN,external_id2 to 1224 letters, digits and+=,.@:/-, andregionan AWS region such aseu-west-1.- PDFs need
pdftotextin the image. - The assumed role’s credentials last an hour.
- Each record links to the object in the AWS console; the console address is a link only, never contacted.
Data handling
Section titled “Data handling”- Object text is copied into the deployment’s corpus under the source’s
label. Documents can hold personal data of any kind. - No access key is held. The assumed role’s temporary credentials exist in memory for the run and are never written to logs or run notes.
- Nothing leaves the deployment: only counts reach LightHouse.
Troubleshooting
Section titled “Troubleshooting”| What you see | What it means | What to do |
|---|---|---|
bucket is an S3 bucket name |
The bucket is not a valid S3 bucket name | Use the bucket’s name, not its address |
role_arn is an IAM role's ARN |
The role is not given as an ARN | Use arn:aws:iam::<account>:role/<name> |
external_id is 2 to 1224 letters, digits and +=,.@:/- |
The external ID has other characters | Correct it |
region is an AWS region, e.g. eu-west-1 |
The region is malformed | Use a region name |
AccessDenied when assuming the role |
The trust policy does not allow the deployment’s identity, or the external ID differs | Fix the trust policy |
AccessDenied on list or get |
The role lacks s3:ListBucket or s3:GetObject |
Grant them on the prefix |
| Read succeeded, 0 written | No object’s ETag changed | Nothing to do |
Certification
Section titled “Certification”Each entry is a run by Atlantic Agentic Labs, newest first. Only a run against the vendor’s sandbox or a client environment certifies a collector; a certification lasts six months, or less if the vendor publishes an API version the collector does not list. See How collectors are certified.
| Date | Collector | Engine | Vendor API | Method | Expires |
|---|---|---|---|---|---|
| 10 November 2026 | 1.0.0 | 0.45.0 | Amazon S3 REST API (ListObjectsV2, GetObject); AWS STS AssumeRole | Fixtures only: built, not certified | Not applicable |
Security posture
Section titled “Security posture”From the collector’s last scan on the default branch. What each line means, and what blocks a release: Security posture.
| Last scanned | 10 November 2026 |
|---|---|
| Critical findings | 0 |
| High findings | 0 |
| Medium findings | 0 |
| Low findings | 0 |
| Info findings | 0 |
| Release blocked | No |
| Network allow-list check | Pass |
| Read-only behavioural test | Pass |
| SBOM (CycloneDX) | Produced |
| Dependency licences | Pass |
| Scanners | bandit 1.9.4, semgrep 1.181.1, pip-audit 2.10.1, osv-scanner 2.7.0, cyclonedx-py 7.5.0, pip-licenses 5.5.5, gitleaks repository job aal-secrets, hosts_check tools/hosts_check.py, read-only test pytest -m read_only |