Skip to content

ZeroWaste IAM Permissions Reference

ZeroWaste uses its own read-only IAM role, separate from the core AWS connection. The role lets CloudForecast scan your resources for waste, such as unattached volumes, idle load balancers, and over-provisioned instances. It cannot create, change, stop, or delete anything.

This page walks through the full role, statement by statement, so you know exactly what you are granting.

The template: cloudforecast-zw-setup-v2.json

Setup steps are in Setting Up ZeroWaste.


Every permission in the role is a read-only Describe, Get, or List call.

PermissionUsed for
ec2:DescribeInstancesPrevious-generation and over-provisioned EC2 instances
ec2:DescribeVolumesUnattached or idle EBS volumes, and gp2 volumes that can move to gp3
ec2:DescribeSnapshotsEBS snapshots older than 90 days
rds:DescribeDBInstancesUnused and over-provisioned RDS databases, and gp2 storage that can move to gp3
rds:DescribeDBSnapshotsNot used by any current check (see below)
elasticloadbalancing:DescribeLoadBalancersUnused Application, Network, and Classic Load Balancers
elasticloadbalancing:DescribeTagsTags on Application and Network Load Balancers
s3:ListAllMyBucketsListing your S3 buckets
s3:ListBucketIncluded with the S3 check. ZeroWaste does not list or read objects
s3:GetBucketLocationFinding each bucket’s region
s3:GetBucketTaggingTags on S3 buckets
s3:GetLifecycleConfigurationS3 buckets with no lifecycle rules
logs:DescribeLogGroupsCloudWatch log groups with no retention period
cloudwatch:GetMetricStatistics14 days of usage metrics for the checks above
tag:GetResourcesTags on Classic Load Balancers and log groups
organizations:ListAccountsNot used by any current check (see below)

Every statement uses "Resource": "*", because AWS does not support resource-level restrictions for these describe and list calls.


The role can only be assumed by CloudForecast, and only with your External ID.

SettingValue
Role nameCloudForecast-ZeroWaste by default (the RoleName parameter). CloudForecast must know the name, so it is also the stack’s only output
Trusted principalOne specific CloudForecast IAM role, arn:aws:iam::656227328603:role/<CloudForecastAccessRole>. Not the whole CloudForecast AWS account
External IDRequired on every sts:AssumeRole call. It is unique to your CloudForecast account and prevents confused deputy access
CloudForecastAccessRoleThe CloudForecast role allowed to assume this one. The template only accepts the two CloudForecast roles listed in its AllowedValues

  • Accounts: The payer account where you launch the stack, plus any member accounts where you deploy the role with a CloudFormation StackSet. An account without the role is not scanned.
  • Regions: Only the account and region pairs that show spend in your Cost & Usage Report. CloudForecast does not sweep every AWS region.
  • Lookback: Checks that use CloudWatch metrics look at the last 14 days.

The template creates one IAM policy per check, so you can see in the IAM console which permission belongs to which check. Policy names below match what you will see in your account.

Policies: CloudForecast-ZW-Ec2PreviousGeneration, CloudForecast-ZW-Ec2OverProvisioned

ec2:DescribeInstances
  • Previous-generation instances: running instances in older families (such as t2, m4, c4, r4, i2, p2) that are candidates for an upgrade to a current generation.
  • Over-provisioned instances: running instances at least 14 days old whose maximum CPU stayed under 40% for the last 14 days, for the supported general-purpose and burstable instance types.

What we read: instance type, state, launch time, and tags. We never connect to instances or read anything running on them.


Policies: CloudForecast-ZW-EbsUnusedOrUnattached, CloudForecast-ZW-EbsOldSnapshots

ec2:DescribeVolumes
ec2:DescribeSnapshots
  • Unused or unattached volumes: volumes older than 15 days that are not attached to any instance, or that had zero reads and writes in the last 14 days.
  • gp2 to gp3: gp2 volumes older than 15 days whose usage stays within gp3’s baseline performance, so they can move to the cheaper gp3 type.
  • Old snapshots: EBS snapshots 90 days or older.

What we read: volume and snapshot metadata, such as type, size, state, attachments, creation date, and tags. We never read the data stored on volumes or snapshots.


