Skip to content

Usage Instructions

ClairAI Observability Platform — AWS Marketplace Usage Instructions

Field Value
Document AWS Marketplace Usage Instructions
Version v1.0.1
Publisher Info Services
Delivery Type Helm-based container product for Amazon EKS
Target Platform Amazon EKS
Chart Version 1.0.2

Topics

1. Purpose and AWS Marketplace Coverage

This document provides buyer-facing instructions to deploy, configure, validate, monitor, upgrade, and uninstall ClairAI as an AWS Marketplace Helm-based container product on Amazon EKS.

2. Product Overview

ClairAI is an AI-powered observability platform for AWS infrastructure. It provides:

  • Observability Backend — Monitoring, alerting, log aggregation, and cost management
  • Frontend Dashboard — React-based UI for visualization and interaction
  • AI Agent — Three specialized agents (Auto, RCA, FinOps) powered by Amazon Bedrock
  • Prometheus MCP Server — Queries AWS Managed Prometheus metrics via Model Context Protocol
  • Loki MCP Server — Queries Grafana Loki logs via Model Context Protocol
  • Billing MCP Server — AWS Cost Explorer and billing analysis via Model Context Protocol
  • YACE — Yet Another CloudWatch Exporter for collecting AWS CloudWatch metrics

3. AWS Marketplace Delivery Information

Component Image Tag
Backend v1.0.1-backend
Frontend v1.0.1-frontend
Agent v1.0.1-agent
Prometheus MCP v1.0.1-prometheus-mcp
Loki MCP v1.0.1-loki-mcp
Billing MCP v1.0.1-billing-mcp
YACE v1.0.1-yace
Artifact URI
Helm Chart oci://709825985650.dkr.ecr.us-east-1.amazonaws.com/info-services/clairai
Chart Version 1.0.2
ECR Registry 709825985650.dkr.ecr.us-east-1.amazonaws.com
Repository info-services/clairai

All images are linux/amd64 architecture, Docker V2 manifest format.

4. Prerequisites

AWS Prerequisites

  • Active AWS account with AWS Marketplace subscription for ClairAI
  • Amazon EKS cluster (Kubernetes 1.29+, standard support recommended)
  • AWS CLI v2 configured for the target account
  • kubectl configured for the EKS cluster
  • Helm 3.8+ with OCI registry support
  • eksctl (for IRSA setup)

AWS Services Required

Service Purpose
Amazon EKS Container orchestration
AWS Managed Prometheus (AMP) Metrics storage
Amazon Bedrock AI inference (Claude 3 Sonnet)
DynamoDB Configuration storage
S3 Data storage
AWS Secrets Manager Credential management
Item Value
Kubernetes version 1.32 (standard support)
Worker nodes 2-3 nodes minimum (t3.large or m6g.large)
Architecture x86_64 (linux/amd64)
AWS Load Balancer Controller Required for ALB ingress

5. Subscribe to ClairAI

  1. Open AWS Marketplace and search for ClairAI
  2. Subscribe to the product
  3. Wait until subscription is active before proceeding

6. Authenticate Helm to AWS Marketplace ECR

aws ecr get-login-password --region us-east-1 | \
  helm registry login --username AWS --password-stdin \
  709825985650.dkr.ecr.us-east-1.amazonaws.com

Validate chart access:

helm pull oci://709825985650.dkr.ecr.us-east-1.amazonaws.com/info-services/clairai \
  --version 1.0.2 --untar --destination /tmp/clairai-chart

7. Create Kubernetes Namespaces

kubectl create namespace clairai-core
kubectl create namespace clairai-agent
kubectl create namespace clairai-mcp
kubectl create namespace clairai-metrics-manager

8. IAM Roles for Service Accounts (IRSA)

8.1 Associate OIDC Provider

eksctl utils associate-iam-oidc-provider \
  --cluster <CLUSTER_NAME> --region <REGION> --approve

8.2 Create IAM Policy

