Skip to content

Configure Arena S3 Result Storage

This guide shows how to configure Arena Fleet to store evaluation results in Amazon S3 or S3-compatible storage (MinIO, DigitalOcean Spaces, etc.).

  • Arena Fleet enabled in your Omnia installation
  • An S3 bucket or S3-compatible storage endpoint
  • AWS credentials or IAM role with write access to the bucket

Create a Kubernetes secret with your AWS credentials:

apiVersion: v1
kind: Secret
metadata:
name: arena-s3-credentials
namespace: default
type: Opaque
stringData:
AWS_ACCESS_KEY_ID: "AKIAIOSFODNN7EXAMPLE"
AWS_SECRET_ACCESS_KEY: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
Terminal window
kubectl apply -f s3-credentials.yaml

Reference the credentials in your ArenaJob output configuration:

apiVersion: omnia.altairalabs.ai/v1alpha1
kind: ArenaJob
metadata:
name: nightly-eval
namespace: default
spec:
sourceRef:
name: my-eval-config
type: evaluation
evaluation:
outputFormats:
- json
- junit
workers:
replicas: 2
output:
type: s3
s3:
bucket: my-arena-results
prefix: "evaluations/nightly/"
region: us-west-2
secretRef:
name: arena-s3-credentials

Results will be stored at:

s3://my-arena-results/evaluations/nightly/<job-name>/<timestamp>/

For production deployments on EKS, use IAM Roles for Service Accounts (IRSA) instead of static credentials.

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-arena-results",
"arn:aws:s3:::my-arena-results/*"
]
}
]
}

Configure the arena worker service account with the IAM role:

# In your Helm values
arena:
worker:
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/arena-s3-role

When using IRSA, omit the secretRef:

apiVersion: omnia.altairalabs.ai/v1alpha1
kind: ArenaJob
metadata:
name: nightly-eval
spec:
sourceRef:
name: my-eval-config
output:
type: s3
s3:
bucket: my-arena-results
prefix: "evaluations/"
region: us-west-2
# No secretRef needed - uses IRSA

For MinIO or other S3-compatible storage, specify the custom endpoint:

apiVersion: v1
kind: Secret
metadata:
name: minio-credentials
namespace: default
type: Opaque
stringData:
AWS_ACCESS_KEY_ID: "minioadmin"
AWS_SECRET_ACCESS_KEY: "minioadmin"
apiVersion: omnia.altairalabs.ai/v1alpha1
kind: ArenaJob
metadata:
name: local-eval
spec:
sourceRef:
name: my-eval-config
output:
type: s3
s3:
bucket: arena-results
prefix: "evals/"
endpoint: http://minio.minio-system.svc:9000
secretRef:
name: minio-credentials

Arena Fleet organizes results in S3 with the following structure:

s3://bucket/prefix/
└── <job-name>/
└── <timestamp>/
├── results.json # Full evaluation results
├── results.junit.xml # JUnit format (if requested)
├── summary.json # Aggregated metrics
└── scenarios/
├── scenario-1.json
└── scenario-2.json
Terminal window
# List results
aws s3 ls s3://my-arena-results/evaluations/nightly/
# Download results
aws s3 cp s3://my-arena-results/evaluations/nightly/eval-001/results.json .

The job status includes the result URL:

Terminal window
kubectl get arenajob nightly-eval -o jsonpath='{.status.result.url}'

Configure default S3 storage for all Arena jobs in your Helm values:

arena:
storage:
type: s3
s3:
bucket: arena-results
region: us-west-2
prefix: "omnia/"
secretRef: arena-s3-credentials

Jobs can override this default or omit the output section to use the global configuration.

Verify your credentials have the required permissions:

Terminal window
# Test with AWS CLI
aws s3 ls s3://my-arena-results/
aws s3 cp test.txt s3://my-arena-results/test.txt

For S3-compatible storage, ensure:

  • The endpoint URL is reachable from within the cluster
  • Use http:// for non-TLS endpoints
  • The bucket exists (some implementations require pre-created buckets)
Terminal window
kubectl logs -l arena.omnia.altairalabs.ai/job=<job-name> | grep -i s3