Policies: CloudForecast-ZW-RdsUnused, CloudForecast-ZW-RdsOverProvisioned, CloudForecast-ZW-RdsResizeStoreage

rds:DescribeDBInstances
  • Unused databases: instances older than 14 days with no connections in the last 14 days. Neptune is excluded.
  • Over-provisioned databases: instances older than 14 days whose maximum CPU stayed under 40% for the last 14 days, for the supported instance classes.
  • gp2 to gp3 storage: instances on gp2 storage whose usage stays within gp3’s baseline performance.

What we read: instance class, engine, storage type, creation date, and tags. We never connect to your databases or read their data.


Policies: CloudForecast-ZW-AlbUnusedPolicy, CloudForecast-ZW-ElbUnused

elasticloadbalancing:DescribeLoadBalancers
elasticloadbalancing:DescribeTags
  • Unused Application Load Balancers: older than 14 days with no requests in the last 14 days.
  • Unused Network Load Balancers: older than 14 days with no traffic in the last 14 days.
  • Unused Classic Load Balancers: no registered instances.

What we read: load balancer type, creation date, registered instances, and tags. We never read listener rules, certificates, or traffic.


Policy: CloudForecast-ZW-S3PolicyCheck

s3:ListAllMyBuckets
s3:ListBucket
s3:GetBucketLocation
s3:GetBucketTagging
s3:GetLifecycleConfiguration
  • Buckets without lifecycle rules: buckets with no lifecycle configuration, where old objects and versions can build up storage costs.

What we read: the bucket list, plus each bucket’s region, tags, and lifecycle configuration. Those are the only three bucket calls ZeroWaste makes. s3:ListBucket is part of the policy, but ZeroWaste never lists, opens, or downloads objects in your buckets.


Policy: CloudForecast-Aws-CloudWatch-Logs

logs:DescribeLogGroups
  • Log groups that never expire: log groups with no retention period, which keep storing logs indefinitely.

What we read: log group names and retention settings. We never read log events.


Policy: CloudForecast-Aws-Common-Policy

cloudwatch:GetMetricStatistics
tag:GetResources
  • Metrics: 14 days of summary statistics behind the checks above. These are EC2 and RDS CPU utilization, RDS connections, EBS and RDS read and write operations and throughput, ALB request count, and NLB processed bytes.
  • Tags: tags for Classic Load Balancers and log groups, which the other describe calls don’t return. Tags let you filter ZeroWaste by team, cost group, or environment.

What we read: historical metric statistics and resource tags only. We don’t read or create alarms, dashboards, or tag values on any other resources.


The template grants two permissions that no current ZeroWaste check uses:

  • rds:DescribeDBSnapshots (policy CloudForecast-ZW-RdsOldSnapshot): reserved for an old RDS snapshot check. ZeroWaste does not currently flag RDS snapshots.
  • organizations:ListAccounts (policy CloudForecast-Aws-Organization-Policy): CloudForecast lists your organization’s accounts through the core AWS connection, not through this role.

Both are read-only. If you prefer not to grant them, contact support@cloudforecast.io before removing them.


Recommendations That Need No ZeroWaste Permissions

Section titled “Recommendations That Need No ZeroWaste Permissions”

Some ZeroWaste recommendations come from data CloudForecast already has, so they need nothing from this role:


PropertyDetail
Access typeRead-only. No Create*, Put*, Update*, Delete*, Stop*, or Modify* actions
PrincipalOne specific CloudForecast role, not the whole CloudForecast account
AuthenticationExternal ID required on every role assumption, unique per CloudForecast customer
Data accessedResource configuration, tags, and CloudWatch metric statistics. Never object contents, database data, volume data, or log events
Resource writesNone. ZeroWaste only recommends. Your team decides what to change
Data in transitAll AWS API calls use HTTPS / TLS

Delete the ZeroWaste CloudFormation stack in your payer account, and the StackSet if you deployed one to member accounts. This deletes the role and all of its policies. ZeroWaste stops scanning, and your core cost reporting is not affected.

If you have questions about any permission or need a security review, contact support@cloudforecast.io.