Create clairai-policy.json:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AMP",
      "Effect": "Allow",
      "Action": ["aps:QueryMetrics", "aps:GetSeries", "aps:GetLabels", "aps:GetMetricMetadata", "aps:RemoteWrite"],
      "Resource": "arn:aws:aps:<REGION>:<ACCOUNT_ID>:workspace/<AMP_WORKSPACE_ID>"
    },
    {
      "Sid": "DynamoDB",
      "Effect": "Allow",
      "Action": ["dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:UpdateItem", "dynamodb:DeleteItem"],
      "Resource": "arn:aws:dynamodb:<REGION>:<ACCOUNT_ID>:table/clairai-*"
    },
    {
      "Sid": "S3",
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject", "s3:ListBucket"],
      "Resource": ["arn:aws:s3:::<BUCKET>", "arn:aws:s3:::<BUCKET>/*"]
    },
    {
      "Sid": "Bedrock",
      "Effect": "Allow",
      "Action": ["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream"],
      "Resource": "*"
    },
    {
      "Sid": "SecretsManager",
      "Effect": "Allow",
      "Action": ["secretsmanager:GetSecretValue"],
      "Resource": "arn:aws:secretsmanager:<REGION>:<ACCOUNT_ID>:secret:clairai-*"
    },
    {
      "Sid": "CloudWatch",
      "Effect": "Allow",
      "Action": ["cloudwatch:GetMetricData", "cloudwatch:ListMetrics", "cloudwatch:GetMetricStatistics"],
      "Resource": "*"
    },
    {
      "Sid": "CostExplorer",
      "Effect": "Allow",
      "Action": ["ce:GetCostAndUsage", "ce:GetCostForecast", "ce:GetReservationUtilization", "ce:GetSavingsPlansUtilization"],
      "Resource": "*"
    }
  ]
}
aws iam create-policy --policy-name ClairAI-EKS-Policy \
  --policy-document file://clairai-policy.json

8.3 Create Service Accounts

for NS in clairai-core clairai-agent clairai-mcp clairai-metrics-manager; do
  eksctl create iamserviceaccount \
    --cluster <CLUSTER_NAME> \
    --namespace ${NS} \
    --name clairai-sa \
    --role-name "ClairAI-${NS}-role" \
    --attach-policy-arn arn:aws:iam::<ACCOUNT_ID>:policy/ClairAI-EKS-Policy \
    --approve
done

9. Secret Management, Sensitive Data, and Encryption

Do not store passwords, API keys, or tokens directly in values.yaml. Use Kubernetes Secrets or AWS Secrets Manager.

kubectl create secret generic clairai-secrets \
  --namespace clairai-core \
  --from-literal=SECRET_KEY="<YOUR_SECRET>"

10. Deploy ClairAI Components

Pull the chart first:

helm pull oci://709825985650.dkr.ecr.us-east-1.amazonaws.com/info-services/clairai \
  --version 1.0.2 --untar --destination /tmp/clairai

10.1 Backend

helm install clairai-backend /tmp/clairai/clairai \
  --namespace clairai-core \
  --set deploy.enabled=true \
  --set deployment.enabled=true \
  --set nameOverride=clairai-backend \
  --set fullnameOverride=clairai-backend \
  --set image.repository=709825985650.dkr.ecr.us-east-1.amazonaws.com/info-services/clairai \
  --set image.tag=v1.0.1-backend \
  --set serviceAccount.create=false \
  --set serviceAccount.name=clairai-sa \
  --set service.type=ClusterIP \
  --set "service.ports[0].port=80" \
  --set "service.ports[0].targetPort=8000" \
  --set-string "env[0].name=AWS_REGION" \
  --set-string "env[0].value=<REGION>" \
  --set-string "env[1].name=AUTH_ENABLED" \
  --set-string "env[1].value=true" \
  --wait --timeout 5m

10.2 Frontend

helm install clairai-frontend /tmp/clairai/clairai \
  --namespace clairai-core \
  --set deploy.enabled=true \
  --set deployment.enabled=true \
  --set nameOverride=clairai-frontend \
  --set fullnameOverride=clairai-frontend \
  --set image.repository=709825985650.dkr.ecr.us-east-1.amazonaws.com/info-services/clairai \
  --set image.tag=v1.0.1-frontend \
  --set serviceAccount.create=false \
  --set serviceAccount.name=clairai-sa \
  --set service.type=ClusterIP \
  --set "service.ports[0].port=80" \
  --set "service.ports[0].targetPort=8080" \
  --wait --timeout 5m

Note: Frontend nginx listens on port 8080 (unprivileged container).

10.3 Agent

