UNPKG

@cloud-carbon-footprint/aws

Version:

The core logic to get cloud usage data and estimate energy and carbon emissions from Amazon Web Services.

185 lines (181 loc) 6.93 kB
/* * © 2021 Thoughtworks, Inc. */ import { getAverage, getWattsByAverageOrMedian, CloudConstantsByProvider, CloudConstantsEmissionsFactors, COMPUTE_PROCESSOR_TYPES, EstimateUnknownUsageBy, US_NERC_REGIONS_EMISSIONS_FACTORS, } from '@cloud-carbon-footprint/core' import { AWS_REGIONS } from '../lib/AWSRegions' export const AWS_CLOUD_CONSTANTS: CloudConstantsByProvider = { SSDCOEFFICIENT: 1.2, // watt hours / terabyte hour HDDCOEFFICIENT: 0.65, // watt hours / terabyte hour MEMORY_AVG: 80.69, MEMORY_BY_COMPUTE_PROCESSOR: { // gigaBytes / physical chip [COMPUTE_PROCESSOR_TYPES.CASCADE_LAKE]: 98.12, [COMPUTE_PROCESSOR_TYPES.SKYLAKE]: 81.32, [COMPUTE_PROCESSOR_TYPES.BROADWELL]: 69.65, [COMPUTE_PROCESSOR_TYPES.HASWELL]: 27.71, [COMPUTE_PROCESSOR_TYPES.COFFEE_LAKE]: 19.56, [COMPUTE_PROCESSOR_TYPES.SANDY_BRIDGE]: 16.7, [COMPUTE_PROCESSOR_TYPES.IVY_BRIDGE]: 9.67, [COMPUTE_PROCESSOR_TYPES.AMD_EPYC_1ST_GEN]: 89.6, [COMPUTE_PROCESSOR_TYPES.AMD_EPYC_2ND_GEN]: 129.78, [COMPUTE_PROCESSOR_TYPES.AWS_GRAVITON_2]: 129.78, }, getMemory: (computeProcessors: string[]): number => { const memoryForProcessors: number[] = computeProcessors.map( (processor: string) => { return AWS_CLOUD_CONSTANTS.MEMORY_BY_COMPUTE_PROCESSOR[processor] }, ) const averageMemoryForProcessors = getAverage(memoryForProcessors) return averageMemoryForProcessors ? averageMemoryForProcessors : AWS_CLOUD_CONSTANTS.MEMORY_AVG }, MIN_WATTS_AVG: 0.74, MIN_WATTS_BY_COMPUTE_PROCESSOR: { // CPUs [COMPUTE_PROCESSOR_TYPES.CASCADE_LAKE]: 0.64, [COMPUTE_PROCESSOR_TYPES.SKYLAKE]: 0.65, [COMPUTE_PROCESSOR_TYPES.BROADWELL]: 0.71, [COMPUTE_PROCESSOR_TYPES.HASWELL]: 1, [COMPUTE_PROCESSOR_TYPES.COFFEE_LAKE]: 1.14, [COMPUTE_PROCESSOR_TYPES.SANDY_BRIDGE]: 2.17, [COMPUTE_PROCESSOR_TYPES.IVY_BRIDGE]: 3.04, [COMPUTE_PROCESSOR_TYPES.AMD_EPYC_1ST_GEN]: 0.82, [COMPUTE_PROCESSOR_TYPES.AMD_EPYC_2ND_GEN]: 0.47, [COMPUTE_PROCESSOR_TYPES.AWS_GRAVITON_2]: 0.47, // GPUs [COMPUTE_PROCESSOR_TYPES.NVIDIA_K520]: 26, [COMPUTE_PROCESSOR_TYPES.NVIDIA_A10G]: 18, [COMPUTE_PROCESSOR_TYPES.NVIDIA_T4]: 8, [COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_M60]: 35, [COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_K80]: 35, [COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_V100]: 35, [COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_A100]: 46, [COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_P4]: 9, [COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_P100]: 36, [COMPUTE_PROCESSOR_TYPES.AMD_RADEON_PRO_V520]: 26, }, getMinWatts: (computeProcessors: string[]): number => { const minWattsForProcessors: number[] = computeProcessors.map( (processor: string) => { return AWS_CLOUD_CONSTANTS.MIN_WATTS_BY_COMPUTE_PROCESSOR[processor] }, ) const averageWattsForProcessors = getWattsByAverageOrMedian( computeProcessors, minWattsForProcessors, ) return averageWattsForProcessors ? averageWattsForProcessors : AWS_CLOUD_CONSTANTS.MIN_WATTS_AVG }, MAX_WATTS_AVG: 3.5, MAX_WATTS_BY_COMPUTE_PROCESSOR: { // CPUs [COMPUTE_PROCESSOR_TYPES.CASCADE_LAKE]: 3.97, [COMPUTE_PROCESSOR_TYPES.SKYLAKE]: 4.26, [COMPUTE_PROCESSOR_TYPES.BROADWELL]: 3.69, [COMPUTE_PROCESSOR_TYPES.HASWELL]: 4.74, [COMPUTE_PROCESSOR_TYPES.COFFEE_LAKE]: 5.42, [COMPUTE_PROCESSOR_TYPES.SANDY_BRIDGE]: 8.58, [COMPUTE_PROCESSOR_TYPES.IVY_BRIDGE]: 8.25, [COMPUTE_PROCESSOR_TYPES.AMD_EPYC_1ST_GEN]: 2.55, [COMPUTE_PROCESSOR_TYPES.AMD_EPYC_2ND_GEN]: 1.69, [COMPUTE_PROCESSOR_TYPES.AWS_GRAVITON_2]: 1.69, // GPUs [COMPUTE_PROCESSOR_TYPES.NVIDIA_K520]: 229, [COMPUTE_PROCESSOR_TYPES.NVIDIA_A10G]: 153, [COMPUTE_PROCESSOR_TYPES.NVIDIA_T4]: 71, [COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_M60]: 306, [COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_K80]: 306, [COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_V100]: 306, [COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_A100]: 407, [COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_P4]: 76.5, [COMPUTE_PROCESSOR_TYPES.NVIDIA_TESLA_P100]: 306, [COMPUTE_PROCESSOR_TYPES.AMD_RADEON_PRO_V520]: 229, }, getMaxWatts: (computeProcessors: string[]): number => { const maxWattsForProcessors: number[] = computeProcessors.map( (processor: string) => { return AWS_CLOUD_CONSTANTS.MAX_WATTS_BY_COMPUTE_PROCESSOR[processor] }, ) const averageWattsForProcessors = getWattsByAverageOrMedian( computeProcessors, maxWattsForProcessors, ) return averageWattsForProcessors ? averageWattsForProcessors : AWS_CLOUD_CONSTANTS.MAX_WATTS_AVG }, NETWORKING_COEFFICIENT: 0.001, // kWh / Gb MEMORY_COEFFICIENT: 0.000392, // kWh / Gb PUE_AVG: 1.135, getPUE: (): number => { return AWS_CLOUD_CONSTANTS.PUE_AVG }, AVG_CPU_UTILIZATION_2020: 50, REPLICATION_FACTORS: { S3: 6, S3_ONE_ZONE_REDUCED_REDUNDANCY: 2, EC2_EBS_VOLUME: 2, EC2_EBS_SNAPSHOT: 3, EFS: 3, EFS_ONE_ZONE: 2, RDS_BACKUP: 3, RDS_AURORA: 6, RDS_MULTI_AZ: 2, DOCUMENT_DB_BACKUP: 3, DOCUMENT_DB_STORAGE: 2, DYNAMO_DB: 2, ECR_STORAGE: 3, DOCUMENT_ELASTICACHE_BACKUP: 3, SIMPLE_DB: 2, DEFAULT: 1, }, KILOWATT_HOURS_BY_SERVICE_AND_USAGE_UNIT: { total: {}, }, ESTIMATE_UNKNOWN_USAGE_BY: EstimateUnknownUsageBy.COST, SERVER_EXPECTED_LIFESPAN: 35040, // 4 years in hours } export const AWS_EMISSIONS_FACTORS_METRIC_TON_PER_KWH: CloudConstantsEmissionsFactors = { [AWS_REGIONS.US_EAST_1]: US_NERC_REGIONS_EMISSIONS_FACTORS.SERC, [AWS_REGIONS.US_EAST_2]: US_NERC_REGIONS_EMISSIONS_FACTORS.RFC, [AWS_REGIONS.US_WEST_1]: US_NERC_REGIONS_EMISSIONS_FACTORS.WECC, [AWS_REGIONS.US_WEST_2]: US_NERC_REGIONS_EMISSIONS_FACTORS.WECC, [AWS_REGIONS.US_GOV_EAST_1]: US_NERC_REGIONS_EMISSIONS_FACTORS.SERC, [AWS_REGIONS.US_GOV_WEST_1]: US_NERC_REGIONS_EMISSIONS_FACTORS.WECC, [AWS_REGIONS.AF_SOUTH_1]: 0.0009006, [AWS_REGIONS.AP_EAST_1]: 0.00071, [AWS_REGIONS.AP_SOUTH_1]: 0.0007082, [AWS_REGIONS.AP_NORTHEAST_3]: 0.0004658, [AWS_REGIONS.AP_NORTHEAST_2]: 0.0004156, [AWS_REGIONS.AP_SOUTHEAST_1]: 0.000408, [AWS_REGIONS.AP_SOUTHEAST_2]: 0.00076, [AWS_REGIONS.AP_SOUTHEAST_3]: 0.0007177, [AWS_REGIONS.AP_NORTHEAST_1]: 0.0004658, [AWS_REGIONS.CA_CENTRAL_1]: 0.00012, [AWS_REGIONS.CN_NORTH_1]: 0.0005374, [AWS_REGIONS.CN_NORTHWEST_1]: 0.0005374, [AWS_REGIONS.EU_CENTRAL_1]: 0.000311, [AWS_REGIONS.EU_WEST_1]: 0.0002786, [AWS_REGIONS.EU_WEST_2]: 0.000225, [AWS_REGIONS.EU_SOUTH_1]: 0.0002134, [AWS_REGIONS.EU_WEST_3]: 0.0000511, [AWS_REGIONS.EU_NORTH_1]: 0.0000088, [AWS_REGIONS.ME_SOUTH_1]: 0.0005059, [AWS_REGIONS.ME_CENTRAL_1]: 0.0004041, [AWS_REGIONS.SA_EAST_1]: 0.0000617, [AWS_REGIONS.UNKNOWN]: 0.00039278188, // Average of the above regions }