From 59dc5d4b678c80aa50f110d6c2028842fd11f3b2 Mon Sep 17 00:00:00 2001 From: Seth Hoenig Date: Tue, 6 Oct 2020 11:42:02 -0500 Subject: [PATCH] env_aws: get ec2 cpu perf data from AWS API Previously, Nomad was using a hand-made lookup table for looking up EC2 CPU performance characteristics (core count + speed = ticks). This data was incomplete and incorrect depending on region. The AWS API has the correct data but requires API keys to use (i.e. should not be queried directly from Nomad). This change introduces a lookup table generated by a docker image based on the Amazon cli tool. https://hub.docker.com/r/hashicorpnomad/ec2info The docker image is created from https://github.com/hashicorp/nomad-ec2info. Going forward, Nomad can incorporate regeneration of the lookup table somewhere in the CI pipeline so that we remain up-to-date on the latest offerings from EC2. Fixes #7830 --- CHANGELOG.md | 1 + client/fingerprint/env_aws.go | 390 +----- client/fingerprint/env_aws_cpuinfo.go | 1620 +++++++++++++++++++++++++ client/fingerprint/env_aws_test.go | 34 +- 4 files changed, 1683 insertions(+), 362 deletions(-) create mode 100644 client/fingerprint/env_aws_cpuinfo.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 823b2b729b9a..6a156d6d2787 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ IMPROVEMENTS: * client: Added support for Azure fingerprinting. [[GH-8979](https://github.com/hashicorp/nomad/issues/8979)] * client: Added support for fingerprinting the client node's Consul segment. [[GH-7214](https://github.com/hashicorp/nomad/issues/7214)] * client: Updated consul-template to v0.25.0 - config function_blacklist deprecated and replaced with function_denylist [[GH-8988](https://github.com/hashicorp/nomad/pull/8988)] + * client: Use ec2 CPU perf data from AWS API [[GH-7830](https://github.com/hashicorp/nomad/issues/7830)] * consul: Support Consul namespace (Consul Enterprise) in client configuration. [[GH-8849](https://github.com/hashicorp/nomad/pull/8849)] * driver/docker: Upgrade pause container and detect architecture [[GH-8957](https://github.com/hashicorp/nomad/pull/8957)] * jobspec: Lowered minimum CPU allowed from 10 to 1. [[GH-8996](https://github.com/hashicorp/nomad/issues/8996)] diff --git a/client/fingerprint/env_aws.go b/client/fingerprint/env_aws.go index bfe4ea24d571..4d1c63edff94 100644 --- a/client/fingerprint/env_aws.go +++ b/client/fingerprint/env_aws.go @@ -46,353 +46,6 @@ var ec2NetSpeedTable = map[*regexp.Regexp]int{ regexp.MustCompile(`.*\.32xlarge`): 10000, } -type ec2Specs struct { - mhz float64 - cores int - model string -} - -func (e ec2Specs) ticks() int { - return int(e.mhz) * e.cores -} - -func specs(ghz float64, vCores int, model string) ec2Specs { - return ec2Specs{ - mhz: ghz * 1000, - cores: vCores, - model: model, - } -} - -// Map of instance type to documented CPU speed. -// -// Most values are taken from https://aws.amazon.com/ec2/instance-types/. -// Values for a1 & m6g (Graviton) are taken from https://en.wikichip.org/wiki/annapurna_labs/alpine/al73400 -// Values for inf1 are taken from launching a inf1.xlarge and looking at /proc/cpuinfo -// -// In a few cases, AWS has upgraded the generation of CPU while keeping the same -// instance designation. Since it is possible to launch on the lower performance -// CPU, that one is used as the spec for the instance type. -// -// This table is provided as a best-effort to determine the number of CPU ticks -// available for use by Nomad tasks. If an instance type is missing, the fallback -// behavior is to use values from go-psutil, which is only capable of reading -// "current" CPU MHz. -var ec2ProcSpeedTable = map[string]ec2Specs{ - // -- General Purpose -- - - // a1 - "a1.medium": specs(2.3, 1, "AWS Graviton"), - "a1.large": specs(2.3, 2, "AWS Graviton"), - "a1.xlarge": specs(2.3, 4, "AWS Graviton"), - "a1.2xlarge": specs(2.3, 8, "AWS Graviton"), - "a1.4xlarge": specs(2.3, 16, "AWS Graviton"), - "a1.metal": specs(2.3, 16, "AWS Graviton"), - - // t3 - "t3.nano": specs(2.5, 2, "2.5 GHz Intel Scalable"), - "t3.micro": specs(2.5, 2, "2.5 GHz Intel Scalable"), - "t3.small": specs(2.5, 2, "2.5 GHz Intel Scalable"), - "t3.medium": specs(2.5, 2, "2.5 GHz Intel Scalable"), - "t3.large": specs(2.5, 2, "2.5 GHz Intel Scalable"), - "t3.xlarge": specs(2.5, 4, "2.5 GHz Intel Scalable"), - "t3.2xlarge": specs(2.5, 8, "2.5 GHz Intel Scalable"), - - // t3a - "t3a.nano": specs(2.5, 2, "2.5 GHz AMD EPYC 7000 series"), - "t3a.micro": specs(2.5, 2, "2.5 GHz AMD EPYC 7000 series"), - "t3a.small": specs(2.5, 2, "2.5 GHz AMD EPYC 7000 series"), - "t3a.medium": specs(2.5, 2, "2.5 GHz AMD EPYC 7000 series"), - "t3a.large": specs(2.5, 2, "2.5 GHz AMD EPYC 7000 series"), - "t3a.xlarge": specs(2.5, 4, "2.5 GHz AMD EPYC 7000 series"), - "t3a.2xlarge": specs(2.5, 8, "2.5 GHz AMD EPYC 7000 series"), - - // t2 - "t2.nano": specs(3.3, 1, "3.3 GHz Intel Scalable"), - "t2.micro": specs(3.3, 1, "3.3 GHz Intel Scalable"), - "t2.small": specs(3.3, 1, "3.3 GHz Intel Scalable"), - "t2.medium": specs(3.3, 2, "3.3 GHz Intel Scalable"), - "t2.large": specs(3.0, 2, "3.0 GHz Intel Scalable"), - "t2.xlarge": specs(3.0, 4, "3.0 GHz Intel Scalable"), - "t2.2xlarge": specs(3.0, 8, "3.0 GHz Intel Scalable"), - - // m6g - "m6g.medium": specs(2.3, 1, "AWS Graviton2 Neoverse"), - "m6g.large": specs(2.3, 2, "AWS Graviton2 Neoverse"), - "m6g.xlarge": specs(2.3, 4, "AWS Graviton2 Neoverse"), - "m6g.2xlarge": specs(2.3, 8, "AWS Graviton2 Neoverse"), - "m6g.4xlarge": specs(2.3, 16, "AWS Graviton2 Neoverse"), - "m6g.8xlarge": specs(2.3, 32, "AWS Graviton2 Neoverse"), - "m6g.12xlarge": specs(2.3, 48, "AWS Graviton2 Neoverse"), - "m6g.16xlarge": specs(2.3, 64, "AWS Graviton2 Neoverse"), - - // m5, m5d - "m5.large": specs(3.1, 2, "3.1 GHz Intel Xeon Platinum"), - "m5.xlarge": specs(3.1, 4, "3.1 GHz Intel Xeon Platinum"), - "m5.2xlarge": specs(3.1, 8, "3.1 GHz Intel Xeon Platinum"), - "m5.4xlarge": specs(3.1, 16, "3.1 GHz Intel Xeon Platinum"), - "m5.8xlarge": specs(3.1, 32, "3.1 GHz Intel Xeon Platinum"), - "m5.12xlarge": specs(3.1, 48, "3.1 GHz Intel Xeon Platinum"), - "m5.16xlarge": specs(3.1, 64, "3.1 GHz Intel Xeon Platinum"), - "m5.24xlarge": specs(3.1, 96, "3.1 GHz Intel Xeon Platinum"), - "m5.metal": specs(3.1, 96, "3.1 GHz Intel Xeon Platinum"), - "m5d.large": specs(3.1, 2, "3.1 GHz Intel Xeon Platinum"), - "m5d.xlarge": specs(3.1, 4, "3.1 GHz Intel Xeon Platinum"), - "m5d.2xlarge": specs(3.1, 8, "3.1 GHz Intel Xeon Platinum"), - "m5d.4xlarge": specs(3.1, 16, "3.1 GHz Intel Xeon Platinum"), - "m5d.8xlarge": specs(3.1, 32, "3.1 GHz Intel Xeon Platinum"), - "m5d.12xlarge": specs(3.1, 48, "3.1 GHz Intel Xeon Platinum"), - "m5d.16xlarge": specs(3.1, 64, "3.1 GHz Intel Xeon Platinum"), - "m5d.24xlarge": specs(3.1, 96, "3.1 GHz Intel Xeon Platinum"), - "m5d.metal": specs(3.1, 96, "3.1 GHz Intel Xeon Platinum"), - - // m5a, m5ad - "m5a.large": specs(2.5, 2, "2.5 GHz AMD EPYC 7000 series"), - "m5a.xlarge": specs(2.5, 4, "2.5 GHz AMD EPYC 7000 series"), - "m5a.2xlarge": specs(2.5, 8, "2.5 GHz AMD EPYC 7000 series"), - "m5a.4xlarge": specs(2.5, 16, "2.5 GHz AMD EPYC 7000 series"), - "m5a.8xlarge": specs(2.5, 32, "2.5 GHz AMD EPYC 7000 series"), - "m5a.12xlarge": specs(2.5, 48, "2.5 GHz AMD EPYC 7000 series"), - "m5a.16xlarge": specs(2.5, 64, "2.5 GHz AMD EPYC 7000 series"), - "m5a.24xlarge": specs(2.5, 96, "2.5 GHz AMD EPYC 7000 series"), - "m5ad.large": specs(2.5, 2, "2.5 GHz AMD EPYC 7000 series"), - "m5ad.xlarge": specs(2.5, 4, "2.5 GHz AMD EPYC 7000 series"), - "m5ad.2xlarge": specs(2.5, 8, "2.5 GHz AMD EPYC 7000 series"), - "m5ad.4xlarge": specs(2.5, 16, "2.5 GHz AMD EPYC 7000 series"), - "m5ad.12xlarge": specs(2.5, 48, "2.5 GHz AMD EPYC 7000 series"), - "m5ad.24xlarge": specs(2.5, 96, "2.5 GHz AMD EPYC 7000 series"), - - // m5n, m5dn - "m5n.large": specs(3.1, 2, "3.1 GHz Intel Xeon Scalable"), - "m5n.xlarge": specs(3.1, 4, "3.1 GHz Intel Xeon Scalable"), - "m5n.2xlarge": specs(3.1, 8, "3.1 GHz Intel Xeon Scalable"), - "m5n.4xlarge": specs(3.1, 16, "3.1 GHz Intel Xeon Scalable"), - "m5n.8xlarge": specs(3.1, 32, "3.1 GHz Intel Xeon Scalable"), - "m5n.12xlarge": specs(3.1, 48, "3.1 GHz Intel Xeon Scalable"), - "m5n.16xlarge": specs(3.1, 64, "3.1 GHz Intel Xeon Scalable"), - "m5n.24xlarge": specs(3.1, 96, "3.1 GHz Intel Xeon Scalable"), - "m5dn.large": specs(3.1, 2, "3.1 GHz Intel Xeon Scalable"), - "m5dn.xlarge": specs(3.1, 4, "3.1 GHz Intel Xeon Scalable"), - "m5dn.2xlarge": specs(3.1, 8, "3.1 GHz Intel Xeon Scalable"), - "m5dn.4xlarge": specs(3.1, 16, "3.1 GHz Intel Xeon Scalable"), - "m5dn.8xlarge": specs(3.1, 32, "3.1 GHz Intel Xeon Scalable"), - "m5dn.12xlarge": specs(3.1, 48, "3.1 GHz Intel Xeon Scalable"), - "m5dn.16xlarge": specs(3.1, 64, "3.1 GHz Intel Xeon Scalable"), - "m5dn.24xlarge": specs(3.1, 96, "3.1 GHz Intel Xeon Scalable"), - - // m4 - "m4.large": specs(2.3, 2, "2.3 GHz Intel Xeon® E5-2686 v4"), - "m4.xlarge": specs(2.3, 4, "2.3 GHz Intel Xeon® E5-2686 v4"), - "m4.2xlarge": specs(2.3, 8, "2.3 GHz Intel Xeon® E5-2686 v4"), - "m4.4xlarge": specs(2.3, 16, "2.3 GHz Intel Xeon® E5-2686 v4"), - "m4.10xlarge": specs(2.3, 40, "2.3 GHz Intel Xeon® E5-2686 v4"), - "m4.16xlarge": specs(2.3, 64, "2.3 GHz Intel Xeon® E5-2686 v4"), - - // -- Compute Optimized -- - - // c5, c5d - "c5.large": specs(3.4, 2, "3.4 GHz Intel Xeon Platinum 8000"), - "c5.xlarge": specs(3.4, 4, "3.4 GHz Intel Xeon Platinum 8000"), - "c5.2xlarge": specs(3.4, 8, "3.4 GHz Intel Xeon Platinum 8000"), - "c5.4xlarge": specs(3.4, 16, "3.4 GHz Intel Xeon Platinum 8000"), - "c5.9xlarge": specs(3.4, 36, "3.4 GHz Intel Xeon Platinum 8000"), - "c5.12xlarge": specs(3.6, 48, "3.6 GHz Intel Xeon Scalable"), - "c5.18xlarge": specs(3.6, 72, "3.6 GHz Intel Xeon Scalable"), - "c5.24xlarge": specs(3.6, 96, "3.6 GHz Intel Xeon Scalable"), - "c5.metal": specs(3.6, 96, "3.6 GHz Intel Xeon Scalable"), - "c5d.large": specs(3.4, 2, "3.4 GHz Intel Xeon Platinum 8000"), - "c5d.xlarge": specs(3.4, 4, "3.4 GHz Intel Xeon Platinum 8000"), - "c5d.2xlarge": specs(3.4, 8, "3.4 GHz Intel Xeon Platinum 8000"), - "c5d.4xlarge": specs(3.4, 16, "3.4 GHz Intel Xeon Platinum 8000"), - "c5d.9xlarge": specs(3.4, 36, "3.4 GHz Intel Xeon Platinum 8000"), - "c5d.12xlarge": specs(3.6, 48, "3.6 GHz Intel Xeon Scalable"), - "c5d.18xlarge": specs(3.6, 72, "3.6 GHz Intel Xeon Scalable"), - "c5d.24xlarge": specs(3.6, 96, "3.6 GHz Intel Xeon Scalable"), - "c5d.metal": specs(3.6, 96, "3.6 GHz Intel Xeon Scalable"), - - // c5n - "c5n.large": specs(3.0, 2, "3.0 GHz Intel Xeon Platinum"), - "c5n.xlarge": specs(3.0, 4, "3.0 GHz Intel Xeon Platinum"), - "c5n.2xlarge": specs(3.0, 8, "3.0 GHz Intel Xeon Platinum"), - "c5n.4xlarge": specs(3.0, 16, "3.0 GHz Intel Xeon Platinum"), - "c5n.9xlarge": specs(3.0, 36, "3.0 GHz Intel Xeon Platinum"), - "c5n.18xlarge": specs(3.0, 72, "3.0 GHz Intel Xeon Platinum"), - "c5n.metal": specs(3.0, 72, "3.0 GHz Intel Xeon Platinum"), - - // c4 - "c4.large": specs(2.9, 2, "2.9 GHz Intel Xeon E5-2666 v3"), - "c4.xlarge": specs(2.9, 4, "2.9 GHz Intel Xeon E5-2666 v3"), - "c4.2xlarge": specs(2.9, 8, "2.9 GHz Intel Xeon E5-2666 v3"), - "c4.4xlarge": specs(2.9, 16, "2.9 GHz Intel Xeon E5-2666 v3"), - "c4.8xlarge": specs(2.9, 36, "2.9 GHz Intel Xeon E5-2666 v3"), - - // -- Memory Optimized -- - - // r5, r5d - "r5.large": specs(3.1, 2, "3.1 GHz Intel Xeon Platinum 8175"), - "r5.xlarge": specs(3.1, 4, "3.1 GHz Intel Xeon Platinum 8175"), - "r5.2xlarge": specs(3.1, 8, "3.1 GHz Intel Xeon Platinum 8175"), - "r5.4xlarge": specs(3.1, 16, "3.1 GHz Intel Xeon Platinum 8175"), - "r5.8xlarge": specs(3.1, 32, "3.1 GHz Intel Xeon Platinum 8175"), - "r5.12xlarge": specs(3.1, 48, "3.1 GHz Intel Xeon Platinum 8175"), - "r5.16xlarge": specs(3.1, 64, "3.1 GHz Intel Xeon Platinum 8175"), - "r5.24xlarge": specs(3.1, 96, "3.1 GHz Intel Xeon Platinum 8175"), - "r5.metal": specs(3.1, 96, "3.1 GHz Intel Xeon Platinum 8175"), - "r5d.large": specs(3.1, 2, "3.1 GHz Intel Xeon Platinum 8175"), - "r5d.xlarge": specs(3.1, 4, "3.1 GHz Intel Xeon Platinum 8175"), - "r5d.2xlarge": specs(3.1, 8, "3.1 GHz Intel Xeon Platinum 8175"), - "r5d.4xlarge": specs(3.1, 16, "3.1 GHz Intel Xeon Platinum 8175"), - "r5d.8xlarge": specs(3.1, 32, "3.1 GHz Intel Xeon Platinum 8175"), - "r5d.12xlarge": specs(3.1, 48, "3.1 GHz Intel Xeon Platinum 8175"), - "r5d.16xlarge": specs(3.1, 64, "3.1 GHz Intel Xeon Platinum 8175"), - "r5d.24xlarge": specs(3.1, 96, "3.1 GHz Intel Xeon Platinum 8175"), - "r5d.metal": specs(3.1, 96, "3.1 GHz Intel Xeon Platinum 8175"), - - // r5a, r5ad - "r5a.large": specs(2.5, 2, "2.5 GHz AMD EPYC 7000 series"), - "r5a.xlarge": specs(2.5, 4, "2.5 GHz AMD EPYC 7000 series"), - "r5a.2xlarge": specs(2.5, 8, "2.5 GHz AMD EPYC 7000 series"), - "r5a.4xlarge": specs(2.5, 16, "2.5 GHz AMD EPYC 7000 series"), - "r5a.8xlarge": specs(2.5, 32, "2.5 GHz AMD EPYC 7000 series"), - "r5a.12xlarge": specs(2.5, 48, "2.5 GHz AMD EPYC 7000 series"), - "r5a.16xlarge": specs(2.5, 64, "2.5 GHz AMD EPYC 7000 series"), - "r5a.24xlarge": specs(2.5, 96, "2.5 GHz AMD EPYC 7000 series"), - "r5ad.large": specs(2.5, 2, "2.5 GHz AMD EPYC 7000 series"), - "r5ad.xlarge": specs(2.5, 4, "2.5 GHz AMD EPYC 7000 series"), - "r5ad.2xlarge": specs(2.5, 8, "2.5 GHz AMD EPYC 7000 series"), - "r5ad.4xlarge": specs(2.5, 16, "2.5 GHz AMD EPYC 7000 series"), - "r5ad.8xlarge": specs(2.5, 32, "2.5 GHz AMD EPYC 7000 series"), - "r5ad.12xlarge": specs(2.5, 48, "2.5 GHz AMD EPYC 7000 series"), - "r5ad.16xlarge": specs(2.5, 64, "2.5 GHz AMD EPYC 7000 series"), - "r5ad.24xlarge": specs(2.5, 96, "2.5 GHz AMD EPYC 7000 series"), - - // r5n - "r5n.large": specs(3.1, 2, "3.1 GHz Intel Xeon Scalable"), - "r5n.xlarge": specs(3.1, 4, "3.1 GHz Intel Xeon Scalable"), - "r5n.2xlarge": specs(3.1, 8, "3.1 GHz Intel Xeon Scalable"), - "r5n.4xlarge": specs(3.1, 16, "3.1 GHz Intel Xeon Scalable"), - "r5n.8xlarge": specs(3.1, 32, "3.1 GHz Intel Xeon Scalable"), - "r5n.12xlarge": specs(3.1, 48, "3.1 GHz Intel Xeon Scalable"), - "r5n.16xlarge": specs(3.1, 64, "3.1 GHz Intel Xeon Scalable"), - "r5n.24xlarge": specs(3.1, 96, "3.1 GHz Intel Xeon Scalable"), - "r5dn.large": specs(3.1, 2, "3.1 GHz Intel Xeon Scalable"), - "r5dn.xlarge": specs(3.1, 4, "3.1 GHz Intel Xeon Scalable"), - "r5dn.2xlarge": specs(3.1, 8, "3.1 GHz Intel Xeon Scalable"), - "r5dn.4xlarge": specs(3.1, 16, "3.1 GHz Intel Xeon Scalable"), - "r5dn.8xlarge": specs(3.1, 32, "3.1 GHz Intel Xeon Scalable"), - "r5dn.12xlarge": specs(3.1, 48, "3.1 GHz Intel Xeon Scalable"), - "r5dn.16xlarge": specs(3.1, 64, "3.1 GHz Intel Xeon Scalable"), - "r5dn.24xlarge": specs(3.1, 96, "3.1 GHz Intel Xeon Scalable"), - - // r4 - "r4.large": specs(2.3, 2, "2.3 GHz Intel Xeon E5-2686 v4"), - "r4.xlarge": specs(2.3, 4, "2.3 GHz Intel Xeon E5-2686 v4"), - "r4.2xlarge": specs(2.3, 8, "2.3 GHz Intel Xeon E5-2686 v4"), - "r4.4xlarge": specs(2.3, 16, "2.3 GHz Intel Xeon E5-2686 v4"), - "r4.8xlarge": specs(2.3, 32, "2.3 GHz Intel Xeon E5-2686 v4"), - "r4.16xlarge": specs(2.3, 64, "2.3 GHz Intel Xeon E5-2686 v4"), - - // x1e - "x1e.xlarge": specs(2.3, 4, "2.3 GHz Intel Xeon E7-8880 v3"), - "x1e.2xlarge": specs(2.3, 8, "2.3 GHz Intel Xeon E7-8880 v3"), - "x1e.4xlarge": specs(2.3, 16, "2.3 GHz Intel Xeon E7-8880 v3"), - "x1e.8xlarge": specs(2.3, 32, "2.3 GHz Intel Xeon E7-8880 v3"), - "x1e.16xlarge": specs(2.3, 64, "2.3 GHz Intel Xeon E7-8880 v3"), - "x1e.32xlarge": specs(2.3, 128, "2.3 GHz Intel Xeon E7-8880 v3"), - - // x1 - "x1.16xlarge": specs(2.3, 64, "2.3 GHz Intel Xeon E7-8880 v3"), - "x1.32xlarge": specs(2.3, 64, "2.3 GHz Intel Xeon E7-8880 v3"), - - // high-memory - "u-6tb1.metal": specs(2.1, 448, "2.1 GHz Intel Xeon Platinum 8176M"), - "u-9tb1.metal": specs(2.1, 448, "2.1 GHz Intel Xeon Platinum 8176M"), - "u-12tb1.metal": specs(2.1, 448, "2.1 GHz Intel Xeon Platinum 8176M"), - "u-18tb1.metal": specs(2.7, 448, "2.7 GHz Intel Xeon Scalable"), - "u-24tb1.metal": specs(2.7, 448, "2.7 GHz Intel Xeon Scalable"), - - // z1d - "z1d.large": specs(4.0, 2, "4.0 GHz Intel Xeon Scalable"), - "z1d.xlarge": specs(4.0, 4, "4.0 GHz Intel Xeon Scalable"), - "z1d.2xlarge": specs(4.0, 8, "4.0 GHz Intel Xeon Scalable"), - "z1d.3xlarge": specs(4.0, 12, "4.0 GHz Intel Xeon Scalable"), - "z1d.6xlarge": specs(4.0, 24, "4.0 GHz Intel Xeon Scalable"), - "z1d.12xlarge": specs(4.0, 48, "4.0 GHz Intel Xeon Scalable"), - "z1d.metal": specs(4.0, 48, "4.0 GHz Intel Xeon Scalable"), - - // -- Accelerated Computing -- - - // p3, p3dn - "p3.2xlarge": specs(2.3, 8, "2.3 GHz Intel Xeon E5-2686 v4"), - "p3.8xlarge": specs(2.3, 32, "2.3 GHz Intel Xeon E5-2686 v4"), - "p3.16xlarge": specs(2.3, 64, "2.3 GHz Intel Xeon E5-2686 v4"), - "p3dn.24xlarge": specs(2.5, 96, "2.5 GHz Intel Xeon P-8175M"), - - // p2 - "p2.xlarge": specs(2.3, 4, "2.3 GHz Intel Xeon E5-2686 v4"), - "p2.8xlarge": specs(2.3, 32, "2.3 GHz Intel Xeon E5-2686 v4"), - "p2.16xlarge": specs(2.3, 64, "2.3 GHz Intel Xeon E5-2686 v4"), - - // inf1 - "inf1.xlarge": specs(3.0, 4, "3.0 GHz Intel Xeon Platinum 8275CL"), - "inf1.2xlarge": specs(3.0, 8, "3.0 GHz Intel Xeon Platinum 8275CL"), - "inf1.6xlarge": specs(3.0, 24, "3.0 GHz Intel Xeon Platinum 8275CL"), - "inf1.24xlarge": specs(3.0, 96, "3.0 GHz Intel Xeon Platinum 8275CL"), - - // g4dn - "g4dn.xlarge": specs(2.5, 4, "2.5 GHz Cascade Lake 24C"), - "g4dn.2xlarge": specs(2.5, 8, "2.5 GHz Cascade Lake 24C"), - "g4dn.4xlarge": specs(2.5, 16, "2.5 GHz Cascade Lake 24C"), - "g4dn.8xlarge": specs(2.5, 32, "2.5 GHz Cascade Lake 24C"), - "g4dn.16xlarge": specs(2.5, 64, "2.5 GHz Cascade Lake 24C"), - "g4dn.12xlarge": specs(2.5, 48, "2.5 GHz Cascade Lake 24C"), - "g4dn.metal": specs(2.5, 96, "2.5 GHz Cascade Lake 24C"), - - // g3 - "g3s.xlarge": specs(2.3, 4, "2.3 GHz Intel Xeon E5-2686 v4"), - "g3s.4xlarge": specs(2.3, 16, "2.3 GHz Intel Xeon E5-2686 v4"), - "g3s.8xlarge": specs(2.3, 32, "2.3 GHz Intel Xeon E5-2686 v4"), - "g3s.16xlarge": specs(2.3, 64, "2.3 GHz Intel Xeon E5-2686 v4"), - - // f1 - "f1.2xlarge": specs(2.3, 8, "Intel Xeon E5-2686 v4"), - "f1.4xlarge": specs(2.3, 16, "Intel Xeon E5-2686 v4"), - "f1.16xlarge": specs(2.3, 64, "Intel Xeon E5-2686 v4"), - - // -- Storage Optimized -- - - // i3 - "i3.large": specs(2.3, 2, "2.3 GHz Intel Xeon E5 2686 v4"), - "i3.xlarge": specs(2.3, 4, "2.3 GHz Intel Xeon E5 2686 v4"), - "i3.2xlarge": specs(2.3, 8, "2.3 GHz Intel Xeon E5 2686 v4"), - "i3.4xlarge": specs(2.3, 16, "2.3 GHz Intel Xeon E5 2686 v4"), - "i3.8xlarge": specs(2.3, 32, "2.3 GHz Intel Xeon E5 2686 v4"), - "i3.16xlarge": specs(2.3, 64, "2.3 GHz Intel Xeon E5 2686 v4"), - "i3.metal": specs(2.3, 72, "2.3 GHz Intel Xeon E5 2686 v4"), - - // i3en - "i3en.large": specs(3.1, 2, "3.1 GHz Intel Xeon Scalable"), - "i3en.xlarge": specs(3.1, 4, "3.1 GHz Intel Xeon Scalable"), - "i3en.2xlarge": specs(3.1, 8, "3.1 GHz Intel Xeon Scalable"), - "i3en.3xlarge": specs(3.1, 12, "3.1 GHz Intel Xeon Scalable"), - "i3en.6xlarge": specs(3.1, 24, "3.1 GHz Intel Xeon Scalable"), - "i3en.12xlarge": specs(3.1, 48, "3.1 GHz Intel Xeon Scalable"), - "i3en.24xlarge": specs(3.1, 96, "3.1 GHz Intel Xeon Scalable"), - "i3en.metal": specs(3.1, 96, "3.1 GHz Intel Xeon Scalable"), - - // d2 - "d2.xlarge": specs(2.4, 4, "2.4 GHz Intel Xeon E5-2676 v3"), - "d2.2xlarge": specs(2.4, 8, "2.4 GHz Intel Xeon E5-2676 v3"), - "d2.4xlarge": specs(2.4, 16, "2.4 GHz Intel Xeon E5-2676 v3"), - "d2.8xlarge": specs(2.4, 36, "2.4 GHz Intel Xeon E5-2676 v3"), - - // h1 - "h1.2xlarge": specs(2.3, 8, "2.3 GHz Intel Xeon E5 2686 v4"), - "h1.4xlarge": specs(2.3, 16, "2.3 GHz Intel Xeon E5 2686 v4"), - "h1.8xlarge": specs(2.3, 32, "2.3 GHz Intel Xeon E5 2686 v4"), - "h1.16xlarge": specs(2.3, 64, "2.3 GHz Intel Xeon E5 2686 v4"), -} - // EnvAWSFingerprint is used to fingerprint AWS metadata type EnvAWSFingerprint struct { StaticFingerprinter @@ -521,10 +174,9 @@ func (f *EnvAWSFingerprint) Fingerprint(request *FingerprintRequest, response *F // copy over CPU speed information if specs := f.lookupCPU(ec2meta); specs != nil { - response.AddAttribute("cpu.modelname", specs.model) response.AddAttribute("cpu.frequency", fmt.Sprintf("%.0f", specs.mhz)) response.AddAttribute("cpu.numcores", fmt.Sprintf("%d", specs.cores)) - f.logger.Debug("lookup ec2 cpu", "cores", specs.cores, "MHz", log.Fmt("%.0f", specs.mhz), "model", specs.model) + f.logger.Debug("lookup ec2 cpu", "cores", specs.cores, "MHz", log.Fmt("%.0f", specs.mhz)) if ticks := specs.ticks(); request.Config.CpuCompute <= 0 { response.AddAttribute("cpu.totalcompute", fmt.Sprintf("%d", ticks)) @@ -560,18 +212,46 @@ func (f *EnvAWSFingerprint) instanceType(ec2meta *ec2metadata.EC2Metadata) (stri return strings.TrimSpace(response), nil } -func (f *EnvAWSFingerprint) lookupCPU(ec2meta *ec2metadata.EC2Metadata) *ec2Specs { +func (f *EnvAWSFingerprint) lookupCPU(ec2meta *ec2metadata.EC2Metadata) *ec2specs { instanceType, err := f.instanceType(ec2meta) if err != nil { f.logger.Warn("failed to read EC2 metadata instance-type", "error", err) return nil } - for iType, specs := range ec2ProcSpeedTable { - if strings.EqualFold(iType, instanceType) { - return &specs - } + + region, err := ec2meta.Region() + if err != nil { + f.logger.Warn("failed to read EC2 metadata region", "error", err) + return nil } - return nil + + info := f.cpuFromTable(region, instanceType) + if info == nil { + return nil + } + + return info +} + +// cpuFromTable uses the generated AWS EC2 CPU performance lookup table to return +// the documented performance characteristics of the CPU for the given instance +// type in the given region. +func (*EnvAWSFingerprint) cpuFromTable(region, instance string) *ec2specs { + instances, exists := ec2ProcSpeedTable[region] + if !exists { + return nil + } + + data, exists := instances[instance] + if !exists { + return nil + } + + return &data +} + +func (e *ec2specs) ticks() int { + return int(e.mhz) * e.cores } func (f *EnvAWSFingerprint) throughput(request *FingerprintRequest, ec2meta *ec2metadata.EC2Metadata, ip string) int { diff --git a/client/fingerprint/env_aws_cpuinfo.go b/client/fingerprint/env_aws_cpuinfo.go new file mode 100644 index 000000000000..fbbe731f6984 --- /dev/null +++ b/client/fingerprint/env_aws_cpuinfo.go @@ -0,0 +1,1620 @@ +// Code generated from hashicorpnomad/ec2info; DO NOT EDIT. + +package fingerprint + +type ec2specs struct { + mhz float64 + cores int +} + +func specs(ghz float64, cores int) ec2specs { + return ec2specs{ + mhz: ghz * 1000, + cores: cores, + } +} + +var ec2ProcSpeedTable = map[string]map[string]ec2specs{ + + "ap-northeast-1": { + "a1.large": specs(2.3, 2), + "a1.medium": specs(2.3, 1), + "c3.8xlarge": specs(2.8, 32), + "c3.large": specs(2.8, 2), + "c4.4xlarge": specs(2.9, 16), + "c4.8xlarge": specs(2.9, 36), + "c4.large": specs(2.9, 2), + "c5.4xlarge": specs(3.4, 16), + "c5.xlarge": specs(3.4, 4), + "c5a.12xlarge": specs(3.3, 48), + "c5a.4xlarge": specs(3.3, 16), + "c5a.xlarge": specs(3.3, 4), + "c5d.12xlarge": specs(3.6, 48), + "c5d.2xlarge": specs(3.4, 8), + "c5d.large": specs(3.4, 2), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.large": specs(3.4, 2), + "c6g.12xlarge": specs(2.5, 48), + "c6g.16xlarge": specs(2.5, 64), + "c6g.xlarge": specs(2.5, 4), + "d2.2xlarge": specs(2.4, 8), + "d2.8xlarge": specs(2.4, 36), + "g3.16xlarge": specs(2.3, 64), + "g3.8xlarge": specs(2.7, 32), + "g4dn.12xlarge": specs(2.5, 48), + "g4dn.metal": specs(2.5, 96), + "i2.2xlarge": specs(2.5, 8), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "inf1.xlarge": specs(2.5, 4), + "m4.4xlarge": specs(2.4, 16), + "m4.xlarge": specs(2.4, 4), + "m5.12xlarge": specs(3.1, 48), + "m5.24xlarge": specs(3.1, 96), + "m5.8xlarge": specs(3.1, 32), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.8xlarge": specs(2.5, 32), + "m5ad.large": specs(2.2, 2), + "m5d.16xlarge": specs(3.1, 64), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "m5dn.12xlarge": specs(3.1, 48), + "m5dn.2xlarge": specs(3.1, 8), + "m5dn.8xlarge": specs(3.1, 32), + "m5dn.large": specs(3.1, 2), + "m5dn.xlarge": specs(3.1, 4), + "m5n.16xlarge": specs(3.1, 64), + "m6g.metal": specs(2.5, 64), + "m6g.xlarge": specs(2.5, 4), + "p2.8xlarge": specs(2.7, 32), + "r3.8xlarge": specs(2.5, 32), + "r3.large": specs(2.5, 2), + "r4.16xlarge": specs(2.3, 64), + "r5.24xlarge": specs(3.1, 96), + "r5a.12xlarge": specs(2.5, 48), + "r5a.16xlarge": specs(2.5, 64), + "r5a.2xlarge": specs(2.5, 8), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.24xlarge": specs(2.2, 96), + "r5ad.8xlarge": specs(2.5, 32), + "r5dn.8xlarge": specs(3.1, 32), + "r5n.12xlarge": specs(3.1, 48), + "r5n.4xlarge": specs(3.1, 16), + "r6g.16xlarge": specs(2.5, 64), + "r6g.4xlarge": specs(2.5, 16), + "r6g.8xlarge": specs(2.5, 32), + "r6g.large": specs(2.5, 2), + "r6g.medium": specs(2.5, 1), + "t2.2xlarge": specs(2.3, 8), + "t3.2xlarge": specs(2.5, 8), + "t3.large": specs(2.5, 2), + "t3.medium": specs(2.5, 2), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.small": specs(2.2, 2), + "t4g.2xlarge": specs(2.5, 8), + "t4g.medium": specs(2.5, 2), + "t4g.nano": specs(2.5, 2), + "x1.16xlarge": specs(2.3, 64), + "x1e.2xlarge": specs(2.3, 8), + "x1e.32xlarge": specs(2.3, 128), + "x1e.8xlarge": specs(2.3, 32), + "z1d.2xlarge": specs(4, 8), + "z1d.xlarge": specs(4, 4), + }, + "ap-northeast-2": { + "c4.4xlarge": specs(2.9, 16), + "c4.8xlarge": specs(2.9, 36), + "c4.large": specs(2.9, 2), + "c5.12xlarge": specs(3.6, 48), + "c5.24xlarge": specs(3.6, 96), + "c5.4xlarge": specs(3.4, 16), + "c5.xlarge": specs(3.4, 4), + "c5a.12xlarge": specs(3.3, 48), + "c5a.24xlarge": specs(3.3, 96), + "c5a.2xlarge": specs(3.3, 8), + "c5a.4xlarge": specs(3.3, 16), + "c5a.xlarge": specs(3.3, 4), + "c5d.12xlarge": specs(3.6, 48), + "c5d.24xlarge": specs(3.6, 96), + "c5d.2xlarge": specs(3.4, 8), + "c5d.4xlarge": specs(3.4, 16), + "c5d.large": specs(3.4, 2), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.9xlarge": specs(3.4, 36), + "c5n.large": specs(3.4, 2), + "d2.2xlarge": specs(2.4, 8), + "d2.8xlarge": specs(2.4, 36), + "g3.16xlarge": specs(2.3, 64), + "g3.4xlarge": specs(2.7, 16), + "g3.8xlarge": specs(2.7, 32), + "g4dn.12xlarge": specs(2.5, 48), + "g4dn.metal": specs(2.5, 96), + "i2.2xlarge": specs(2.5, 8), + "i2.xlarge": specs(2.5, 4), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "m4.16xlarge": specs(2.3, 64), + "m4.4xlarge": specs(2.4, 16), + "m4.large": specs(2.4, 2), + "m4.xlarge": specs(2.4, 4), + "m5.12xlarge": specs(3.1, 48), + "m5.24xlarge": specs(3.1, 96), + "m5.4xlarge": specs(3.1, 16), + "m5.8xlarge": specs(3.1, 32), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.8xlarge": specs(2.5, 32), + "m5ad.large": specs(2.2, 2), + "m5d.16xlarge": specs(3.1, 64), + "m5d.24xlarge": specs(3.1, 96), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "p2.8xlarge": specs(2.7, 32), + "p3.2xlarge": specs(2.7, 8), + "r3.2xlarge": specs(2.5, 8), + "r3.4xlarge": specs(2.5, 16), + "r3.8xlarge": specs(2.5, 32), + "r3.large": specs(2.5, 2), + "r4.16xlarge": specs(2.3, 64), + "r5.16xlarge": specs(3.1, 64), + "r5.24xlarge": specs(3.1, 96), + "r5.4xlarge": specs(3.1, 16), + "r5.large": specs(3.1, 2), + "r5.metal": specs(3.1, 96), + "r5a.12xlarge": specs(2.5, 48), + "r5a.16xlarge": specs(2.5, 64), + "r5a.2xlarge": specs(2.5, 8), + "r5a.4xlarge": specs(2.5, 16), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.24xlarge": specs(2.2, 96), + "r5ad.8xlarge": specs(2.5, 32), + "r5ad.large": specs(2.2, 2), + "r5d.16xlarge": specs(3.1, 64), + "r5d.2xlarge": specs(3.1, 8), + "r5d.4xlarge": specs(3.1, 16), + "r5d.large": specs(3.1, 2), + "r5d.xlarge": specs(3.1, 4), + "t2.2xlarge": specs(2.3, 8), + "t2.large": specs(2.3, 2), + "t2.micro": specs(2.5, 1), + "t3.2xlarge": specs(2.5, 8), + "t3.large": specs(2.5, 2), + "t3.medium": specs(2.5, 2), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.medium": specs(2.2, 2), + "t3a.small": specs(2.2, 2), + "x1.16xlarge": specs(2.3, 64), + "x1e.2xlarge": specs(2.3, 8), + "x1e.32xlarge": specs(2.3, 128), + "x1e.8xlarge": specs(2.3, 32), + "z1d.2xlarge": specs(4, 8), + "z1d.xlarge": specs(4, 4), + }, + "ap-south-1": { + "a1.large": specs(2.3, 2), + "a1.medium": specs(2.3, 1), + "a1.xlarge": specs(2.3, 4), + "c4.4xlarge": specs(2.9, 16), + "c4.8xlarge": specs(2.9, 36), + "c4.large": specs(2.9, 2), + "c5.12xlarge": specs(3.6, 48), + "c5.4xlarge": specs(3.4, 16), + "c5.xlarge": specs(3.4, 4), + "c5a.12xlarge": specs(3.3, 48), + "c5a.2xlarge": specs(3.3, 8), + "c5a.4xlarge": specs(3.3, 16), + "c5a.xlarge": specs(3.3, 4), + "c5d.2xlarge": specs(3.4, 8), + "c5d.large": specs(3.4, 2), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.9xlarge": specs(3.4, 36), + "c5n.large": specs(3.4, 2), + "c6g.12xlarge": specs(2.5, 48), + "c6g.16xlarge": specs(2.5, 64), + "c6g.large": specs(2.5, 2), + "c6g.xlarge": specs(2.5, 4), + "d2.2xlarge": specs(2.4, 8), + "d2.8xlarge": specs(2.4, 36), + "g4dn.12xlarge": specs(2.5, 48), + "g4dn.metal": specs(2.5, 96), + "i2.2xlarge": specs(2.5, 8), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "inf1.xlarge": specs(2.5, 4), + "m4.4xlarge": specs(2.4, 16), + "m4.large": specs(2.4, 2), + "m4.xlarge": specs(2.4, 4), + "m5.12xlarge": specs(3.1, 48), + "m5.24xlarge": specs(3.1, 96), + "m5.8xlarge": specs(3.1, 32), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.8xlarge": specs(2.5, 32), + "m5ad.large": specs(2.2, 2), + "m5d.16xlarge": specs(3.1, 64), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "m6g.metal": specs(2.5, 64), + "m6g.xlarge": specs(2.5, 4), + "p2.8xlarge": specs(2.7, 32), + "r3.2xlarge": specs(2.5, 8), + "r3.4xlarge": specs(2.5, 16), + "r3.8xlarge": specs(2.5, 32), + "r3.large": specs(2.5, 2), + "r4.16xlarge": specs(2.3, 64), + "r5.24xlarge": specs(3.1, 96), + "r5.4xlarge": specs(3.1, 16), + "r5.large": specs(3.1, 2), + "r5.metal": specs(3.1, 96), + "r5a.12xlarge": specs(2.5, 48), + "r5a.16xlarge": specs(2.5, 64), + "r5a.2xlarge": specs(2.5, 8), + "r5a.4xlarge": specs(2.5, 16), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.24xlarge": specs(2.2, 96), + "r5ad.8xlarge": specs(2.5, 32), + "r5d.4xlarge": specs(3.1, 16), + "r6g.12xlarge": specs(2.5, 48), + "r6g.16xlarge": specs(2.5, 64), + "r6g.4xlarge": specs(2.5, 16), + "r6g.8xlarge": specs(2.5, 32), + "r6g.large": specs(2.5, 2), + "r6g.medium": specs(2.5, 1), + "t2.2xlarge": specs(2.3, 8), + "t2.large": specs(2.3, 2), + "t2.micro": specs(2.5, 1), + "t3.2xlarge": specs(2.5, 8), + "t3.large": specs(2.5, 2), + "t3.medium": specs(2.5, 2), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.medium": specs(2.2, 2), + "t3a.small": specs(2.2, 2), + "t4g.2xlarge": specs(2.5, 8), + "t4g.medium": specs(2.5, 2), + "t4g.nano": specs(2.5, 2), + "x1.16xlarge": specs(2.3, 64), + "x1e.2xlarge": specs(2.3, 8), + "x1e.32xlarge": specs(2.3, 128), + "x1e.8xlarge": specs(2.3, 32), + "z1d.2xlarge": specs(4, 8), + "z1d.xlarge": specs(4, 4), + }, + "ap-southeast-1": { + "a1.large": specs(2.3, 2), + "a1.medium": specs(2.3, 1), + "c3.8xlarge": specs(2.8, 32), + "c3.large": specs(2.8, 2), + "c4.4xlarge": specs(2.9, 16), + "c4.8xlarge": specs(2.9, 36), + "c5.4xlarge": specs(3.4, 16), + "c5.xlarge": specs(3.4, 4), + "c5a.12xlarge": specs(3.3, 48), + "c5a.4xlarge": specs(3.3, 16), + "c5ad.12xlarge": specs(3.3, 48), + "c5ad.16xlarge": specs(3.3, 64), + "c5ad.24xlarge": specs(3.3, 96), + "c5ad.4xlarge": specs(3.3, 16), + "c5ad.xlarge": specs(3.3, 4), + "c5d.12xlarge": specs(3.6, 48), + "c5d.2xlarge": specs(3.4, 8), + "c5d.large": specs(3.4, 2), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.large": specs(3.4, 2), + "c6g.12xlarge": specs(2.5, 48), + "c6g.16xlarge": specs(2.5, 64), + "c6g.xlarge": specs(2.5, 4), + "d2.2xlarge": specs(2.4, 8), + "d2.8xlarge": specs(2.4, 36), + "g3.16xlarge": specs(2.3, 64), + "g3.8xlarge": specs(2.7, 32), + "g4dn.12xlarge": specs(2.5, 48), + "g4dn.metal": specs(2.5, 96), + "i2.2xlarge": specs(2.5, 8), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "inf1.xlarge": specs(2.5, 4), + "m4.4xlarge": specs(2.4, 16), + "m4.xlarge": specs(2.4, 4), + "m5.12xlarge": specs(3.1, 48), + "m5.24xlarge": specs(3.1, 96), + "m5.8xlarge": specs(3.1, 32), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.8xlarge": specs(2.5, 32), + "m5ad.large": specs(2.2, 2), + "m5d.16xlarge": specs(3.1, 64), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "m5dn.12xlarge": specs(3.1, 48), + "m5dn.2xlarge": specs(3.1, 8), + "m5dn.8xlarge": specs(3.1, 32), + "m5dn.large": specs(3.1, 2), + "m5dn.xlarge": specs(3.1, 4), + "m5n.16xlarge": specs(3.1, 64), + "m6g.metal": specs(2.5, 64), + "m6g.xlarge": specs(2.5, 4), + "p2.8xlarge": specs(2.7, 32), + "r3.8xlarge": specs(2.5, 32), + "r3.large": specs(2.5, 2), + "r4.16xlarge": specs(2.3, 64), + "r5.24xlarge": specs(3.1, 96), + "r5a.12xlarge": specs(2.5, 48), + "r5a.16xlarge": specs(2.5, 64), + "r5a.2xlarge": specs(2.5, 8), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.24xlarge": specs(2.2, 96), + "r5ad.8xlarge": specs(2.5, 32), + "r5dn.8xlarge": specs(3.1, 32), + "r5n.12xlarge": specs(3.1, 48), + "r5n.4xlarge": specs(3.1, 16), + "r6g.16xlarge": specs(2.5, 64), + "r6g.4xlarge": specs(2.5, 16), + "r6g.8xlarge": specs(2.5, 32), + "r6g.large": specs(2.5, 2), + "r6g.medium": specs(2.5, 1), + "t2.2xlarge": specs(2.3, 8), + "t3.2xlarge": specs(2.5, 8), + "t3.large": specs(2.5, 2), + "t3.medium": specs(2.5, 2), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.small": specs(2.2, 2), + "x1.16xlarge": specs(2.3, 64), + "x1e.2xlarge": specs(2.3, 8), + "x1e.32xlarge": specs(2.3, 128), + "x1e.8xlarge": specs(2.3, 32), + "z1d.2xlarge": specs(4, 8), + "z1d.xlarge": specs(4, 4), + }, + "ap-southeast-2": { + "a1.large": specs(2.3, 2), + "a1.medium": specs(2.3, 1), + "c3.8xlarge": specs(2.8, 32), + "c3.large": specs(2.8, 2), + "c4.4xlarge": specs(2.9, 16), + "c4.8xlarge": specs(2.9, 36), + "c4.large": specs(2.9, 2), + "c5.4xlarge": specs(3.4, 16), + "c5.xlarge": specs(3.4, 4), + "c5a.12xlarge": specs(3.3, 48), + "c5a.4xlarge": specs(3.3, 16), + "c5a.xlarge": specs(3.3, 4), + "c5ad.12xlarge": specs(3.3, 48), + "c5ad.16xlarge": specs(3.3, 64), + "c5ad.24xlarge": specs(3.3, 96), + "c5ad.4xlarge": specs(3.3, 16), + "c5ad.xlarge": specs(3.3, 4), + "c5d.12xlarge": specs(3.6, 48), + "c5d.2xlarge": specs(3.4, 8), + "c5d.large": specs(3.4, 2), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.9xlarge": specs(3.4, 36), + "c5n.large": specs(3.4, 2), + "c6g.12xlarge": specs(2.5, 48), + "c6g.16xlarge": specs(2.5, 64), + "c6g.xlarge": specs(2.5, 4), + "d2.2xlarge": specs(2.4, 8), + "d2.8xlarge": specs(2.4, 36), + "f1.2xlarge": specs(2.3, 8), + "g2.2xlarge": specs(2.6, 8), + "g3.16xlarge": specs(2.3, 64), + "g3.8xlarge": specs(2.7, 32), + "g4dn.12xlarge": specs(2.5, 48), + "g4dn.metal": specs(2.5, 96), + "i2.2xlarge": specs(2.5, 8), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "inf1.xlarge": specs(2.5, 4), + "m4.4xlarge": specs(2.4, 16), + "m4.xlarge": specs(2.4, 4), + "m5.12xlarge": specs(3.1, 48), + "m5.24xlarge": specs(3.1, 96), + "m5.8xlarge": specs(3.1, 32), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.8xlarge": specs(2.5, 32), + "m5ad.large": specs(2.2, 2), + "m5d.16xlarge": specs(3.1, 64), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "m6g.metal": specs(2.5, 64), + "m6g.xlarge": specs(2.5, 4), + "p2.8xlarge": specs(2.7, 32), + "p3.2xlarge": specs(2.7, 8), + "r3.8xlarge": specs(2.5, 32), + "r3.large": specs(2.5, 2), + "r4.16xlarge": specs(2.3, 64), + "r5.24xlarge": specs(3.1, 96), + "r5.large": specs(3.1, 2), + "r5a.12xlarge": specs(2.5, 48), + "r5a.16xlarge": specs(2.5, 64), + "r5a.2xlarge": specs(2.5, 8), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.24xlarge": specs(2.2, 96), + "r5ad.8xlarge": specs(2.5, 32), + "r6g.16xlarge": specs(2.5, 64), + "r6g.4xlarge": specs(2.5, 16), + "r6g.8xlarge": specs(2.5, 32), + "r6g.large": specs(2.5, 2), + "r6g.medium": specs(2.5, 1), + "t2.2xlarge": specs(2.3, 8), + "t2.large": specs(2.3, 2), + "t3.2xlarge": specs(2.5, 8), + "t3.large": specs(2.5, 2), + "t3.medium": specs(2.5, 2), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.small": specs(2.2, 2), + "x1.16xlarge": specs(2.3, 64), + "x1e.2xlarge": specs(2.3, 8), + "x1e.32xlarge": specs(2.3, 128), + "x1e.8xlarge": specs(2.3, 32), + "z1d.2xlarge": specs(4, 8), + "z1d.xlarge": specs(4, 4), + }, + "ca-central-1": { + "c4.2xlarge": specs(2.9, 8), + "c4.4xlarge": specs(2.9, 16), + "c4.8xlarge": specs(2.9, 36), + "c4.large": specs(2.9, 2), + "c5.12xlarge": specs(3.6, 48), + "c5.24xlarge": specs(3.6, 96), + "c5.4xlarge": specs(3.4, 16), + "c5.metal": specs(3.6, 96), + "c5.xlarge": specs(3.4, 4), + "c5a.12xlarge": specs(3.3, 48), + "c5a.24xlarge": specs(3.3, 96), + "c5a.2xlarge": specs(3.3, 8), + "c5a.4xlarge": specs(3.3, 16), + "c5a.xlarge": specs(3.3, 4), + "c5d.12xlarge": specs(3.6, 48), + "c5d.18xlarge": specs(3.4, 72), + "c5d.24xlarge": specs(3.6, 96), + "c5d.2xlarge": specs(3.4, 8), + "c5d.4xlarge": specs(3.4, 16), + "c5d.large": specs(3.4, 2), + "c5n.18xlarge": specs(3.4, 72), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.9xlarge": specs(3.4, 36), + "c5n.large": specs(3.4, 2), + "d2.2xlarge": specs(2.4, 8), + "d2.8xlarge": specs(2.4, 36), + "g3.16xlarge": specs(2.3, 64), + "g3.4xlarge": specs(2.7, 16), + "g3.8xlarge": specs(2.7, 32), + "g4dn.12xlarge": specs(2.5, 48), + "g4dn.metal": specs(2.5, 96), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "m4.16xlarge": specs(2.3, 64), + "m4.4xlarge": specs(2.4, 16), + "m4.large": specs(2.4, 2), + "m4.xlarge": specs(2.4, 4), + "m5.12xlarge": specs(3.1, 48), + "m5.24xlarge": specs(3.1, 96), + "m5.4xlarge": specs(3.1, 16), + "m5.8xlarge": specs(3.1, 32), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5a.8xlarge": specs(2.5, 32), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.8xlarge": specs(2.5, 32), + "m5ad.large": specs(2.2, 2), + "m5d.16xlarge": specs(3.1, 64), + "m5d.24xlarge": specs(3.1, 96), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "p3.2xlarge": specs(2.7, 8), + "r4.16xlarge": specs(2.3, 64), + "r4.2xlarge": specs(2.3, 8), + "r5.16xlarge": specs(3.1, 64), + "r5.24xlarge": specs(3.1, 96), + "r5.4xlarge": specs(3.1, 16), + "r5.large": specs(3.1, 2), + "r5.metal": specs(3.1, 96), + "r5a.12xlarge": specs(2.5, 48), + "r5a.16xlarge": specs(2.5, 64), + "r5a.2xlarge": specs(2.5, 8), + "r5a.4xlarge": specs(2.5, 16), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.24xlarge": specs(2.2, 96), + "r5ad.8xlarge": specs(2.5, 32), + "r5ad.large": specs(2.2, 2), + "r5d.16xlarge": specs(3.1, 64), + "r5d.24xlarge": specs(3.1, 96), + "r5d.2xlarge": specs(3.1, 8), + "r5d.4xlarge": specs(3.1, 16), + "r5d.large": specs(3.1, 2), + "r5d.xlarge": specs(3.1, 4), + "t2.2xlarge": specs(2.3, 8), + "t2.large": specs(2.3, 2), + "t2.micro": specs(2.5, 1), + "t3.2xlarge": specs(2.5, 8), + "t3.large": specs(2.5, 2), + "t3.medium": specs(2.5, 2), + "t3.nano": specs(2.5, 2), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.medium": specs(2.2, 2), + "t3a.small": specs(2.2, 2), + "x1.16xlarge": specs(2.3, 64), + "x1e.2xlarge": specs(2.3, 8), + "x1e.32xlarge": specs(2.3, 128), + "x1e.8xlarge": specs(2.3, 32), + }, + "eu-central-1": { + "a1.large": specs(2.3, 2), + "a1.medium": specs(2.3, 1), + "c3.8xlarge": specs(2.8, 32), + "c3.large": specs(2.8, 2), + "c4.4xlarge": specs(2.9, 16), + "c4.8xlarge": specs(2.9, 36), + "c5.4xlarge": specs(3.4, 16), + "c5.xlarge": specs(3.4, 4), + "c5a.12xlarge": specs(3.3, 48), + "c5a.4xlarge": specs(3.3, 16), + "c5ad.12xlarge": specs(3.3, 48), + "c5ad.16xlarge": specs(3.3, 64), + "c5ad.24xlarge": specs(3.3, 96), + "c5ad.4xlarge": specs(3.3, 16), + "c5ad.xlarge": specs(3.3, 4), + "c5d.12xlarge": specs(3.6, 48), + "c5d.2xlarge": specs(3.4, 8), + "c5d.large": specs(3.4, 2), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.large": specs(3.4, 2), + "c6g.12xlarge": specs(2.5, 48), + "c6g.16xlarge": specs(2.5, 64), + "c6g.xlarge": specs(2.5, 4), + "d2.2xlarge": specs(2.4, 8), + "d2.8xlarge": specs(2.4, 36), + "g3.16xlarge": specs(2.3, 64), + "g3.8xlarge": specs(2.7, 32), + "g4dn.12xlarge": specs(2.5, 48), + "g4dn.metal": specs(2.5, 96), + "i2.2xlarge": specs(2.5, 8), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "inf1.xlarge": specs(2.5, 4), + "m4.4xlarge": specs(2.4, 16), + "m4.xlarge": specs(2.4, 4), + "m5.12xlarge": specs(3.1, 48), + "m5.24xlarge": specs(3.1, 96), + "m5.8xlarge": specs(3.1, 32), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.8xlarge": specs(2.5, 32), + "m5ad.large": specs(2.2, 2), + "m5d.16xlarge": specs(3.1, 64), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "m5dn.12xlarge": specs(3.1, 48), + "m5dn.2xlarge": specs(3.1, 8), + "m5dn.8xlarge": specs(3.1, 32), + "m5dn.large": specs(3.1, 2), + "m5dn.xlarge": specs(3.1, 4), + "m5n.16xlarge": specs(3.1, 64), + "m6g.metal": specs(2.5, 64), + "m6g.xlarge": specs(2.5, 4), + "p2.8xlarge": specs(2.7, 32), + "r3.8xlarge": specs(2.5, 32), + "r3.large": specs(2.5, 2), + "r4.16xlarge": specs(2.3, 64), + "r5.24xlarge": specs(3.1, 96), + "r5a.12xlarge": specs(2.5, 48), + "r5a.16xlarge": specs(2.5, 64), + "r5a.2xlarge": specs(2.5, 8), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.24xlarge": specs(2.2, 96), + "r5ad.8xlarge": specs(2.5, 32), + "r5dn.8xlarge": specs(3.1, 32), + "r5n.12xlarge": specs(3.1, 48), + "r5n.4xlarge": specs(3.1, 16), + "r6g.16xlarge": specs(2.5, 64), + "r6g.4xlarge": specs(2.5, 16), + "r6g.8xlarge": specs(2.5, 32), + "r6g.large": specs(2.5, 2), + "r6g.medium": specs(2.5, 1), + "t2.2xlarge": specs(2.3, 8), + "t3.2xlarge": specs(2.5, 8), + "t3.large": specs(2.5, 2), + "t3.medium": specs(2.5, 2), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.small": specs(2.2, 2), + "t4g.2xlarge": specs(2.5, 8), + "t4g.medium": specs(2.5, 2), + "t4g.nano": specs(2.5, 2), + "x1.16xlarge": specs(2.3, 64), + "x1e.2xlarge": specs(2.3, 8), + "x1e.32xlarge": specs(2.3, 128), + "x1e.8xlarge": specs(2.3, 32), + "z1d.2xlarge": specs(4, 8), + "z1d.xlarge": specs(4, 4), + }, + "eu-north-1": { + "c5.12xlarge": specs(3.6, 48), + "c5.18xlarge": specs(3.4, 72), + "c5.24xlarge": specs(3.6, 96), + "c5.2xlarge": specs(3.4, 8), + "c5.4xlarge": specs(3.4, 16), + "c5.9xlarge": specs(3.4, 36), + "c5.large": specs(3.4, 2), + "c5.metal": specs(3.6, 96), + "c5.xlarge": specs(3.4, 4), + "c5a.12xlarge": specs(3.3, 48), + "c5a.16xlarge": specs(3.3, 64), + "c5a.24xlarge": specs(3.3, 96), + "c5a.2xlarge": specs(3.3, 8), + "c5a.4xlarge": specs(3.3, 16), + "c5a.8xlarge": specs(3.3, 32), + "c5a.large": specs(3.3, 2), + "c5a.xlarge": specs(3.3, 4), + "c5d.12xlarge": specs(3.6, 48), + "c5d.18xlarge": specs(3.4, 72), + "c5d.24xlarge": specs(3.6, 96), + "c5d.2xlarge": specs(3.4, 8), + "c5d.4xlarge": specs(3.4, 16), + "c5d.9xlarge": specs(3.4, 36), + "c5d.large": specs(3.4, 2), + "c5d.metal": specs(3.6, 96), + "c5d.xlarge": specs(3.4, 4), + "c5n.18xlarge": specs(3.4, 72), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.9xlarge": specs(3.4, 36), + "c5n.large": specs(3.4, 2), + "c5n.metal": specs(3.4, 72), + "c5n.xlarge": specs(3.4, 4), + "d2.2xlarge": specs(2.4, 8), + "d2.4xlarge": specs(2.4, 16), + "d2.8xlarge": specs(2.4, 36), + "d2.xlarge": specs(2.4, 4), + "g4dn.12xlarge": specs(2.5, 48), + "g4dn.16xlarge": specs(2.5, 64), + "g4dn.4xlarge": specs(2.5, 16), + "g4dn.8xlarge": specs(2.5, 32), + "g4dn.metal": specs(2.5, 96), + "g4dn.xlarge": specs(2.5, 4), + "i3.16xlarge": specs(2.3, 64), + "i3.2xlarge": specs(2.3, 8), + "i3.4xlarge": specs(2.3, 16), + "i3.8xlarge": specs(2.3, 32), + "i3.large": specs(2.3, 2), + "i3.xlarge": specs(2.3, 4), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.2xlarge": specs(3.1, 8), + "i3en.3xlarge": specs(3.1, 12), + "i3en.6xlarge": specs(3.1, 24), + "i3en.large": specs(3.1, 2), + "i3en.metal": specs(3.1, 96), + "i3en.xlarge": specs(3.1, 4), + "m5.12xlarge": specs(3.1, 48), + "m5.16xlarge": specs(3.1, 64), + "m5.24xlarge": specs(3.1, 96), + "m5.2xlarge": specs(3.1, 8), + "m5.4xlarge": specs(3.1, 16), + "m5.8xlarge": specs(3.1, 32), + "m5.large": specs(3.1, 2), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5d.12xlarge": specs(3.1, 48), + "m5d.16xlarge": specs(3.1, 64), + "m5d.24xlarge": specs(3.1, 96), + "m5d.2xlarge": specs(3.1, 8), + "m5d.4xlarge": specs(3.1, 16), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "r5.12xlarge": specs(3.1, 48), + "r5.16xlarge": specs(3.1, 64), + "r5.24xlarge": specs(3.1, 96), + "r5.2xlarge": specs(3.1, 8), + "r5.4xlarge": specs(3.1, 16), + "r5.8xlarge": specs(3.1, 32), + "r5.large": specs(3.1, 2), + "r5.metal": specs(3.1, 96), + "r5.xlarge": specs(3.1, 4), + "r5d.12xlarge": specs(3.1, 48), + "r5d.16xlarge": specs(3.1, 64), + "r5d.24xlarge": specs(3.1, 96), + "r5d.2xlarge": specs(3.1, 8), + "r5d.4xlarge": specs(3.1, 16), + "r5d.8xlarge": specs(3.1, 32), + "r5d.large": specs(3.1, 2), + "r5d.metal": specs(3.1, 96), + "r5d.xlarge": specs(3.1, 4), + "t3.2xlarge": specs(2.5, 8), + "t3.large": specs(2.5, 2), + "t3.medium": specs(2.5, 2), + "t3.micro": specs(2.5, 2), + "t3.nano": specs(2.5, 2), + "t3.small": specs(2.5, 2), + "t3.xlarge": specs(2.5, 4), + }, + "eu-west-1": { + "a1.medium": specs(2.3, 1), + "c3.8xlarge": specs(2.8, 32), + "c3.large": specs(2.8, 2), + "c4.4xlarge": specs(2.9, 16), + "c4.8xlarge": specs(2.9, 36), + "c5.4xlarge": specs(3.4, 16), + "c5.xlarge": specs(3.4, 4), + "c5a.4xlarge": specs(3.3, 16), + "c5ad.12xlarge": specs(3.3, 48), + "c5ad.16xlarge": specs(3.3, 64), + "c5ad.24xlarge": specs(3.3, 96), + "c5ad.4xlarge": specs(3.3, 16), + "c5d.12xlarge": specs(3.6, 48), + "c5d.large": specs(3.4, 2), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.large": specs(3.4, 2), + "c6g.12xlarge": specs(2.5, 48), + "c6g.16xlarge": specs(2.5, 64), + "c6g.xlarge": specs(2.5, 4), + "c6gd.metal": specs(2.5, 64), + "d2.2xlarge": specs(2.4, 8), + "d2.8xlarge": specs(2.4, 36), + "f1.2xlarge": specs(2.3, 8), + "g3.16xlarge": specs(2.3, 64), + "g4dn.metal": specs(2.5, 96), + "i2.2xlarge": specs(2.5, 8), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "inf1.xlarge": specs(2.5, 4), + "m4.4xlarge": specs(2.4, 16), + "m5.12xlarge": specs(3.1, 48), + "m5.24xlarge": specs(3.1, 96), + "m5.8xlarge": specs(3.1, 32), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.8xlarge": specs(2.5, 32), + "m5ad.large": specs(2.2, 2), + "m5d.16xlarge": specs(3.1, 64), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "m5dn.12xlarge": specs(3.1, 48), + "m5dn.2xlarge": specs(3.1, 8), + "m5dn.8xlarge": specs(3.1, 32), + "m5dn.large": specs(3.1, 2), + "m5dn.xlarge": specs(3.1, 4), + "m5n.16xlarge": specs(3.1, 64), + "m6g.metal": specs(2.5, 64), + "m6g.xlarge": specs(2.5, 4), + "m6gd.12xlarge": specs(2.5, 48), + "m6gd.4xlarge": specs(2.5, 16), + "m6gd.medium": specs(2.5, 1), + "m6gd.metal": specs(2.5, 64), + "m6gd.xlarge": specs(2.5, 4), + "r3.8xlarge": specs(2.5, 32), + "r3.large": specs(2.5, 2), + "r4.16xlarge": specs(2.3, 64), + "r5.24xlarge": specs(3.1, 96), + "r5a.12xlarge": specs(2.5, 48), + "r5a.2xlarge": specs(2.5, 8), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.24xlarge": specs(2.2, 96), + "r5ad.8xlarge": specs(2.5, 32), + "r5dn.8xlarge": specs(3.1, 32), + "r5n.12xlarge": specs(3.1, 48), + "r5n.4xlarge": specs(3.1, 16), + "r6g.16xlarge": specs(2.5, 64), + "r6g.8xlarge": specs(2.5, 32), + "r6g.large": specs(2.5, 2), + "r6g.medium": specs(2.5, 1), + "r6gd.2xlarge": specs(2.5, 8), + "r6gd.large": specs(2.5, 2), + "r6gd.medium": specs(2.5, 1), + "r6gd.xlarge": specs(2.5, 4), + "t2.2xlarge": specs(2.3, 8), + "t3.2xlarge": specs(2.5, 8), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.small": specs(2.2, 2), + "t4g.medium": specs(2.5, 2), + "t4g.nano": specs(2.5, 2), + "x1.16xlarge": specs(2.3, 64), + "x1e.2xlarge": specs(2.3, 8), + "x1e.32xlarge": specs(2.3, 128), + "x1e.8xlarge": specs(2.3, 32), + "z1d.2xlarge": specs(4, 8), + }, + "eu-west-2": { + "c4.2xlarge": specs(2.9, 8), + "c4.4xlarge": specs(2.9, 16), + "c4.8xlarge": specs(2.9, 36), + "c4.large": specs(2.9, 2), + "c5.12xlarge": specs(3.6, 48), + "c5.24xlarge": specs(3.6, 96), + "c5.4xlarge": specs(3.4, 16), + "c5.9xlarge": specs(3.4, 36), + "c5.metal": specs(3.6, 96), + "c5.xlarge": specs(3.4, 4), + "c5a.12xlarge": specs(3.3, 48), + "c5a.24xlarge": specs(3.3, 96), + "c5a.2xlarge": specs(3.3, 8), + "c5a.4xlarge": specs(3.3, 16), + "c5a.xlarge": specs(3.3, 4), + "c5d.12xlarge": specs(3.6, 48), + "c5d.18xlarge": specs(3.4, 72), + "c5d.24xlarge": specs(3.6, 96), + "c5d.2xlarge": specs(3.4, 8), + "c5d.4xlarge": specs(3.4, 16), + "c5d.large": specs(3.4, 2), + "c5n.18xlarge": specs(3.4, 72), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.9xlarge": specs(3.4, 36), + "c5n.large": specs(3.4, 2), + "d2.2xlarge": specs(2.4, 8), + "d2.8xlarge": specs(2.4, 36), + "g3.16xlarge": specs(2.3, 64), + "g3.4xlarge": specs(2.7, 16), + "g3.8xlarge": specs(2.7, 32), + "g4dn.12xlarge": specs(2.5, 48), + "g4dn.metal": specs(2.5, 96), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "m4.16xlarge": specs(2.3, 64), + "m4.4xlarge": specs(2.4, 16), + "m4.large": specs(2.4, 2), + "m4.xlarge": specs(2.4, 4), + "m5.12xlarge": specs(3.1, 48), + "m5.24xlarge": specs(3.1, 96), + "m5.4xlarge": specs(3.1, 16), + "m5.8xlarge": specs(3.1, 32), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5a.8xlarge": specs(2.5, 32), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.8xlarge": specs(2.5, 32), + "m5ad.large": specs(2.2, 2), + "m5d.16xlarge": specs(3.1, 64), + "m5d.24xlarge": specs(3.1, 96), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "p3.2xlarge": specs(2.7, 8), + "r4.16xlarge": specs(2.3, 64), + "r4.2xlarge": specs(2.3, 8), + "r5.16xlarge": specs(3.1, 64), + "r5.24xlarge": specs(3.1, 96), + "r5.4xlarge": specs(3.1, 16), + "r5.large": specs(3.1, 2), + "r5.metal": specs(3.1, 96), + "r5a.12xlarge": specs(2.5, 48), + "r5a.16xlarge": specs(2.5, 64), + "r5a.2xlarge": specs(2.5, 8), + "r5a.4xlarge": specs(2.5, 16), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.24xlarge": specs(2.2, 96), + "r5ad.8xlarge": specs(2.5, 32), + "r5ad.large": specs(2.2, 2), + "r5d.16xlarge": specs(3.1, 64), + "r5d.24xlarge": specs(3.1, 96), + "r5d.2xlarge": specs(3.1, 8), + "r5d.4xlarge": specs(3.1, 16), + "r5d.large": specs(3.1, 2), + "r5d.xlarge": specs(3.1, 4), + "t2.2xlarge": specs(2.3, 8), + "t2.large": specs(2.3, 2), + "t2.micro": specs(2.5, 1), + "t3.2xlarge": specs(2.5, 8), + "t3.large": specs(2.5, 2), + "t3.medium": specs(2.5, 2), + "t3.micro": specs(2.5, 2), + "t3.nano": specs(2.5, 2), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.medium": specs(2.2, 2), + "t3a.small": specs(2.2, 2), + "x1.16xlarge": specs(2.3, 64), + "z1d.2xlarge": specs(4, 8), + "z1d.xlarge": specs(4, 4), + }, + "eu-west-3": { + "c5.12xlarge": specs(3.6, 48), + "c5.24xlarge": specs(3.6, 96), + "c5.2xlarge": specs(3.4, 8), + "c5.4xlarge": specs(3.4, 16), + "c5.9xlarge": specs(3.4, 36), + "c5.large": specs(3.4, 2), + "c5.metal": specs(3.6, 96), + "c5.xlarge": specs(3.4, 4), + "c5d.18xlarge": specs(3.4, 72), + "c5d.2xlarge": specs(3.4, 8), + "c5d.4xlarge": specs(3.4, 16), + "c5d.large": specs(3.4, 2), + "c5d.xlarge": specs(3.4, 4), + "d2.2xlarge": specs(2.4, 8), + "d2.8xlarge": specs(2.4, 36), + "g4dn.12xlarge": specs(2.5, 48), + "g4dn.metal": specs(2.5, 96), + "g4dn.xlarge": specs(2.5, 4), + "i3.8xlarge": specs(2.3, 32), + "i3.large": specs(2.3, 2), + "i3.xlarge": specs(2.3, 4), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "inf1.2xlarge": specs(2.5, 8), + "inf1.6xlarge": specs(2.5, 24), + "inf1.xlarge": specs(2.5, 4), + "m5.12xlarge": specs(3.1, 48), + "m5.16xlarge": specs(3.1, 64), + "m5.24xlarge": specs(3.1, 96), + "m5.4xlarge": specs(3.1, 16), + "m5.8xlarge": specs(3.1, 32), + "m5.large": specs(3.1, 2), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5a.8xlarge": specs(2.5, 32), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.24xlarge": specs(2.2, 96), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.8xlarge": specs(2.5, 32), + "m5ad.large": specs(2.2, 2), + "m5ad.xlarge": specs(2.2, 4), + "m5d.12xlarge": specs(3.1, 48), + "m5d.16xlarge": specs(3.1, 64), + "m5d.24xlarge": specs(3.1, 96), + "m5d.2xlarge": specs(3.1, 8), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "r4.16xlarge": specs(2.3, 64), + "r4.2xlarge": specs(2.3, 8), + "r4.xlarge": specs(2.3, 4), + "r5.16xlarge": specs(3.1, 64), + "r5.24xlarge": specs(3.1, 96), + "r5.2xlarge": specs(3.1, 8), + "r5.4xlarge": specs(3.1, 16), + "r5.8xlarge": specs(3.1, 32), + "r5.large": specs(3.1, 2), + "r5.metal": specs(3.1, 96), + "r5.xlarge": specs(3.1, 4), + "r5a.12xlarge": specs(2.5, 48), + "r5a.16xlarge": specs(2.5, 64), + "r5a.2xlarge": specs(2.5, 8), + "r5a.4xlarge": specs(2.5, 16), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.16xlarge": specs(2.5, 64), + "r5ad.24xlarge": specs(2.2, 96), + "r5ad.2xlarge": specs(2.2, 8), + "r5ad.8xlarge": specs(2.5, 32), + "r5ad.large": specs(2.2, 2), + "r5ad.xlarge": specs(2.2, 4), + "r5d.16xlarge": specs(3.1, 64), + "r5d.24xlarge": specs(3.1, 96), + "r5d.2xlarge": specs(3.1, 8), + "r5d.4xlarge": specs(3.1, 16), + "r5d.8xlarge": specs(3.1, 32), + "r5d.large": specs(3.1, 2), + "r5d.xlarge": specs(3.1, 4), + "t2.2xlarge": specs(2.3, 8), + "t2.large": specs(2.3, 2), + "t2.medium": specs(2.3, 2), + "t2.micro": specs(2.5, 1), + "t3.2xlarge": specs(2.5, 8), + "t3.large": specs(2.5, 2), + "t3.medium": specs(2.5, 2), + "t3.micro": specs(2.5, 2), + "t3.nano": specs(2.5, 2), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.large": specs(2.2, 2), + "t3a.medium": specs(2.2, 2), + "t3a.small": specs(2.2, 2), + "x1.16xlarge": specs(2.3, 64), + }, + "sa-east-1": { + "c3.8xlarge": specs(2.8, 32), + "c3.large": specs(2.8, 2), + "c3.xlarge": specs(2.8, 4), + "c4.4xlarge": specs(2.9, 16), + "c4.8xlarge": specs(2.9, 36), + "c4.large": specs(2.9, 2), + "c5.12xlarge": specs(3.6, 48), + "c5.24xlarge": specs(3.6, 96), + "c5.4xlarge": specs(3.4, 16), + "c5.xlarge": specs(3.4, 4), + "c5a.12xlarge": specs(3.3, 48), + "c5a.24xlarge": specs(3.3, 96), + "c5a.2xlarge": specs(3.3, 8), + "c5a.4xlarge": specs(3.3, 16), + "c5a.xlarge": specs(3.3, 4), + "c5d.12xlarge": specs(3.6, 48), + "c5d.24xlarge": specs(3.6, 96), + "c5d.2xlarge": specs(3.4, 8), + "c5d.4xlarge": specs(3.4, 16), + "c5d.large": specs(3.4, 2), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.9xlarge": specs(3.4, 36), + "c5n.large": specs(3.4, 2), + "g4dn.12xlarge": specs(2.5, 48), + "g4dn.metal": specs(2.5, 96), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "inf1.2xlarge": specs(2.5, 8), + "inf1.6xlarge": specs(2.5, 24), + "inf1.xlarge": specs(2.5, 4), + "m3.xlarge": specs(2.5, 4), + "m4.16xlarge": specs(2.3, 64), + "m4.4xlarge": specs(2.4, 16), + "m4.large": specs(2.4, 2), + "m4.xlarge": specs(2.4, 4), + "m5.12xlarge": specs(3.1, 48), + "m5.24xlarge": specs(3.1, 96), + "m5.4xlarge": specs(3.1, 16), + "m5.8xlarge": specs(3.1, 32), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.8xlarge": specs(2.5, 32), + "m5ad.large": specs(2.2, 2), + "m5d.16xlarge": specs(3.1, 64), + "m5d.24xlarge": specs(3.1, 96), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "r3.2xlarge": specs(2.5, 8), + "r3.4xlarge": specs(2.5, 16), + "r3.8xlarge": specs(2.5, 32), + "r3.large": specs(2.5, 2), + "r4.16xlarge": specs(2.3, 64), + "r5.16xlarge": specs(3.1, 64), + "r5.24xlarge": specs(3.1, 96), + "r5.4xlarge": specs(3.1, 16), + "r5.large": specs(3.1, 2), + "r5.metal": specs(3.1, 96), + "r5a.12xlarge": specs(2.5, 48), + "r5a.16xlarge": specs(2.5, 64), + "r5a.2xlarge": specs(2.5, 8), + "r5a.4xlarge": specs(2.5, 16), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.24xlarge": specs(2.2, 96), + "r5ad.8xlarge": specs(2.5, 32), + "r5ad.large": specs(2.2, 2), + "r5d.16xlarge": specs(3.1, 64), + "r5d.2xlarge": specs(3.1, 8), + "r5d.4xlarge": specs(3.1, 16), + "r5d.large": specs(3.1, 2), + "r5d.xlarge": specs(3.1, 4), + "t2.2xlarge": specs(2.3, 8), + "t2.large": specs(2.3, 2), + "t2.micro": specs(2.5, 1), + "t3.2xlarge": specs(2.5, 8), + "t3.large": specs(2.5, 2), + "t3.medium": specs(2.5, 2), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.medium": specs(2.2, 2), + "t3a.small": specs(2.2, 2), + "x1.16xlarge": specs(2.3, 64), + "x1e.32xlarge": specs(2.3, 128), + }, + "us-east-1": { + "a1.medium": specs(2.3, 1), + "c3.8xlarge": specs(2.8, 32), + "c3.large": specs(2.8, 2), + "c4.4xlarge": specs(2.9, 16), + "c4.8xlarge": specs(2.9, 36), + "c5.4xlarge": specs(3.4, 16), + "c5.xlarge": specs(3.4, 4), + "c5a.4xlarge": specs(3.3, 16), + "c5ad.12xlarge": specs(3.3, 48), + "c5ad.16xlarge": specs(3.3, 64), + "c5ad.24xlarge": specs(3.3, 96), + "c5ad.4xlarge": specs(3.3, 16), + "c5d.12xlarge": specs(3.6, 48), + "c5d.large": specs(3.4, 2), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.large": specs(3.4, 2), + "c6g.12xlarge": specs(2.5, 48), + "c6g.16xlarge": specs(2.5, 64), + "c6g.xlarge": specs(2.5, 4), + "c6gd.metal": specs(2.5, 64), + "d2.2xlarge": specs(2.4, 8), + "d2.8xlarge": specs(2.4, 36), + "f1.2xlarge": specs(2.3, 8), + "g3.16xlarge": specs(2.3, 64), + "g4dn.metal": specs(2.5, 96), + "i2.2xlarge": specs(2.5, 8), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "inf1.xlarge": specs(2.5, 4), + "m4.4xlarge": specs(2.4, 16), + "m5.12xlarge": specs(3.1, 48), + "m5.24xlarge": specs(3.1, 96), + "m5.8xlarge": specs(3.1, 32), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.8xlarge": specs(2.5, 32), + "m5ad.large": specs(2.2, 2), + "m5d.16xlarge": specs(3.1, 64), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "m5dn.12xlarge": specs(3.1, 48), + "m5dn.2xlarge": specs(3.1, 8), + "m5dn.8xlarge": specs(3.1, 32), + "m5dn.large": specs(3.1, 2), + "m5dn.xlarge": specs(3.1, 4), + "m5n.16xlarge": specs(3.1, 64), + "m6g.metal": specs(2.5, 64), + "m6g.xlarge": specs(2.5, 4), + "m6gd.12xlarge": specs(2.5, 48), + "m6gd.4xlarge": specs(2.5, 16), + "m6gd.medium": specs(2.5, 1), + "m6gd.metal": specs(2.5, 64), + "m6gd.xlarge": specs(2.5, 4), + "r3.8xlarge": specs(2.5, 32), + "r3.large": specs(2.5, 2), + "r4.16xlarge": specs(2.3, 64), + "r5.24xlarge": specs(3.1, 96), + "r5a.12xlarge": specs(2.5, 48), + "r5a.2xlarge": specs(2.5, 8), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.24xlarge": specs(2.2, 96), + "r5ad.8xlarge": specs(2.5, 32), + "r5dn.8xlarge": specs(3.1, 32), + "r5n.12xlarge": specs(3.1, 48), + "r5n.4xlarge": specs(3.1, 16), + "r6g.16xlarge": specs(2.5, 64), + "r6g.8xlarge": specs(2.5, 32), + "r6g.large": specs(2.5, 2), + "r6g.medium": specs(2.5, 1), + "r6gd.2xlarge": specs(2.5, 8), + "r6gd.large": specs(2.5, 2), + "r6gd.medium": specs(2.5, 1), + "r6gd.xlarge": specs(2.5, 4), + "t2.2xlarge": specs(2.3, 8), + "t3.2xlarge": specs(2.5, 8), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.small": specs(2.2, 2), + "t4g.medium": specs(2.5, 2), + "t4g.nano": specs(2.5, 2), + "x1.16xlarge": specs(2.3, 64), + "x1e.2xlarge": specs(2.3, 8), + "x1e.32xlarge": specs(2.3, 128), + "x1e.8xlarge": specs(2.3, 32), + "z1d.2xlarge": specs(4, 8), + }, + "us-east-2": { + "a1.large": specs(2.3, 2), + "a1.medium": specs(2.3, 1), + "c4.4xlarge": specs(2.9, 16), + "c4.8xlarge": specs(2.9, 36), + "c5.4xlarge": specs(3.4, 16), + "c5.xlarge": specs(3.4, 4), + "c5a.12xlarge": specs(3.3, 48), + "c5a.4xlarge": specs(3.3, 16), + "c5d.12xlarge": specs(3.6, 48), + "c5d.2xlarge": specs(3.4, 8), + "c5d.large": specs(3.4, 2), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.large": specs(3.4, 2), + "c6g.12xlarge": specs(2.5, 48), + "c6g.16xlarge": specs(2.5, 64), + "c6g.xlarge": specs(2.5, 4), + "c6gd.metal": specs(2.5, 64), + "d2.2xlarge": specs(2.4, 8), + "d2.8xlarge": specs(2.4, 36), + "g3.16xlarge": specs(2.3, 64), + "g3.8xlarge": specs(2.7, 32), + "g4dn.12xlarge": specs(2.5, 48), + "g4dn.metal": specs(2.5, 96), + "h1.8xlarge": specs(2.3, 32), + "i2.2xlarge": specs(2.5, 8), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "inf1.xlarge": specs(2.5, 4), + "m4.4xlarge": specs(2.4, 16), + "m5.12xlarge": specs(3.1, 48), + "m5.24xlarge": specs(3.1, 96), + "m5.8xlarge": specs(3.1, 32), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.large": specs(2.2, 2), + "m5d.16xlarge": specs(3.1, 64), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "m5dn.12xlarge": specs(3.1, 48), + "m5dn.2xlarge": specs(3.1, 8), + "m5dn.8xlarge": specs(3.1, 32), + "m5dn.large": specs(3.1, 2), + "m5dn.xlarge": specs(3.1, 4), + "m5n.16xlarge": specs(3.1, 64), + "m6g.metal": specs(2.5, 64), + "m6g.xlarge": specs(2.5, 4), + "m6gd.12xlarge": specs(2.5, 48), + "m6gd.4xlarge": specs(2.5, 16), + "m6gd.medium": specs(2.5, 1), + "m6gd.metal": specs(2.5, 64), + "m6gd.xlarge": specs(2.5, 4), + "p2.8xlarge": specs(2.7, 32), + "r3.8xlarge": specs(2.5, 32), + "r3.large": specs(2.5, 2), + "r4.16xlarge": specs(2.3, 64), + "r5.24xlarge": specs(3.1, 96), + "r5a.12xlarge": specs(2.5, 48), + "r5a.16xlarge": specs(2.5, 64), + "r5a.2xlarge": specs(2.5, 8), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.24xlarge": specs(2.2, 96), + "r5dn.8xlarge": specs(3.1, 32), + "r5n.12xlarge": specs(3.1, 48), + "r5n.4xlarge": specs(3.1, 16), + "r6g.16xlarge": specs(2.5, 64), + "r6g.4xlarge": specs(2.5, 16), + "r6g.8xlarge": specs(2.5, 32), + "r6g.large": specs(2.5, 2), + "r6g.medium": specs(2.5, 1), + "r6gd.2xlarge": specs(2.5, 8), + "r6gd.large": specs(2.5, 2), + "r6gd.medium": specs(2.5, 1), + "r6gd.xlarge": specs(2.5, 4), + "t2.2xlarge": specs(2.3, 8), + "t3.2xlarge": specs(2.5, 8), + "t3.medium": specs(2.5, 2), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.small": specs(2.2, 2), + "t4g.2xlarge": specs(2.5, 8), + "t4g.medium": specs(2.5, 2), + "t4g.nano": specs(2.5, 2), + "x1.16xlarge": specs(2.3, 64), + "x1e.2xlarge": specs(2.3, 8), + "x1e.32xlarge": specs(2.3, 128), + "x1e.8xlarge": specs(2.3, 32), + "z1d.2xlarge": specs(4, 8), + "z1d.xlarge": specs(4, 4), + }, + "us-west-1": { + "c3.8xlarge": specs(2.8, 32), + "c3.large": specs(2.8, 2), + "c4.4xlarge": specs(2.9, 16), + "c4.8xlarge": specs(2.9, 36), + "c4.large": specs(2.9, 2), + "c5.12xlarge": specs(3.6, 48), + "c5.4xlarge": specs(3.4, 16), + "c5.xlarge": specs(3.4, 4), + "c5a.12xlarge": specs(3.3, 48), + "c5a.4xlarge": specs(3.3, 16), + "c5a.xlarge": specs(3.3, 4), + "c5d.12xlarge": specs(3.6, 48), + "c5d.24xlarge": specs(3.6, 96), + "c5d.2xlarge": specs(3.4, 8), + "c5d.large": specs(3.4, 2), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.9xlarge": specs(3.4, 36), + "c5n.large": specs(3.4, 2), + "c6g.12xlarge": specs(2.5, 48), + "c6g.16xlarge": specs(2.5, 64), + "c6g.large": specs(2.5, 2), + "c6g.xlarge": specs(2.5, 4), + "d2.2xlarge": specs(2.4, 8), + "d2.8xlarge": specs(2.4, 36), + "g2.2xlarge": specs(2.6, 8), + "g3.16xlarge": specs(2.3, 64), + "g3.4xlarge": specs(2.7, 16), + "g3.8xlarge": specs(2.7, 32), + "g4dn.12xlarge": specs(2.5, 48), + "g4dn.metal": specs(2.5, 96), + "i2.2xlarge": specs(2.5, 8), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "m4.4xlarge": specs(2.4, 16), + "m4.large": specs(2.4, 2), + "m4.xlarge": specs(2.4, 4), + "m5.12xlarge": specs(3.1, 48), + "m5.24xlarge": specs(3.1, 96), + "m5.8xlarge": specs(3.1, 32), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.8xlarge": specs(2.5, 32), + "m5ad.large": specs(2.2, 2), + "m5d.16xlarge": specs(3.1, 64), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "m6g.metal": specs(2.5, 64), + "m6g.xlarge": specs(2.5, 4), + "r3.2xlarge": specs(2.5, 8), + "r3.4xlarge": specs(2.5, 16), + "r3.8xlarge": specs(2.5, 32), + "r3.large": specs(2.5, 2), + "r4.16xlarge": specs(2.3, 64), + "r5.24xlarge": specs(3.1, 96), + "r5.4xlarge": specs(3.1, 16), + "r5.large": specs(3.1, 2), + "r5.metal": specs(3.1, 96), + "r5a.12xlarge": specs(2.5, 48), + "r5a.16xlarge": specs(2.5, 64), + "r5a.2xlarge": specs(2.5, 8), + "r5a.4xlarge": specs(2.5, 16), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.24xlarge": specs(2.2, 96), + "r5ad.8xlarge": specs(2.5, 32), + "r5d.4xlarge": specs(3.1, 16), + "r6g.12xlarge": specs(2.5, 48), + "r6g.16xlarge": specs(2.5, 64), + "r6g.4xlarge": specs(2.5, 16), + "r6g.8xlarge": specs(2.5, 32), + "r6g.large": specs(2.5, 2), + "r6g.medium": specs(2.5, 1), + "t2.2xlarge": specs(2.3, 8), + "t2.large": specs(2.3, 2), + "t2.micro": specs(2.5, 1), + "t3.2xlarge": specs(2.5, 8), + "t3.large": specs(2.5, 2), + "t3.medium": specs(2.5, 2), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.medium": specs(2.2, 2), + "t3a.small": specs(2.2, 2), + "z1d.2xlarge": specs(4, 8), + "z1d.xlarge": specs(4, 4), + }, + "us-west-2": { + "a1.medium": specs(2.3, 1), + "c3.8xlarge": specs(2.8, 32), + "c3.large": specs(2.8, 2), + "c4.4xlarge": specs(2.9, 16), + "c4.8xlarge": specs(2.9, 36), + "c5.4xlarge": specs(3.4, 16), + "c5.xlarge": specs(3.4, 4), + "c5a.4xlarge": specs(3.3, 16), + "c5ad.12xlarge": specs(3.3, 48), + "c5ad.16xlarge": specs(3.3, 64), + "c5ad.24xlarge": specs(3.3, 96), + "c5ad.4xlarge": specs(3.3, 16), + "c5d.12xlarge": specs(3.6, 48), + "c5d.large": specs(3.4, 2), + "c5n.2xlarge": specs(3.4, 8), + "c5n.4xlarge": specs(3.4, 16), + "c5n.large": specs(3.4, 2), + "c6g.12xlarge": specs(2.5, 48), + "c6g.16xlarge": specs(2.5, 64), + "c6g.xlarge": specs(2.5, 4), + "c6gd.metal": specs(2.5, 64), + "d2.2xlarge": specs(2.4, 8), + "d2.8xlarge": specs(2.4, 36), + "f1.2xlarge": specs(2.3, 8), + "g3.16xlarge": specs(2.3, 64), + "g4dn.metal": specs(2.5, 96), + "i2.2xlarge": specs(2.5, 8), + "i3en.12xlarge": specs(3.1, 48), + "i3en.24xlarge": specs(3.1, 96), + "i3en.3xlarge": specs(3.1, 12), + "inf1.xlarge": specs(2.5, 4), + "m4.4xlarge": specs(2.4, 16), + "m5.12xlarge": specs(3.1, 48), + "m5.24xlarge": specs(3.1, 96), + "m5.8xlarge": specs(3.1, 32), + "m5.metal": specs(3.1, 96), + "m5.xlarge": specs(3.1, 4), + "m5a.16xlarge": specs(2.5, 64), + "m5a.2xlarge": specs(2.5, 8), + "m5a.4xlarge": specs(2.5, 16), + "m5ad.12xlarge": specs(2.2, 48), + "m5ad.2xlarge": specs(2.2, 8), + "m5ad.4xlarge": specs(2.2, 16), + "m5ad.8xlarge": specs(2.5, 32), + "m5ad.large": specs(2.2, 2), + "m5d.16xlarge": specs(3.1, 64), + "m5d.8xlarge": specs(3.1, 32), + "m5d.large": specs(3.1, 2), + "m5d.metal": specs(3.1, 96), + "m5d.xlarge": specs(3.1, 4), + "m5dn.12xlarge": specs(3.1, 48), + "m5dn.2xlarge": specs(3.1, 8), + "m5dn.8xlarge": specs(3.1, 32), + "m5dn.large": specs(3.1, 2), + "m5dn.xlarge": specs(3.1, 4), + "m5n.16xlarge": specs(3.1, 64), + "m6g.metal": specs(2.5, 64), + "m6g.xlarge": specs(2.5, 4), + "m6gd.12xlarge": specs(2.5, 48), + "m6gd.4xlarge": specs(2.5, 16), + "m6gd.medium": specs(2.5, 1), + "m6gd.metal": specs(2.5, 64), + "m6gd.xlarge": specs(2.5, 4), + "r3.8xlarge": specs(2.5, 32), + "r3.large": specs(2.5, 2), + "r4.16xlarge": specs(2.3, 64), + "r5.24xlarge": specs(3.1, 96), + "r5a.12xlarge": specs(2.5, 48), + "r5a.2xlarge": specs(2.5, 8), + "r5a.large": specs(2.5, 2), + "r5a.xlarge": specs(2.5, 4), + "r5ad.12xlarge": specs(2.2, 48), + "r5ad.24xlarge": specs(2.2, 96), + "r5ad.8xlarge": specs(2.5, 32), + "r5dn.8xlarge": specs(3.1, 32), + "r5n.12xlarge": specs(3.1, 48), + "r5n.4xlarge": specs(3.1, 16), + "r6g.16xlarge": specs(2.5, 64), + "r6g.8xlarge": specs(2.5, 32), + "r6g.large": specs(2.5, 2), + "r6g.medium": specs(2.5, 1), + "r6gd.2xlarge": specs(2.5, 8), + "r6gd.large": specs(2.5, 2), + "r6gd.medium": specs(2.5, 1), + "r6gd.xlarge": specs(2.5, 4), + "t2.2xlarge": specs(2.3, 8), + "t3.2xlarge": specs(2.5, 8), + "t3.xlarge": specs(2.5, 4), + "t3a.2xlarge": specs(2.2, 8), + "t3a.small": specs(2.2, 2), + "t4g.medium": specs(2.5, 2), + "t4g.nano": specs(2.5, 2), + "x1.16xlarge": specs(2.3, 64), + "x1e.2xlarge": specs(2.3, 8), + "x1e.32xlarge": specs(2.3, 128), + "x1e.8xlarge": specs(2.3, 32), + "z1d.2xlarge": specs(4, 8), + }, +} diff --git a/client/fingerprint/env_aws_test.go b/client/fingerprint/env_aws_test.go index a2b78b066cfc..60b3fe6fb644 100644 --- a/client/fingerprint/env_aws_test.go +++ b/client/fingerprint/env_aws_test.go @@ -216,12 +216,11 @@ func TestCPUFingerprint_AWS_InstanceFound(t *testing.T) { err := f.Fingerprint(request, &response) require.NoError(t, err) require.True(t, response.Detected) - require.Equal(t, "2.5 GHz AMD EPYC 7000 series", response.Attributes["cpu.modelname"]) - require.Equal(t, "2500", response.Attributes["cpu.frequency"]) + require.Equal(t, "2200", response.Attributes["cpu.frequency"]) require.Equal(t, "8", response.Attributes["cpu.numcores"]) - require.Equal(t, "20000", response.Attributes["cpu.totalcompute"]) - require.Equal(t, 20000, response.Resources.CPU) - require.Equal(t, int64(20000), response.NodeResources.Cpu.CpuShares) + require.Equal(t, "17600", response.Attributes["cpu.totalcompute"]) + require.Equal(t, 17600, response.Resources.CPU) + require.Equal(t, int64(17600), response.NodeResources.Cpu.CpuShares) } func TestCPUFingerprint_AWS_OverrideCompute(t *testing.T) { @@ -240,8 +239,7 @@ func TestCPUFingerprint_AWS_OverrideCompute(t *testing.T) { err := f.Fingerprint(request, &response) require.NoError(t, err) require.True(t, response.Detected) - require.Equal(t, "2.5 GHz AMD EPYC 7000 series", response.Attributes["cpu.modelname"]) - require.Equal(t, "2500", response.Attributes["cpu.frequency"]) + require.Equal(t, "2200", response.Attributes["cpu.frequency"]) require.Equal(t, "8", response.Attributes["cpu.numcores"]) require.NotContains(t, response.Attributes, "cpu.totalcompute") require.Nil(t, response.Resources) // defaults in cpu fingerprinter @@ -347,6 +345,28 @@ var awsStubs = []endpoint{ ContentType: "text/plain", Body: "0a:20:d2:42:b3:55", }, + { + Uri: "/latest/dynamic/instance-identity/document", + ContentType: "text/plain", + Body: ` + { + "devpayProductCodes" : null, + "marketplaceProductCodes" : [ "1abc2defghijklm3nopqrs4tu" ], + "availabilityZone" : "us-west-2a", + "privateIp" : "10.0.0.207", + "version" : "2017-09-30", + "instanceId" : "i-b3ba3875", + "billingProducts" : null, + "instanceType" : "t3a.2xlarge", + "accountId" : "123456789012", + "imageId" : "ami-1234", + "pendingTime" : "2016-11-19T16:32:11Z", + "architecture" : "x86_64", + "kernelId" : null, + "ramdiskId" : null, + "region" : "us-west-2" + }`, + }, } var unknownInstanceType = []endpoint{