helm install clairai-assistant /tmp/clairai/clairai \
  --namespace clairai-agent \
  --set deploy.enabled=true \
  --set deployment.enabled=true \
  --set nameOverride=clairai-assistant \
  --set fullnameOverride=clairai-assistant \
  --set image.repository=709825985650.dkr.ecr.us-east-1.amazonaws.com/info-services/clairai \
  --set image.tag=v1.0.1-agent \
  --set serviceAccount.create=false \
  --set serviceAccount.name=clairai-sa \
  --set service.type=ClusterIP \
  --set "service.ports[0].port=80" \
  --set "service.ports[0].targetPort=8001" \
  --set-string "env[0].name=AWS_REGION" \
  --set-string "env[0].value=<REGION>" \
  --set-string "env[1].name=BEDROCK_MODEL_ID" \
  --set-string "env[1].value=anthropic.claude-3-sonnet-20240229-v1:0" \
  --set-string "env[2].name=PROMETHEUS_MCP_URL" \
  --set-string "env[2].value=http://prometheus-mcp-server.clairai-mcp.svc.cluster.local:8080/mcp" \
  --set-string "env[3].name=LOKI_MCP_URL" \
  --set-string "env[3].value=http://loki-mcp-server.clairai-mcp.svc.cluster.local:8080/stream" \
  --set-string "env[4].name=BILLING_MCP_URL" \
  --set-string "env[4].value=http://billing-cost-mcp-server.clairai-mcp.svc.cluster.local:8080/mcp" \
  --wait --timeout 5m

11. Deploy MCP Servers

11.1 Prometheus MCP Server

helm install prometheus-mcp-server /tmp/clairai/clairai \
  --namespace clairai-mcp \
  --set deploy.enabled=true \
  --set deployment.enabled=true \
  --set nameOverride=prometheus-mcp-server \
  --set fullnameOverride=prometheus-mcp-server \
  --set image.repository=709825985650.dkr.ecr.us-east-1.amazonaws.com/info-services/clairai \
  --set image.tag=v1.0.1-prometheus-mcp \
  --set serviceAccount.create=false \
  --set serviceAccount.name=clairai-sa \
  --set service.type=ClusterIP \
  --set "service.ports[0].port=8080" \
  --set "service.ports[0].targetPort=8080" \
  --set-string "env[0].name=AWS_REGION" \
  --set-string "env[0].value=<REGION>" \
  --set-string "env[1].name=PROMETHEUS_URL" \
  --set-string "env[1].value=https://aps-workspaces.<REGION>.amazonaws.com/workspaces/<WORKSPACE_ID>" \
  --wait --timeout 5m

11.2 Loki MCP Server

helm install loki-mcp-server /tmp/clairai/clairai \
  --namespace clairai-mcp \
  --set deploy.enabled=true \
  --set deployment.enabled=true \
  --set nameOverride=loki-mcp-server \
  --set fullnameOverride=loki-mcp-server \
  --set image.repository=709825985650.dkr.ecr.us-east-1.amazonaws.com/info-services/clairai \
  --set image.tag=v1.0.1-loki-mcp \
  --set serviceAccount.create=false \
  --set serviceAccount.name=clairai-sa \
  --set service.type=ClusterIP \
  --set "service.ports[0].port=8080" \
  --set "service.ports[0].targetPort=8080" \
  --set-string "env[0].name=LOKI_URL" \
  --set-string "env[0].value=http://loki-gateway.<LOKI_NAMESPACE>.svc.cluster.local" \
  --wait --timeout 5m

11.3 Billing MCP Server

helm install billing-cost-mcp-server /tmp/clairai/clairai \
  --namespace clairai-mcp \
  --set deploy.enabled=true \
  --set deployment.enabled=true \
  --set nameOverride=billing-cost-mcp-server \
  --set fullnameOverride=billing-cost-mcp-server \
  --set image.repository=709825985650.dkr.ecr.us-east-1.amazonaws.com/info-services/clairai \
  --set image.tag=v1.0.1-billing-mcp \
  --set serviceAccount.create=false \
  --set serviceAccount.name=clairai-sa \
  --set service.type=ClusterIP \
  --set "service.ports[0].port=8080" \
  --set "service.ports[0].targetPort=8080" \
  --set-string "env[0].name=AWS_REGION" \
  --set-string "env[0].value=<REGION>" \
  --wait --timeout 5m

11.4 YACE (CloudWatch Exporter)

