A read-only scan of your account produces a specific, actionable cost report — idle resources, storage mismatches, Savings Plan gaps — in about ten minutes.
We analyze your actual EC2, RDS, S3, EBS, ElastiCache, and Savings Plan coverage against 30 days of CloudWatch data — then tell you exactly where the money is going.
Run our scanner in your own account, receive a line-item breakdown of every saving we find. No agents, no IAM role for us, no follow-up call.
Each finding is priced against your on-demand rates and actual usage over the last 30 days — not a generic checklist.
One terminal command, using credentials you already have. Nothing installed, no roles granted to us, no agents left behind.
# Export read-only AWS credentials (dedicated role, user, or SSO session) export AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... # We email you a personalised one-liner with UPLOAD_URL / TOKEN / SCAN_ID docker run --rm \ -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY \ -e AWS_SESSION_TOKEN \ -e UPLOAD_URL -e UPLOAD_TOKEN -e SCAN_ID \ public.ecr.aws/f6g2d1g7/cloudhero/scan:latest # → Reads inventory + CloudWatch + Cost Explorer # → Encrypts findings locally (AES-256-GCM + RSA-4096) # → Uploads encrypted payload, then exits
~/.aws.arn:aws:iam::aws:policy/ReadOnlyAccess
›
Our scanner asks for AWS-managed ReadOnlyAccess, plus Cost Explorer read. If you prefer least-privilege, here it is:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"ec2:Describe*", "rds:Describe*",
"s3:ListAllMyBuckets", "s3:GetBucketLocation",
"s3:GetBucketLifecycleConfiguration", "s3:GetBucketTagging",
"elasticache:Describe*", "elasticfilesystem:Describe*",
"eks:List*", "eks:Describe*",
"es:List*", "es:Describe*",
"elasticloadbalancing:Describe*",
"cloudfront:ListDistributions", "cloudfront:GetDistribution",
"cloudwatch:GetMetricStatistics",
"logs:DescribeLogGroups",
"ce:Get*", "savingsplans:Describe*",
"sts:GetCallerIdentity"
],
"Resource": "*"
}]
}
No iam:*, no *:GetObject, no mutating actions. IAM policies, secrets, and object contents are out of reach.
Payload is AES-256-GCM encrypted on your machine with a fresh key wrapped in our RSA-OAEP public key. Plaintext never leaves your network.
Describe*, List*, and Get* call before the encrypted payload is uploaded. Pin the image digest instead of :latest to audit the exact binary running in your account.aws sts assume-role to export temporary credentials into your shell for each member account, then run the container. The scan UI issues one upload URL per submission.security@cloudhero.io.No call to schedule, no NDA, no agent installed. Just a report.
Start the assessmentWe sent a 6-digit code to .
Run this when you're ready — takes about 5 minutes. We've emailed the full instructions to .
docker run --rm \ -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY \ -e AWS_SESSION_TOKEN \ -e UPLOAD_URL -e UPLOAD_TOKEN -e SCAN_ID \ public.ecr.aws/f6g2d1g7/cloudhero/scan:latest
Reply to the email with questions — a human answers in hours, not days.