# Amazon S3

> Amazon S3: what the collector reads, how to connect it, its permissions, its certification by Atlantic Agentic Labs and its security posture.

Built, not certified Built and tested against recorded and synthetic responses (version 1.0.0, 10 November 2026). Not yet run against the vendor's sandbox or a client environment.

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

| Collector                   | Amazon S3, version `1.0.0`                                                                                                  |
| --------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| Reads                       | Amazon Web Services: Amazon S3 ([the vendor's documentation](https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html)) |
| Family                      | Storage                                                                                                                     |
| Kind                        | Files                                                                                                                       |
| Ways to connect             | Service account                                                                                                             |
| Scopes                      | - Read: `s3:ListBucket`, `s3:GetObject`, `sts:AssumeRole`                                                                   |
| 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

- 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

1. In the account that owns the bucket, create an IAM role that grants `s3:ListBucket` on the bucket (for the prefix) and `s3:GetObject` on its objects, and whose trust policy lets the deployment’s identity assume it, with an external ID if you want one.
2. 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.
3. In code, add a `kind: s3` source card with `bucket`, `prefix`, `region`, `role_arn`, `external_id`, `label` and `requires`. Without `role_arn` the deployment’s own identity reads the bucket, for a bucket in the same account.

## 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

- Objects over `max_mb` (50 by default) and unsupported formats are skipped and counted.
- `bucket` must be an S3 bucket name, `role_arn` an IAM role’s ARN, `external_id` 2 to 1224 letters, digits and `+=,.@:/-`, and `region` an AWS region such as `eu-west-1`.
- PDFs need `pdftotext` in 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

- 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

| 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

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](/collectors/certification/).

| 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

From the collector’s last scan on the default branch. What each line means, and what blocks a release: [Security posture](/collectors/security/).

| 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 |

Source: https://docs.atlanticagenticlabs.com/collectors/catalogue/s3/