helm install clairai-yace /tmp/clairai/clairai \
  --namespace clairai-metrics-manager \
  --set deploy.enabled=true \
  --set deployment.enabled=true \
  --set nameOverride=clairai-yace \
  --set fullnameOverride=clairai-yace \
  --set image.repository=709825985650.dkr.ecr.us-east-1.amazonaws.com/info-services/clairai \
  --set image.tag=v1.0.1-yace \
  --set serviceAccount.create=false \
  --set serviceAccount.name=clairai-sa \
  --set service.type=ClusterIP \
  --set "service.ports[0].port=9090" \
  --set "service.ports[0].targetPort=9090" \
  --wait --timeout 5m

12. Create Ingress (ALB)

Requires AWS Load Balancer Controller installed on the cluster.

# clairai-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: clairai-ingress
  namespace: clairai-core
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/load-balancer-name: clairai-alb
    alb.ingress.kubernetes.io/group.name: clairai
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]'
    alb.ingress.kubernetes.io/healthcheck-path: /
    alb.ingress.kubernetes.io/healthcheck-port: "8080"
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: clairai-backend
                port:
                  number: 80
          - path: /
            pathType: Prefix
            backend:
              service:
                name: clairai-frontend
                port:
                  number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: clairai-agent-ingress
  namespace: clairai-agent
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/load-balancer-name: clairai-alb
    alb.ingress.kubernetes.io/group.name: clairai
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]'
    alb.ingress.kubernetes.io/healthcheck-path: /health
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /v1
            pathType: Prefix
            backend:
              service:
                name: clairai-assistant
                port:
                  number: 80
kubectl apply -f clairai-ingress.yaml

13. Validate Deployment and Application Health

# Check all pods
kubectl get pods -A | grep clairai

# Check services
kubectl get svc -A | grep clairai

# Check ingress (ALB DNS)
kubectl get ingress -A

# Test backend health
kubectl exec -n clairai-core deploy/clairai-backend -- curl -s localhost:8000/

# Test frontend
kubectl exec -n clairai-core deploy/clairai-backend -- curl -s http://clairai-frontend.clairai-core.svc.cluster.local/

Expected: All pods Running, ALB provisioned with DNS name.

14. Monitoring and Logs

kubectl logs -n clairai-core deploy/clairai-backend --tail=50
kubectl logs -n clairai-agent deploy/clairai-assistant --tail=50
kubectl logs -n clairai-mcp deploy/prometheus-mcp-server --tail=50
kubectl logs -n clairai-mcp deploy/billing-cost-mcp-server --tail=50

15. Upgrade Instructions

helm upgrade clairai-backend /tmp/clairai/clairai \
  --namespace clairai-core \
  --set image.tag=<NEW_TAG> \
  --reuse-values --wait

16. Uninstall Instructions

helm uninstall clairai-yace -n clairai-metrics-manager
helm uninstall billing-cost-mcp-server -n clairai-mcp
helm uninstall loki-mcp-server -n clairai-mcp
helm uninstall prometheus-mcp-server -n clairai-mcp
helm uninstall clairai-assistant -n clairai-agent
helm uninstall clairai-frontend -n clairai-core
helm uninstall clairai-backend -n clairai-core

kubectl delete namespace clairai-metrics-manager clairai-mcp clairai-agent clairai-core

17. Troubleshooting

Issue Cause Fix
ImagePullBackOff ECR auth or subscription inactive Re-run helm registry login
Backend 500 "Unable to locate credentials" Missing IRSA Annotate SA with IAM role
Agent CrashLoopBackOff Billing MCP not deployed Deploy billing-cost-mcp-server first
Frontend 502 Bad Gateway ALB target group unhealthy Check targetPort is 8080 (not 80)
Double /api/api path Wrong REACT_APP_API_BASE_URL Set to ALB URL without /api suffix
ALB not provisioning ALB controller IRSA broken Check controller logs, fix IAM role trust

18. AWS Service Quotas and Cost Guidance

Resource Estimated Cost
EKS control plane $0.10/hr
2-3 worker nodes (t3.large) ~$0.08/hr each
ALB ~$0.02/hr + LCU
AMP Based on ingestion volume
Bedrock (Claude 3) Per-token pricing
DynamoDB On-demand pricing

19. Support

Contact: support@infoservices.com

Include: AWS Region, K8s version, chart version, pod logs, and values.yaml (secrets removed).