@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
text/typescript
/*
* © 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
[]: 98.12,
[]: 81.32,
[]: 69.65,
[]: 27.71,
[]: 19.56,
[]: 16.7,
[]: 9.67,
[]: 89.6,
[]: 129.78,
[]: 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
[]: 0.64,
[]: 0.65,
[]: 0.71,
[]: 1,
[]: 1.14,
[]: 2.17,
[]: 3.04,
[]: 0.82,
[]: 0.47,
[]: 0.47,
// GPUs
[]: 26,
[]: 18,
[]: 8,
[]: 35,
[]: 35,
[]: 35,
[]: 46,
[]: 9,
[]: 36,
[]: 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
[]: 3.97,
[]: 4.26,
[]: 3.69,
[]: 4.74,
[]: 5.42,
[]: 8.58,
[]: 8.25,
[]: 2.55,
[]: 1.69,
[]: 1.69,
// GPUs
[]: 229,
[]: 153,
[]: 71,
[]: 306,
[]: 306,
[]: 306,
[]: 407,
[]: 76.5,
[]: 306,
[]: 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 =
{
[]: US_NERC_REGIONS_EMISSIONS_FACTORS.SERC,
[]: US_NERC_REGIONS_EMISSIONS_FACTORS.RFC,
[]: US_NERC_REGIONS_EMISSIONS_FACTORS.WECC,
[]: US_NERC_REGIONS_EMISSIONS_FACTORS.WECC,
[]: US_NERC_REGIONS_EMISSIONS_FACTORS.SERC,
[]: US_NERC_REGIONS_EMISSIONS_FACTORS.WECC,
[]: 0.0009006,
[]: 0.00071,
[]: 0.0007082,
[]: 0.0004658,
[]: 0.0004156,
[]: 0.000408,
[]: 0.00076,
[]: 0.0007177,
[]: 0.0004658,
[]: 0.00012,
[]: 0.0005374,
[]: 0.0005374,
[]: 0.000311,
[]: 0.0002786,
[]: 0.000225,
[]: 0.0002134,
[]: 0.0000511,
[]: 0.0000088,
[]: 0.0005059,
[]: 0.0004041,
[]: 0.0000617,
[]: 0.00039278188, // Average of the above regions
}