Docs/Agent/S3 Evidence Vault

S3 Evidence Vault

Configure S3 storage for scheduled artifact uploads. Every artifact lands under a date/type/source key, so evidence is easy to find and audit.


Authentication Methods

Three ways to authenticate, in order of preference:

IAM Role (recommended)

Attach an IAM role to the node instance profile. No credentials to manage.

IRSA (EKS)

Use IAM Roles for Service Accounts on EKS for pod-level credentials.

Kubernetes Secret

Create a secret with AWS credentials:

kubectl create secret generic aws-credentials \
--from-literal=aws-access-key-id=AKIA... \
--from-literal=aws-secret-access-key=... \
-n production

Where the Secret Lives

The agent reads the credentials secret from the scanned pod's own namespace, never the agent's, and there's no override flag. This is a deliberate boundary: a node agent that could read secrets in any namespace would let any S3-opted-in pod reach any secret in the cluster.

So every namespace that uses S3 export needs its own copy of the secret. The annotations pick the secret's name; the namespace is fixed.

Annotation Configuration

Configure S3 settings via pod or namespace annotations:

AnnotationDescription
reel.io/s3-bucketS3 bucket name
reel.io/s3-regionAWS region
reel.io/s3-secretName of Kubernetes secret with AWS credentials (always read from the workload's own namespace, see below)

When settings collide, the most specific wins: CLI flags > pod annotations > namespace annotations. See Scheduling for details.

Complete Example

# Namespace-level S3 config (applies to all pods)
apiVersion: v1
kind: Namespace
metadata:
name: production
annotations:
reel.io/s3-bucket: "compliance-evidence"
reel.io/s3-region: "us-east-1"
reel.io/s3-secret: "aws-credentials"
reel.io/schedule: |
0 6 * * * | upload sbom --scanners vuln
next | upload cbom

S3 Key Pattern

Artifacts are organized in S3 with the following key structure:

{date}/{type}/{cluster}_{node}_{namespace}_{pod}_{container}_{timestamp}.{ext}
TypeExtension
sbom, cbom, volatile, metadata, malware.json
checkpoint, layer, frame, memory.tar.zst or .core.zst