cloudfront_distribution_pricing_classcw_log_group_without_retentiondynamodb_stale_dataebs_volumes_not_using_gp3ec2_application_lb_unusedec2_classic_lb_unusedec2_gateway_lb_unusedec2_network_lb_unusedec2_reserved_instance_lease_expiration_daysecs_cluster_low_utilizationecs_service_without_autoscalingelasticache_long_running_clusteremr_cluster_instance_prev_genemr_cluster_is_idle_30_minutesgp2_ebs_volumeshigh_iops_volumesinactive_ebs_volumesio1_ebs_volumeslambda_function_excessive_timeoutlambda_function_high_error_ratelarge_ebs_volumeslarge_ec2_instanceslong_running_instanceslow_connections_rds_metricslow_iops_volumeslow_usage_ebs_volumeslow_usage_rds_metricslow_utilization_ec2_instancemonthly_service_cost_changesmultiple_cloudtrail_trailsmultiple_regional_trailsold_ebs_snapshotsold_rds_db_instancesprev_gen_rds_instancesredshift_cluster_low_utilizationredshift_cluster_max_ageredshift_cluster_schedule_pause_resume_enableds3_bucket_without_lifecyclestale_cw_log_streamunattached_ebs_volumesunattached_eipsvpc_nat_gateway_unused
Query: low_utilization_ec2_instance
Usage
steampipe query aws_thrifty.query.low_utilization_ec2_instance
Plugins & Tables
SQL
with ec2_instance_utilization as ( select instance_id, round(cast(sum(maximum)/count(maximum) as numeric), 1) as avg_max, count(maximum) days from aws_ec2_instance_metric_cpu_utilization_daily where date_part('day', now() - timestamp) <= 30 group by instance_id)select arn as resource, case when avg_max is null then 'error' when avg_max < $1 then 'alarm' when avg_max < $2 then 'info' else 'ok' end as status, case when avg_max is null then 'CloudWatch metrics not available for ' || title || '.' else title || ' is averaging ' || avg_max || '% max utilization over the last ' || days || ' days.' end as reason, region, account_idfrom aws_ec2_instance i left join ec2_instance_utilization as u on u.instance_id = i.instance_id;
Controls
The query is being used by the following controls: