Files
benchmark-runner/spot-launcher/determineAcceptableInstances.js

1398 lines
48 KiB
JavaScript
Executable File

#!/bin/env zx
import fetch from "node-fetch"
import fs from "fs"
import { exit } from "process"
const targetNumberOfCores = 1
const spotPrice = JSON.parse(fs.readFileSync("spot-pricing.json", "utf-8"))
const advisorData = await (await fetch("https://spot-bid-advisor.s3.amazonaws.com/spot-advisor-data.json")).json()
const additionalInstanceData = JSON.parse(fs.readFileSync("instance-types.json", "utf-8"))
// Find all instances with (or dividing) the target number of cores with an eviction rate of less than 5%
// Sort by price
// Output top 40
const burstableBaselines = {
"t2.nano": 0.05,
"t2.micro": 0.10,
"t2.small": 0.20,
"t2.medium": 0.20,
"t2.large": 0.30,
"t2.xlarge": 0.225,
"t2.2xlarge": 0.17,
"t3.nano": 0.05,
"t3.micro": 0.10,
"t3.small": 0.20,
"t3.medium": 0.20,
"t3.large": 0.30,
"t3.xlarge": 0.40,
"t3.2xlarge": 0.40,
"t3a.nano": 0.05,
"t3a.micro": 0.10,
"t3a.small": 0.20,
"t3a.medium": 0.20,
"t3a.large": 0.30,
"t3a.xlarge": 0.40,
"t3a.2xlarge": 0.40,
"t4g.nano": 0.05,
"t4g.micro": 0.10,
"t4g.small": 0.20,
"t4g.medium": 0.20,
"t4g.large": 0.30,
"t4g.xlarge": 0.40,
"t4g.2xlarge": 0.40
}
const performanceData = {
"x8g.large": 59997,
"x2iezn.12xlarge": 1000208.377,
"m6a.12xlarge": 1009410.651,
"c6a.12xlarge": 1014155.926,
"m5zn.metal": 1015228.426,
"m8gb.8xlarge": 1015873.016,
"c8g.8xlarge": 1024081.927,
"i7i.12xlarge": 1053401.609,
"g6.12xlarge": 1056861.342,
"r7i.12xlarge": 1058395.502,
"c7a.8xlarge": 1061007.958,
"c6in.16xlarge": 1061183.883,
"g6e.12xlarge": 1061946.903,
"r6a.12xlarge": 1064183.572,
"m7i.12xlarge": 1068011.57,
"m6i.16xlarge": 1069742.175,
"vt1.24xlarge": 1069796.813,
"c6i.16xlarge": 1074862.493,
"r7a.8xlarge": 1076112.543,
"r6i.16xlarge": 1080077.631,
"x2iedn.16xlarge": 1082910.321,
"m7a.8xlarge": 1087079.606,
"m6in.16xlarge": 1090336.045,
"x2idn.16xlarge": 1098335.336,
"m6id.16xlarge": 1098570.999,
"m6idn.16xlarge": 1101738.681,
"i4i.16xlarge": 1102497.847,
"h1.16xlarge": 1104495.642,
"x1e.16xlarge": 1105974.856,
"c7i-flex.12xlarge": 1109399.076,
"m8i.12xlarge": 1109527.295,
"m8i-flex.12xlarge": 1114464.825,
"c7i.12xlarge": 1114637.356,
"m4.16xlarge": 1116343.973,
"r8idb.12xlarge": 1120012.445,
"r4.16xlarge": 1122216.377,
"i7ie.12xlarge": 1129456.057,
"m8ine.12xlarge": 1130742.049,
"c8i.12xlarge": 1138114.997,
"c5.18xlarge": 1142358.494,
"x1.16xlarge": 1144389.808,
"r8ib.12xlarge": 1145767.027,
"r8idn.12xlarge": 1148691.768,
"m8idb.12xlarge": 1153938.617,
"m8idn.12xlarge": 1156487.17,
"m8ib.12xlarge": 1159607.022,
"c5n.18xlarge": 1160775.462,
"c5d.18xlarge": 1164577.436,
"r8i.12xlarge": 1169590.643,
"m8in.12xlarge": 1169828.181,
"c8i-flex.12xlarge": 1172686.184,
"r5a.24xlarge": 1175174.44,
"c8ine.12xlarge": 1178203.24,
"r7g.12xlarge": 1184600.197,
"r8i-flex.12xlarge": 1195169.523,
"x8aedz.6xlarge": 1196085.538,
"x8i.12xlarge": 1197604.79,
"c5a.16xlarge": 1197828.935,
"g7e.12xlarge": 1199200.533,
"c5n.metal": 1201201.201,
"r8in.12xlarge": 1205525.324,
"m5a.24xlarge": 1205575.788,
"c7gd.12xlarge": 1211280.045,
"r6g.metal": 1222229.295,
"r7gd.12xlarge": 1239589.386,
"c6gd.16xlarge": 1243764.98,
"m7g.12xlarge": 1244732.577,
"r6gd.16xlarge": 1245620.864,
"g5.16xlarge": 1246915.184,
"m7gd.12xlarge": 1247077.163,
"c6gd.metal": 1247239.184,
"m5ad.24xlarge": 1248699.272,
"g4ad.16xlarge": 1251099.599,
"c7g.12xlarge": 1252037.822,
"im4gn.16xlarge": 1252527.888,
"r5ad.24xlarge": 1255066.022,
"c6g.metal": 1258768.767,
"g5g.metal": 1262202.939,
"x2gd.metal": 1264822.134,
"x2gd.16xlarge": 1269505.422,
"c6g.16xlarge": 1271018.138,
"i4g.16xlarge": 1271186.441,
"c6gn.16xlarge": 1273125.124,
"r6g.16xlarge": 1273547.36,
"m6g.16xlarge": 1277445.11,
"m6gd.metal": 1278891.627,
"m6g.metal": 1280256.051,
"g5g.16xlarge": 1283422.46,
"g4dn.metal": 1287380.984,
"m6gd.16xlarge": 1289109.709,
"dl2q.24xlarge": 1295313.484,
"c7i-flex.16xlarge": 1296684.001,
"c8a.8xlarge": 1300372.503,
"r6gd.metal": 1302489.655,
"r5d.metal": 1303816.379,
"r5.metal": 1310893.387,
"m5.metal": 1318409.668,
"i3en.metal": 1319950.502,
"r5n.metal": 1321767.865,
"p3dn.24xlarge": 1323529.412,
"m7i-flex.16xlarge": 1328489.881,
"c6a.16xlarge": 1332500.521,
"m7i.16xlarge": 1339566.036,
"r5d.24xlarge": 1345951.63,
"g6e.16xlarge": 1347368.421,
"r5.24xlarge": 1351398.909,
"r5n.24xlarge": 1355214.399,
"m5d.metal": 1359869.679,
"i3en.24xlarge": 1364605.544,
"c8g.12xlarge": 1371722.512,
"m5.24xlarge": 1374718.075,
"m8gn.12xlarge": 1375161.152,
"r6a.16xlarge": 1375456.695,
"g6.16xlarge": 1380872.755,
"m5d.24xlarge": 1386431.744,
"m8a.8xlarge": 1391102.739,
"c8gn.12xlarge": 1393020.387,
"m8gb.12xlarge": 1395856.052,
"i7i.16xlarge": 1403970.604,
"i8ge.12xlarge": 1412491.724,
"c7a.12xlarge": 1416207.71,
"m6a.16xlarge": 1416948.027,
"r8g.12xlarge": 1430913.698,
"r7i.16xlarge": 1431874.114,
"m8g.12xlarge": 1434548.715,
"i8g.12xlarge": 1442199.354,
"c8gb.12xlarge": 1444151.937,
"c7i.16xlarge": 1461076.022,
"m8i-flex.16xlarge": 1480967.257,
"m8idn.16xlarge": 1497251.14,
"m8in.16xlarge": 1499238.668,
"x8g.12xlarge": 1502464.982,
"r8idb.16xlarge": 1518206.618,
"m7gd.metal": 1523537.464,
"r8i-flex.16xlarge": 1527021.116,
"r8a.8xlarge": 1530501.326,
"r7g.metal": 1531008.911,
"m8idb.16xlarge": 1531405.783,
"c7g.metal": 1533852.606,
"inf1.24xlarge": 1539880.499,
"m7a.12xlarge": 1543408.36,
"r8ib.16xlarge": 1544960.772,
"r8idn.16xlarge": 1545085.1,
"c5d.24xlarge": 1546080.444,
"p4de.24xlarge": 1557493.409,
"m6in.24xlarge": 1559327.54,
"c8i-flex.16xlarge": 1565493.905,
"m8ib.16xlarge": 1576095.879,
"hpc7g.16xlarge": 1576743.04,
"c7gd.16xlarge": 1579466.93,
"m7g.16xlarge": 1580051.845,
"c8i.16xlarge": 1583570.457,
"r8in.16xlarge": 1583766.394,
"r7gd.16xlarge": 1587695.361,
"m6i.24xlarge": 1587761.009,
"dl1.24xlarge": 1593162.677,
"p4d.24xlarge": 1593360.996,
"x8i.16xlarge": 1603206.413,
"c5.metal": 1609657.948,
"c7g.16xlarge": 1611786.186,
"m8i.16xlarge": 1612496.851,
"g5.24xlarge": 1613987.895,
"r8i.16xlarge": 1615753.598,
"c6i.24xlarge": 1618545.838,
"c5.24xlarge": 1626773.989,
"r7a.12xlarge": 1627394.474,
"c7gd.metal": 1630157.922,
"c6in.24xlarge": 1632306.057,
"x2iedn.24xlarge": 1637107.776,
"hpc6id.32xlarge": 1644610.048,
"m6idn.24xlarge": 1646655.232,
"r7gd.metal": 1648316.271,
"r7g.16xlarge": 1652572.461,
"hpc7a.24xlarge": 1661187.057,
"m7gd.16xlarge": 1664499.35,
"x2idn.24xlarge": 1668912.165,
"i7ie.18xlarge": 1694316.978,
"m6id.24xlarge": 1695439.092,
"r6i.24xlarge": 1705908.485,
"i4i.24xlarge": 1713979.646,
"m7g.metal": 1729262.362,
"c5d.metal": 1749430.524,
"c5a.24xlarge": 1782067.941,
"g6e.24xlarge": 1793470.646,
"x8g.16xlarge": 1802436.105,
"m6a.24xlarge": 1807143.866,
"r6a.24xlarge": 1818526.236,
"c8gn.16xlarge": 1838816.262,
"c6a.24xlarge": 1843494.959,
"m8gb.16xlarge": 1863580.112,
"c8gb.16xlarge": 1872713.972,
"g6.24xlarge": 1884200.196,
"inf2.24xlarge": 1914734.48,
"m8gn.16xlarge": 1925825.623,
"m7a.16xlarge": 1932756.191,
"i8g.16xlarge": 1936166.994,
"m8g.16xlarge": 1941747.573,
"r7i.24xlarge": 1947327.496,
"c7i.24xlarge": 1984974.843,
"r7a.16xlarge": 1992631.415,
"c8g.16xlarge": 1995323.461,
"c7gd.xlarge": 100483.577,
"m5a.2xlarge": 101265.823,
"r5ad.2xlarge": 102362.876,
"r7g.xlarge": 102570.678,
"m7gd.xlarge": 102860.816,
"m7g.xlarge": 103066.22,
"m5ad.2xlarge": 104302.477,
"r5a.2xlarge": 104404.568,
"t3a.2xlarge": 104760.034,
"x1e.2xlarge": 104899.69,
"m4.2xlarge": 105364.826,
"r4.2xlarge": 105899.484,
"x8aedz.large": 107332.78,
"r5.2xlarge": 109920.308,
"a1.medium": 11877.895,
"m2.4xlarge": 111322.418,
"m5d.2xlarge": 112813.763,
"t3.2xlarge": 113426.911,
"m5.2xlarge": 115790.997,
"r5d.2xlarge": 116138.398,
"g4dn.2xlarge": 116228.389,
"d2.2xlarge": 116510.51,
"m3.2xlarge": 116759.912,
"d3.2xlarge": 118606.375,
"d3en.2xlarge": 118688.492,
"c3.2xlarge": 118729.593,
"r3.2xlarge": 119290.223,
"h1.2xlarge": 119790.367,
"c8gb.xlarge": 120681.852,
"m8gb.xlarge": 121479.007,
"x8g.xlarge": 121747.07,
"r8g.xlarge": 122100.122,
"c8gn.xlarge": 122165.381,
"c5n.2xlarge": 122680.57,
"r5n.2xlarge": 122906.745,
"i8ge.xlarge": 123105.332,
"i8g.xlarge": 123743.233,
"m8g.xlarge": 124678.563,
"c8g.xlarge": 125039.075,
"m8gn.xlarge": 125657.74,
"i3en.2xlarge": 127206.233,
"i2.2xlarge": 127720.717,
"m7a.xlarge": 131219.245,
"inf1.2xlarge": 131627.658,
"c5.2xlarge": 132664.483,
"c7a.xlarge": 133081.956,
"m6idn.2xlarge": 133701.011,
"m6id.2xlarge": 133952.865,
"c5d.2xlarge": 134986.923,
"c6in.2xlarge": 136025.505,
"i3.2xlarge": 136083.351,
"m6in.2xlarge": 136518.771,
"r6i.2xlarge": 136693.721,
"c6i.2xlarge": 136839.855,
"r7a.xlarge": 136892.539,
"x2iedn.2xlarge": 137628.489,
"c4.2xlarge": 137824.102,
"m6i.2xlarge": 138822.611,
"i4i.2xlarge": 138864.78,
"trn1.2xlarge": 143697.517,
"g5.2xlarge": 144423.884,
"c5a.2xlarge": 145348.837,
"z1d.2xlarge": 147126.437,
"t4g.2xlarge": 149068.323,
"g4ad.2xlarge": 149300.156,
"r6gd.2xlarge": 151343.171,
"m6gd.2xlarge": 151966.061,
"r6g.2xlarge": 152400.305,
"c6g.2xlarge": 152497.141,
"m6g.2xlarge": 154689.011,
"i4g.2xlarge": 155018.731,
"m7i-flex.2xlarge": 157720.933,
"g5g.2xlarge": 157801.302,
"c6gd.2xlarge": 158029.894,
"is4gen.2xlarge": 158113.183,
"i7i.2xlarge": 158290.463,
"x2gd.2xlarge": 158436.757,
"c7i.2xlarge": 159211.901,
"m1.small": 16880.486,
"m1.medium": 16889.039,
"c6gn.2xlarge": 160192.231,
"r6a.2xlarge": 161567.202,
"im4gn.2xlarge": 161605.279,
"m7i.2xlarge": 163373.666,
"m5zn.2xlarge": 163926.028,
"g6e.2xlarge": 163968.026,
"x2iezn.2xlarge": 164220.466,
"t2.2xlarge": 165917.732,
"g6.2xlarge": 167346.512,
"m6a.2xlarge": 169106.378,
"vt1.3xlarge": 171551.108,
"g6f.2xlarge": 174083.342,
"m8a.xlarge": 174418.605,
"c7i-flex.2xlarge": 181289.421,
"c6a.2xlarge": 181776.869,
"i3en.3xlarge": 184482.935,
"r8in.2xlarge": 185722.577,
"r8idb.2xlarge": 185945.611,
"m8idb.2xlarge": 186763.161,
"r7i.2xlarge": 187214.79,
"c8i-flex.2xlarge": 188065.666,
"c8a.xlarge": 188146.754,
"r8i.2xlarge": 189080.596,
"m8idn.2xlarge": 189506.1,
"r8i-flex.2xlarge": 189536.032,
"c8i.2xlarge": 189588.435,
"c6gd.medium": 19098.549,
"c6gn.medium": 19136.314,
"m6g.medium": 19256.692,
"x2gd.medium": 19681.165,
"c6g.medium": 19743.337,
"is4gen.medium": 19781.089,
"r6gd.medium": 19801.98,
"m6gd.medium": 19811.134,
"r6g.medium": 19841.27,
"c1.medium": 19882.512,
"a1.4xlarge": 190136.661,
"r8idn.2xlarge": 190642.625,
"r8a.xlarge": 190682.557,
"m8i-flex.2xlarge": 191563.236,
"x8i.2xlarge": 191632.066,
"m8ib.2xlarge": 192407.905,
"a1.metal": 192539.11,
"m8ine.2xlarge": 193038.547,
"r8ib.2xlarge": 195854.415,
"m8i.2xlarge": 196858.467,
"r7g.2xlarge": 196963.48,
"m8in.2xlarge": 198060.656,
"c8ine.2xlarge": 198626.169,
"c7g.2xlarge": 199104.032,
"m7g.2xlarge": 199153.597,
"i7ie.2xlarge": 199277.619,
"i7ie.24xlarge": 2007178.451,
"c7i.metal-24xl": 2007248.397,
"c7a.16xlarge": 2015219.103,
"m7i.24xlarge": 2034760.492,
"r8g.16xlarge": 2040490.993,
"g7e.24xlarge": 2040960.952,
"c8a.12xlarge": 2043132.804,
"m7i.metal-24xl": 2055234.425,
"i7i.24xlarge": 2061412.927,
"i7i.metal-24xl": 2091959.032,
"r7i.metal-24xl": 2100043.751,
"x2iedn.32xlarge": 2111949.841,
"i7ie.metal-24xl": 2124520.508,
"x2idn.32xlarge": 2132000.833,
"m6idn.32xlarge": 2140826.225,
"c6in.32xlarge": 2142887.038,
"trn1n.32xlarge": 2151170.119,
"i8ge.18xlarge": 2161026.488,
"trn1.32xlarge": 2177889.319,
"m8i.24xlarge": 2193157.805,
"r8idn.24xlarge": 2194034.967,
"x1.32xlarge": 2194787.38,
"r8in.24xlarge": 2200320.88,
"i4i.32xlarge": 2201393.069,
"x8i.24xlarge": 2202466.303,
"m6id.32xlarge": 2204900.736,
"m6in.32xlarge": 2206611.214,
"x1e.32xlarge": 2226377.354,
"m8idb.24xlarge": 2234636.872,
"r8a.12xlarge": 2242323.863,
"r8i.24xlarge": 2246270.839,
"m8a.12xlarge": 2249392.92,
"m8in.24xlarge": 2253653.383,
"x2iedn.metal": 2256600.115,
"c6i.32xlarge": 2262083.591,
"c8i.24xlarge": 2265486.726,
"r6i.metal": 2266389.27,
"c6i.metal": 2266589.933,
"r8ib.24xlarge": 2268967.147,
"m6i.32xlarge": 2269000.665,
"r6i.32xlarge": 2279100.824,
"x2idn.metal": 2279405.218,
"m8ib.24xlarge": 2293084.916,
"c6in.metal": 2300606.605,
"r6a.32xlarge": 2310469.314,
"m8idn.24xlarge": 2315066.016,
"m6i.metal": 2345073.971,
"r8idb.24xlarge": 2345849.963,
"i4i.metal": 2356189.6,
"m6id.metal": 2367739.549,
"m6idn.metal": 2398575.846,
"x8aedz.12xlarge": 2454101.789,
"m6in.metal": 2559744.026,
"x8aedz.metal-12xl": 2559875.885,
"c8a.16xlarge": 2600921.16,
"m6a.32xlarge": 2624429.75,
"hpc6a.48xlarge": 2704225.352,
"m7a.24xlarge": 2714420.358,
"c6a.32xlarge": 2731929.425,
"c8gb.24xlarge": 2751701.899,
"i8ge.24xlarge": 2777175.092,
"r7a.24xlarge": 2791373.879,
"m8a.16xlarge": 2819496.175,
"r8a.16xlarge": 2858767.157,
"c8gb.metal-24xl": 2861827.396,
"c7a.24xlarge": 2865386.529,
"x8g.metal-24xl": 2889825.406,
"m8gb.24xlarge": 2891348.543,
"c8gn.24xlarge": 2892219.628,
"m8g.metal-24xl": 2892873.286,
"x8g.24xlarge": 2895272.563,
"r8g.24xlarge": 2903811.252,
"u-3tb1.56xlarge": 2906920.157,
"c8g.24xlarge": 2925714.286,
"m8gn.24xlarge": 2929285.224,
"m8ib.32xlarge": 2967599.838,
"i8g.24xlarge": 2969378.286,
"r8g.metal-24xl": 2969837.587,
"m8g.24xlarge": 2983682.984,
"m8i.32xlarge": 2992751.929,
"t2.nano": 20638.415,
"m5ad.4xlarge": 202429.15,
"m7gd.2xlarge": 202698.423,
"r7gd.2xlarge": 203977.562,
"c7gd.2xlarge": 206718.346,
"m5a.4xlarge": 206825.233,
"i3.4xlarge": 208831.847,
"r5ad.4xlarge": 209218.699,
"r5a.4xlarge": 209918.657,
"x8aedz.xlarge": 213260.954,
"m5d.4xlarge": 216645.604,
"g7e.2xlarge": 219398.482,
"t2.small": 22166.396,
"t2.micro": 22258.495,
"m3.medium": 22900.763,
"z1d.3xlarge": 222088.558,
"r5n.4xlarge": 223630.265,
"r5.4xlarge": 225035.162,
"d3.4xlarge": 227563.647,
"t1.micro": 23453.991,
"a1.large": 23457.659,
"g4dn.4xlarge": 230991.338,
"r5d.4xlarge": 232862.757,
"d2.4xlarge": 232998.398,
"m5.4xlarge": 235271.052,
"c8gn.2xlarge": 236756.437,
"c8g.2xlarge": 236896.654,
"r3.4xlarge": 237154.15,
"c3.4xlarge": 237988.993,
"r4.4xlarge": 238912.946,
"m7gd.medium": 24319.066,
"m1.large": 24570.025,
"c7g.medium": 24828.271,
"c7gd.medium": 24917.461,
"i8ge.2xlarge": 240493.011,
"m8g.2xlarge": 240493.011,
"r8g.2xlarge": 240583.415,
"m8gn.2xlarge": 243494.141,
"m8gb.2xlarge": 246153.846,
"i2.4xlarge": 246583.787,
"x8g.2xlarge": 247104.247,
"i8g.2xlarge": 247524.752,
"t3a.micro": 25160.398,
"m7g.medium": 25521.055,
"t3a.medium": 25849.813,
"t3a.nano": 25859.84,
"r7gd.medium": 25953.802,
"t3a.large": 25985.838,
"m5ad.large": 25994.281,
"c5d.4xlarge": 250459.829,
"d3en.4xlarge": 250849.229,
"m4.4xlarge": 251243.13,
"m5zn.3xlarge": 252711.383,
"c5n.4xlarge": 253425.2,
"c8gb.2xlarge": 255244.476,
"r7a.2xlarge": 255699.979,
"c7a.2xlarge": 257510.73,
"r4.large": 26099.439,
"r5a.large": 26305.406,
"r7g.medium": 26471.367,
"m5a.large": 26516.407,
"t3a.small": 26578.073,
"r5ad.large": 26638.253,
"m4.large": 26848.04,
"c5.4xlarge": 262069.53,
"m7a.2xlarge": 262826.48,
"m6i.4xlarge": 266023.776,
"m6in.4xlarge": 266866.817,
"r6i.4xlarge": 267524.976,
"c4.4xlarge": 268006.7,
"m6id.4xlarge": 268118.978,
"i4i.4xlarge": 269269.606,
"c6in.4xlarge": 269837.254,
"i3en.large": 27121.096,
"t3.large": 27292.576,
"i7ie.3xlarge": 270620.736,
"x2iedn.4xlarge": 270704.678,
"h1.4xlarge": 271197.932,
"c6i.4xlarge": 276864.509,
"x1e.4xlarge": 276948.375,
"m6idn.4xlarge": 278842.802,
"t3.small": 28124.121,
"r5d.large": 28203.441,
"m2.xlarge": 28403.711,
"m5.large": 28469.751,
"t3.nano": 28750.779,
"m5d.large": 28933.79,
"t3.micro": 29069.767,
"r5.large": 29155.936,
"t3.medium": 29163.021,
"c8gn.medium": 29202.765,
"m3.large": 29279.719,
"m8g.medium": 29431.241,
"c3.large": 29520.295,
"r3.large": 29617.929,
"c8gb.medium": 29620.853,
"c5a.4xlarge": 290552.504,
"c8i.32xlarge": 3001876.173,
"c8g.metal-24xl": 3003284.843,
"r8i.32xlarge": 3004342.213,
"r8idb.32xlarge": 3010171.086,
"x8i.32xlarge": 3045262.594,
"i8g.metal-24xl": 3072245.78,
"r8ib.32xlarge": 3093094.907,
"m8idn.32xlarge": 3097773.475,
"r8idn.32xlarge": 3144963.145,
"r8in.32xlarge": 3151415.675,
"m8idb.32xlarge": 3157894.737,
"m8in.32xlarge": 3165704.864,
"hpc7a.48xlarge": 3240324.032,
"i8ge.metal-24xl": 3284577.88,
"c6a.metal": 3398330.334,
"m7i.metal-48xl": 3469461.511,
"c6a.48xlarge": 3584764.75,
"m6a.48xlarge": 3589455.973,
"g5.48xlarge": 3614457.831,
"g6e.48xlarge": 3635502.959,
"c8gb.metal-48xl": 3725261.932,
"r6a.48xlarge": 3727431.567,
"r6a.metal": 3807509.254,
"m7i.48xlarge": 3809523.81,
"m6a.metal": 3831060.858,
"g6.48xlarge": 3842689.883,
"r8a.24xlarge": 3843494.086,
"p5e.48xlarge": 3884477.265,
"i7i.48xlarge": 3889526.639,
"p5.48xlarge": 3900325.027,
"r7i.48xlarge": 3921435.136,
"c7i.48xlarge": 3925310.072,
"c8a.metal-24xl": 3948696.855,
"m8a.24xlarge": 3988819.219,
"p6-b200.48xlarge": 3990024.938,
"c8a.24xlarge": 3994099.626,
"r7i.metal-48xl": 3999722.242,
"c8g.medium": 30161.363,
"r5n.large": 30237.363,
"m8gb.medium": 30250.321,
"i3.large": 30350.549,
"m8gn.medium": 30369.752,
"r8g.medium": 30926.241,
"g4ad.4xlarge": 301744.46,
"c6gn.4xlarge": 306435.138,
"m6g.4xlarge": 309817.337,
"r6gd.4xlarge": 309937.367,
"x8g.medium": 31036.623,
"c5n.large": 31365.989,
"c4.large": 31678.986,
"i4g.4xlarge": 311284.047,
"c6gd.4xlarge": 311425.42,
"vt1.6xlarge": 311850.312,
"r6g.4xlarge": 312134.218,
"g5.4xlarge": 312479.656,
"is4gen.4xlarge": 312723.956,
"g5g.4xlarge": 314877.985,
"x2gd.4xlarge": 317523.318,
"im4gn.4xlarge": 318196.884,
"x2iezn.4xlarge": 319696.289,
"m6in.large": 32420.165,
"m7a.medium": 32470.168,
"c7a.medium": 32965.222,
"c6g.4xlarge": 321737.382,
"m6gd.4xlarge": 323777.403,
"gr6.4xlarge": 326914.236,
"c5.large": 33103.448,
"m6idn.large": 33200.531,
"c5d.large": 33285.255,
"c6in.large": 33765.247,
"gr6f.4xlarge": 331434.49,
"c6a.4xlarge": 332450.262,
"g6.4xlarge": 332519.354,
"m6a.4xlarge": 333385.425,
"i4i.large": 34048.349,
"m7i-flex.4xlarge": 341042.311,
"g6e.4xlarge": 343366.06,
"r6a.4xlarge": 348337.234,
"g6f.4xlarge": 348754.836,
"m6id.large": 35040.077,
"m6i.large": 35055.431,
"c6i.large": 35321.128,
"r7a.medium": 35377.358,
"d3en.6xlarge": 351528.171,
"c8a.2xlarge": 354872.098,
"i3en.6xlarge": 355625.803,
"r6i.large": 36253.776,
"z1d.large": 36310.821,
"i7i.4xlarge": 365234.264,
"c8i-flex.4xlarge": 366244.468,
"m8a.2xlarge": 367787.909,
"m8i-flex.4xlarge": 367830.185,
"c5a.large": 37030.18,
"m6g.large": 37343.624,
"i4g.large": 37845.339,
"t4g.small": 37874.006,
"m8in.4xlarge": 371632.084,
"m7i.4xlarge": 372381.691,
"m8ib.4xlarge": 372656.341,
"r7i.4xlarge": 374035.689,
"r8i-flex.4xlarge": 374035.689,
"c7i-flex.4xlarge": 374590.292,
"i8ge.3xlarge": 374707.26,
"r8in.4xlarge": 376455.825,
"m8idb.4xlarge": 377774.28,
"m8idn.4xlarge": 378012.285,
"r8i.4xlarge": 378638.479,
"t4g.nano": 38488.678,
"im4gn.large": 38689.709,
"t4g.micro": 38902.937,
"inf1.6xlarge": 382637.809,
"c7i.4xlarge": 382775.12,
"g7e.4xlarge": 383524.43,
"x8i.4xlarge": 384630.795,
"m8ine.4xlarge": 385472.505,
"r8ib.4xlarge": 386520.111,
"m5ad.8xlarge": 386551.238,
"c8i.4xlarge": 386706.949,
"m5zn.large": 39037.72,
"r6gd.large": 39110.879,
"t4g.medium": 39179.835,
"r6g.large": 39267.016,
"c7i.large": 39481.477,
"is4gen.large": 39510.075,
"t4g.large": 39596.12,
"c6gd.large": 39968.026,
"r8a.2xlarge": 390019.058,
"r8idb.4xlarge": 391309.665,
"c8ine.4xlarge": 391453.27,
"m8i.4xlarge": 393587.799,
"r5ad.8xlarge": 399052.251,
"m8a.metal-24xl": 4001667.361,
"r8g.metal-48xl": 4025157.233,
"i7ie.48xlarge": 4036157.242,
"r8a.metal-24xl": 4039940.319,
"c7a.32xlarge": 4052342.761,
"g7e.48xlarge": 4097019.703,
"m7a.32xlarge": 4116638.079,
"i7i.metal-48xl": 4142394.822,
"r8i.48xlarge": 4143735.837,
"c7i.metal-48xl": 4179667.658,
"i7ie.metal-48xl": 4216536.73,
"r7a.32xlarge": 4237708.989,
"r8in.48xlarge": 4257914.287,
"m8idn.48xlarge": 4311942.058,
"r8idn.48xlarge": 4316789.388,
"m8i.48xlarge": 4350042.481,
"m8in.48xlarge": 4406449.022,
"c8i.48xlarge": 4448821.178,
"m8g.metal-48xl": 4450625.869,
"r8ib.48xlarge": 4478395.242,
"r8idb.48xlarge": 4517381.331,
"c8i.metal-48xl": 4532845.423,
"u-6tb1.56xlarge": 4544071.407,
"m8idb.48xlarge": 4544916.558,
"r8i.metal-48xl": 4551650.566,
"m8ib.48xlarge": 4633204.633,
"m8i.metal-48xl": 4685212.299,
"r8gb.metal-48xl": 4734311.429,
"x8aedz.24xlarge": 4801527.759,
"x8aedz.metal-24xl": 4924454.393,
"c6gn.large": 40238.75,
"m6gd.large": 40249.547,
"c6g.large": 40300.913,
"c7i-flex.large": 40363.269,
"x2gd.large": 40461.258,
"g6f.large": 40677.277,
"m6a.large": 40862.192,
"r8idn.4xlarge": 400367.003,
"r7gd.4xlarge": 401782.912,
"c7gd.4xlarge": 402161.619,
"m7gd.4xlarge": 405165.865,
"hpc7g.4xlarge": 405911.08,
"r5a.8xlarge": 407695.248,
"t2.medium": 41050.903,
"m8a.medium": 41172.03,
"i7ie.large": 41528.239,
"r7g.4xlarge": 411073.287,
"m7g.4xlarge": 411602.032,
"c7g.4xlarge": 413329.889,
"m5a.8xlarge": 419369.635,
"c8a.medium": 42137.791,
"r6a.large": 42316.847,
"m8idn.large": 42614.393,
"c8i.large": 42900.043,
"i3.8xlarge": 425305.688,
"c6a.large": 43208.987,
"m7i-flex.large": 43763.676,
"z1d.6xlarge": 435492.651,
"m8i.large": 44021.35,
"r8i.large": 44023.773,
"t2.large": 44120.891,
"m8i-flex.large": 44411.547,
"r8a.medium": 44859.813,
"m5.8xlarge": 442865.71,
"r5n.8xlarge": 448514.296,
"r5.8xlarge": 449290.963,
"r8idb.large": 45325.779,
"m8idb.large": 45736.936,
"m8ib.large": 45879.452,
"i8g.4xlarge": 458157.348,
"g4dn.8xlarge": 458343.28,
"r8i-flex.large": 46481.001,
"r8idn.large": 46542.295,
"m7i.large": 46780.89,
"r8in.large": 46818.306,
"m5d.8xlarge": 462940.638,
"r5d.8xlarge": 467085.097,
"r4.8xlarge": 467745.079,
"d3.8xlarge": 468087.181,
"m8ine.large": 47221.785,
"m8in.large": 47225.502,
"r8ib.large": 47553.002,
"a1.xlarge": 47619.048,
"c8ine.large": 47630.388,
"c8gn.4xlarge": 470726.684,
"r8g.4xlarge": 476013.388,
"c8gb.4xlarge": 477255.779,
"m8gn.4xlarge": 478111.46,
"x8g.4xlarge": 479113.64,
"x8i.large": 48003.84,
"r7i.large": 48385.146,
"c8i-flex.large": 48504.446,
"i7i.large": 48531.91,
"m1.xlarge": 48649.964,
"r3.8xlarge": 480408.347,
"d3en.8xlarge": 481685.901,
"c3.8xlarge": 483944.145,
"f2.6xlarge": 485829.96,
"m8gb.4xlarge": 486285.237,
"c8g.4xlarge": 486803.073,
"r7g.large": 49239.86,
"m7gd.large": 49443.758,
"r8gb.48xlarge": 5215619.694,
"c8gn.48xlarge": 5220228.385,
"m8gb.48xlarge": 5283070.785,
"i8g.48xlarge": 5308633.442,
"c8g.48xlarge": 5350424.969,
"m8gn.48xlarge": 5357516.568,
"r8g.48xlarge": 5455707.892,
"r7a.48xlarge": 5477107.403,
"c8g.metal-48xl": 5484930.724,
"i8ge.48xlarge": 5487282.081,
"m8g.48xlarge": 5500250.662,
"c8gb.48xlarge": 5503403.798,
"i8ge.metal-48xl": 5578152.237,
"u-6tb1.112xlarge": 5678613.303,
"c7a.48xlarge": 5863490.609,
"m7a.48xlarge": 5871260.384,
"c7gd.large": 50706.725,
"m5zn.6xlarge": 500913.123,
"i2.8xlarge": 507533.703,
"m7g.large": 51659.563,
"r5ad.xlarge": 51880.674,
"c7g.large": 51890.77,
"t3a.xlarge": 51981.806,
"m8g.4xlarge": 511100.463,
"m7a.4xlarge": 511617.992,
"r7a.4xlarge": 513506.285,
"c7a.4xlarge": 514497.026,
"r7gd.large": 52160.306,
"m5ad.xlarge": 52335.47,
"i3.xlarge": 52721.761,
"m5a.xlarge": 52823.876,
"r5a.xlarge": 53565.45,
"t3.xlarge": 53932.584,
"x2iezn.6xlarge": 533214.841,
"r4.xlarge": 54704.595,
"i3en.xlarge": 54859.651,
"c6i.8xlarge": 540723.217,
"d2.8xlarge": 543204.909,
"c6in.8xlarge": 544588.155,
"r6i.8xlarge": 547219.016,
"g4dn.xlarge": 55463.117,
"d3.xlarge": 55891.942,
"m6i.8xlarge": 550371.931,
"i4i.8xlarge": 552605.448,
"c5d.9xlarge": 554464.595,
"x2iedn.8xlarge": 555603.785,
"m6id.8xlarge": 559171.727,
"h1.8xlarge": 559538.381,
"m6idn.8xlarge": 560199.571,
"x1e.8xlarge": 565745.856,
"m6in.8xlarge": 568282.721,
"c5.9xlarge": 572906.306,
"m4.10xlarge": 574547.544,
"c8g.large": 58152.213,
"d2.xlarge": 58190.282,
"r5.xlarge": 58306.205,
"m4.xlarge": 58499.488,
"m3.xlarge": 58576.589,
"c3.xlarge": 58593.75,
"r5d.xlarge": 58662.495,
"d3en.xlarge": 58751.53,
"m2.2xlarge": 58757.283,
"c5a.8xlarge": 587155.963,
"c5n.9xlarge": 587395.472,
"m5d.xlarge": 59020.264,
"m5.xlarge": 59119.125,
"i8ge.large": 59263.649,
"m8gn.large": 59435.364,
"r5n.xlarge": 59946.049,
"c4.8xlarge": 597510.373,
"c7a.metal-48xl": 6115948.184,
"r7a.metal-48xl": 6200215.285,
"m7a.metal-48xl": 6428571.429,
"hpc7a.96xlarge": 6797663.303,
"r8a.metal-48xl": 6825673.841,
"c8a.48xlarge": 6834509.093,
"m8a.48xlarge": 6962254.821,
"c8gb.large": 60163.947,
"c8gn.large": 60656.608,
"r3.xlarge": 60682.68,
"m6gd.8xlarge": 608789.397,
"g4ad.8xlarge": 609911.055,
"x1e.xlarge": 61299.55,
"i8g.large": 61900.34,
"im4gn.8xlarge": 615384.615,
"r5ad.12xlarge": 617178.124,
"c6gn.8xlarge": 619874.734,
"m8gb.large": 62348.999,
"m8g.large": 62514.652,
"m5ad.12xlarge": 620101.628,
"g5.8xlarge": 621902.633,
"g5g.8xlarge": 622245.268,
"c6a.8xlarge": 624969.484,
"c6gd.8xlarge": 625814.863,
"x8aedz.3xlarge": 626067.16,
"m6g.8xlarge": 627861.347,
"r8g.large": 63582.896,
"c5d.xlarge": 63798.397,
"r6gd.8xlarge": 630376.256,
"m5a.12xlarge": 630749.014,
"is4gen.8xlarge": 633454.306,
"r5a.12xlarge": 635004.63,
"i2.xlarge": 64906.089,
"r6g.8xlarge": 642054.575,
"i4g.8xlarge": 642699.337,
"gr6.8xlarge": 644316.923,
"i7ie.6xlarge": 646725.95,
"x2gd.8xlarge": 646725.95,
"x2iezn.8xlarge": 646725.95,
"c6g.8xlarge": 647161.925,
"r6a.8xlarge": 648068.452,
"m6a.8xlarge": 648725.356,
"inf1.xlarge": 65773.247,
"r7a.large": 65782.261,
"m6id.xlarge": 65797.59,
"c5n.xlarge": 65832.785,
"r6i.xlarge": 66126.633,
"m6i.xlarge": 66741.751,
"i4i.xlarge": 66786.326,
"x2iedn.xlarge": 67218.418,
"c7a.large": 67336.289,
"c4.xlarge": 67358.967,
"m7a.large": 67950.17,
"c5a.xlarge": 68555.759,
"c6in.xlarge": 68678.371,
"m6idn.xlarge": 68693.114,
"m6in.xlarge": 68769.879,
"m5.12xlarge": 680239.974,
"r5d.12xlarge": 685714.286,
"m5d.12xlarge": 686237.133,
"c7i-flex.8xlarge": 686965.544,
"g6.8xlarge": 689915.378,
"g5.xlarge": 69633.842,
"d3en.12xlarge": 691476.591,
"inf2.8xlarge": 692340.978,
"g6e.8xlarge": 692715.662,
"m7i.8xlarge": 699530.003,
"r8a.48xlarge": 7250506.368,
"m8a.metal-48xl": 7478488.722,
"c8a.metal-48xl": 7931202.824,
"c6i.xlarge": 70311.127,
"g6f.xlarge": 70975.469,
"i3en.12xlarge": 700661.736,
"r5.12xlarge": 703743.525,
"g4dn.12xlarge": 715776.916,
"r5n.12xlarge": 719172.951,
"z1d.xlarge": 72549.197,
"c5.xlarge": 72684.323,
"i8ge.6xlarge": 726117.54,
"c8a.4xlarge": 731565.384,
"r8a.4xlarge": 732992.288,
"r8ib.8xlarge": 734675.136,
"m7i-flex.8xlarge": 735378.605,
"g4ad.xlarge": 74710.497,
"t2.xlarge": 74985.94,
"m8in.8xlarge": 742660.426,
"r8i-flex.8xlarge": 745573.159,
"m8i-flex.8xlarge": 752085.863,
"r8i.8xlarge": 759073.298,
"m6gd.xlarge": 76098.675,
"x8i.8xlarge": 761451.517,
"c8i.8xlarge": 761814.07,
"r7i.8xlarge": 763358.779,
"r8idb.8xlarge": 764605.153,
"m8i.8xlarge": 765153.629,
"c7i.8xlarge": 766834.412,
"m8idn.8xlarge": 767294.089,
"r8idn.8xlarge": 768922.707,
"m6g.xlarge": 77002.053,
"im4gn.xlarge": 77120.823,
"t4g.xlarge": 77489.345,
"g5g.xlarge": 77504.36,
"m8a.4xlarge": 771022.408,
"c8i-flex.8xlarge": 771921.361,
"hpc7a.12xlarge": 777957.861,
"m8ib.8xlarge": 778967.868,
"m8idb.8xlarge": 779505.501,
"x2gd.xlarge": 78390.384,
"c6gd.xlarge": 78426.247,
"i4g.xlarge": 78498.07,
"m7i-flex.xlarge": 78697.555,
"c5d.12xlarge": 786691.797,
"c5.12xlarge": 789311.408,
"c6gn.xlarge": 79166.117,
"r6a.xlarge": 79168.728,
"is4gen.xlarge": 79207.921,
"g6e.xlarge": 79400.526,
"r6g.xlarge": 79507.056,
"c6g.xlarge": 79512.324,
"inf2.xlarge": 79657.473,
"c6in.12xlarge": 795228.628,
"r8in.8xlarge": 795722.989,
"c8ine.8xlarge": 796812.749,
"m8ine.8xlarge": 798801.797,
"m8idb.96xlarge": 8017119.891,
"u7i-6tb.112xlarge": 8291178.285,
"r8idn.96xlarge": 8432610.486,
"u7i-8tb.112xlarge": 8540382.538,
"m8in.96xlarge": 8686308.884,
"m8i.96xlarge": 8717366.629,
"c8i.96xlarge": 8808854.734,
"r8ib.96xlarge": 8830631.252,
"m8ib.96xlarge": 8852515.705,
"r8in.96xlarge": 8889574.813,
"m8idn.96xlarge": 8919860.627,
"r8i.96xlarge": 8925043.579,
"r6gd.xlarge": 80488.296,
"m6a.xlarge": 80527.455,
"i7ie.xlarge": 80955.272,
"i7i.8xlarge": 804255.854,
"c7g.8xlarge": 807876.799,
"m6i.12xlarge": 808352.981,
"c7i-flex.xlarge": 81045.487,
"m5a.16xlarge": 810673.873,
"m7g.8xlarge": 815390.496,
"m7gd.8xlarge": 817160.368,
"r7gd.8xlarge": 817891.374,
"i4i.12xlarge": 817926.216,
"m5ad.16xlarge": 818518.992,
"m6in.12xlarge": 818658.594,
"hpc7g.8xlarge": 819304.871,
"m6idn.12xlarge": 819812.126,
"c7gd.8xlarge": 819882.142,
"m5zn.xlarge": 82402.019,
"m6id.12xlarge": 820442.697,
"r5ad.16xlarge": 824529.76,
"r5a.16xlarge": 825593.395,
"g6.xlarge": 83813.515,
"r7g.8xlarge": 833767.587,
"r6i.12xlarge": 845256.438,
"c6i.12xlarge": 847121.112,
"g7e.8xlarge": 852916.352,
"i3.16xlarge": 853447.126,
"c6a.xlarge": 86157.381,
"m8i.xlarge": 88967.972,
"m7i.xlarge": 89171.265,
"c5a.12xlarge": 891199.406,
"g5.12xlarge": 895146.627,
"r8idb.96xlarge": 9041676.478,
"c8i.metal-96xl": 9151572.927,
"m8i.metal-96xl": 9221902.017,
"r8i.metal-96xl": 9497310.332,
"r8a.large": 90096.854,
"r8idb.xlarge": 90764.693,
"z1d.12xlarge": 902340.446,
"r5n.16xlarge": 911940.724,
"g4dn.16xlarge": 914808.462,
"m5d.16xlarge": 915070.06,
"r5d.16xlarge": 919188.051,
"m8idn.xlarge": 92219.02,
"c8ine.xlarge": 92823.577,
"c6g.12xlarge": 920774.986,
"r6g.12xlarge": 926402.47,
"c6gd.12xlarge": 928373.412,
"r5.16xlarge": 928657.799,
"m8g.8xlarge": 928815.035,
"r8idn.xlarge": 93321.668,
"m8ib.xlarge": 93611.046,
"r6gd.12xlarge": 931556.476,
"m6g.12xlarge": 932038.835,
"m5zn.12xlarge": 932355.655,
"x8g.8xlarge": 932468.857,
"c6gn.12xlarge": 932823.735,
"m6gd.12xlarge": 933005.054,
"m5.16xlarge": 936265.665,
"c8a.large": 94265.515,
"c8i.xlarge": 94311.818,
"m8a.large": 94347.714,
"c8i-flex.xlarge": 95085.28,
"a1.2xlarge": 95158.796,
"r7i.xlarge": 95166.343,
"f2.12xlarge": 951908.775,
"x2gd.12xlarge": 952695.997,
"c1.xlarge": 96298.525,
"r7gd.xlarge": 96354.585,
"r8g.8xlarge": 961033.111,
"z1d.metal": 962213.09,
"m7i-flex.12xlarge": 968620.724,
"r8ib.xlarge": 97032.425,
"m8in.xlarge": 97205.346,
"r8in.xlarge": 97292.038,
"m8ine.xlarge": 97331.495,
"c7i.xlarge": 97652.277,
"m8idb.xlarge": 97719.87,
"i8g.8xlarge": 972348.83,
"c8gn.8xlarge": 975386.726,
"x2iezn.metal": 978343.949,
"x8i.xlarge": 98051.232,
"r8i.xlarge": 98540.371,
"r8i-flex.xlarge": 98871.22,
"c8gb.8xlarge": 983858.57,
"m8i-flex.xlarge": 99345.972,
"i7i.xlarge": 99481.865,
"c7g.xlarge": 99781.727,
"m8gn.8xlarge": 998050.682,
}
let acceptableInstances = []
for (const type of Object.keys(advisorData.instance_types)) {
if (!["a", "c", "d", "h", "i", "m", "r", "z", /*"t"*/].some(prefix => {
return type.match(new RegExp(`^${prefix}[0-9]+`))
})) {
continue
}
if (!type.startsWith("m7a")) {
//continue
}
const instance = advisorData.instance_types[type]
const cores = instance.cores
if (targetNumberOfCores % cores !== 0) {
continue
}
for (const region of Object.keys(advisorData.spot_advisor)) {
if (!region.startsWith("us-west-2")) {
//continue
}
const regionData = advisorData.spot_advisor[region].Linux
const instanceData = regionData[type]
if (!instanceData) {
// Skip instances not available in this region
continue
}
const additionalData = additionalInstanceData[type + "-" + region]
if (!additionalData) {
// Skip instances not available in the additional instance data
console.log(`Instance ${type + "-" + region} not available in additional instance data`)
continue
}
if (!additionalData.ProcessorInfo.SupportedArchitectures.includes("x86_64")) {
// Skip non-x86_64 instances
console.log(`Instance ${type + "-" + region} is not x86_64`)
continue
}
/*
{ "index": 0, "label": "<5%", "dots": 0, "max": 5 },
{ "index": 1, "label": "5-10%", "dots": 1, "max": 11 },
{ "index": 2, "label": "10-15%", "dots": 2, "max": 16 },
{ "index": 3, "label": "15-20%", "dots": 3, "max": 22 },
{ "index": 4, "label": ">20%", "dots": 4, "max": 100 }
*/
if (instanceData.r > 2) {
// Skip instances with eviction rate > 10%
console.log(`Instance ${type} (${region}) has eviction rate > 10%`)
continue
}
const regionPriceData = spotPrice.filter(r => r.InstanceType === type && r.AvailabilityZone.startsWith(region))
if (regionPriceData.length === 0) {
// Skip regions not available in the spot price data
console.log(`Region ${region} not available in spot price data`)
continue
}
const pList = regionPriceData.map(r => r.SpotPrice).map(parseFloat).filter(i => !isNaN(i))
let p = pList.reduce((a, b) => a + b, 0) / pList.length
/*if (type.startsWith("t")) {
// For burstable instances, use the baseline performance
const baseline = burstableBaselines[type]
if (!baseline) {
console.log(`Instance ${type} has no baseline performance data`)
continue
}
// Add 5c/h for non-baseline performance
const rest = 1 - baseline
const additionalCost = rest * 0.05
p += additionalCost
}*/
let cpuSpeed = performanceData[type] ?? 10000
if (cpuSpeed === 10000) {
// Skip instances with no performance data
console.log(`Instance ${type} has no performance data`)
//continue
}
if (type.startsWith("t")) {
const baseline = burstableBaselines[type]
if (!baseline) {
console.log(`Instance ${type} has no baseline performance data`)
continue
}
cpuSpeed = cpuSpeed * baseline
}
const pricePerCore = p / cores
const pricePerPerformance = p / (cpuSpeed / 10000)
acceptableInstances.push({
type,
region,
cores,
evictionRate: instanceData.r,
price: p,
pricePerCore,
pricePerPerformance,
})
}
}
console.log("Found", acceptableInstances.length, "acceptable instances")
acceptableInstances = acceptableInstances.sort((a, b) => a.pricePerPerformance - b.pricePerPerformance)
acceptableInstances.slice(0, 40).forEach(instance => {
console.log(`${instance.type}\t(${instance.cores} cores) in\t${instance.region}: $${instance.price.toFixed(7)}\t(eviction rate: ${instance.evictionRate})\tprice per core: $${instance.pricePerCore.toFixed(7)}\tprice per performance: $${instance.pricePerPerformance.toFixed(7)}`)
})
const cheapestInstance = acceptableInstances[0]
console.log("Cheapest instance type:", cheapestInstance)
const targetNumberOfInstances = Math.ceil(targetNumberOfCores / cheapestInstance.cores)
const targetRegion = cheapestInstance.region
console.log(`Requesting ${targetNumberOfInstances} instances of type ${cheapestInstance.type} in region ${cheapestInstance.region} at a total cost of ${cheapestInstance.price * targetNumberOfInstances}$/h`)
//exit(0)
let vpc = JSON.parse(await $`aws ec2 describe-vpcs --filters Name=isDefault,Values=true --region ${targetRegion}`).Vpcs[0]
if (!vpc) {
console.log("No default VPC found, creating one")
await $`aws ec2 create-default-vpc --region ${targetRegion}`
vpc = JSON.parse(await $`aws ec2 describe-vpcs --filters Name=isDefault,Values=true --region ${targetRegion}`).Vpcs[0]
}
if (!vpc.Ipv6CidrBlockAssociationSet) {
console.log("No IPv6 CIDR block found, associating one")
await $`aws ec2 associate-vpc-cidr-block --vpc-id ${vpc.VpcId} --ipv6-cidr-block-network-border-group ${targetRegion} --amazon-provided-ipv6-cidr-block --region ${targetRegion}`
vpc = JSON.parse(await $`aws ec2 describe-vpcs --filters Name=isDefault,Values=true --region ${targetRegion}`).Vpcs[0]
}
let ipv6CidrBlock = vpc.Ipv6CidrBlockAssociationSet.filter(c => c.Ipv6CidrBlockState.State == "associated")[0].Ipv6CidrBlock
let subnets = JSON.parse(await $`aws ec2 describe-subnets --filters Name=vpc-id,Values=${vpc.VpcId} --region ${targetRegion}`).Subnets
for (const subnet of subnets) {
if (subnet.Ipv6CidrBlockAssociationSet.length == 0) {
const parts = ipv6CidrBlock.split("/")[0].split(":")
let prefix = parts.slice(0, 3).join(":") + ":"
let lastPart = parts[3].slice(0, 2)
while (lastPart.length < 3) {
lastPart = lastPart + "0"
}
prefix += lastPart
let i = 0
while (subnets.some(s => s.Ipv6CidrBlockAssociationSet.some(c => c.Ipv6CidrBlock.startsWith(`${prefix}${i}`)))) {
i++
}
const cidrBlock = `${prefix}${i}::/64`
console.log(`No IPv6 CIDR block found for subnet ${subnet.SubnetId}, associating one`)
await $`aws ec2 associate-subnet-cidr-block --subnet-id ${subnet.SubnetId} --ipv6-cidr-block ${cidrBlock} --region ${targetRegion}`
subnet.Ipv6CidrBlockAssociationSet = JSON.parse(await $`aws ec2 describe-subnets --filters Name=subnet-id,Values=${subnet.SubnetId} --region ${targetRegion}`).Subnets[0].Ipv6CidrBlockAssociationSet
}
}
let securityGroup = JSON.parse(await $`aws ec2 describe-security-groups --filters Name=group-name,Values=default --region ${targetRegion}`).SecurityGroups[0]
if (!securityGroup.IpPermissions.some(p => p.UserIdGroupPairs.length == 0)) {
console.log("Allowing all inbound traffic to default security group")
if (securityGroup.IpPermissions.length > 0) {
for (const p of securityGroup.IpPermissions.filter(p => p.UserIdGroupPairs.length > 0)) {
await $`aws ec2 revoke-security-group-ingress --group-id ${securityGroup.GroupId} --ip-permissions IpProtocol=-1,UserIdGroupPairs=[{GroupId=${p.UserIdGroupPairs[0].GroupId}}] --region ${targetRegion}`
}
}
await $`aws ec2 authorize-security-group-ingress --group-id ${securityGroup.GroupId} --ip-permissions IpProtocol=-1,FromPort=-1,ToPort=-1,Ipv6Ranges=[{CidrIpv6=::/0}] --region ${targetRegion}`
}
let internetGateways = JSON.parse(await $`aws ec2 describe-internet-gateways --region ${targetRegion}`).InternetGateways
if (internetGateways.length == 0) {
console.log("No internet gateway found, creating one")
await $`aws ec2 create-internet-gateway --region ${targetRegion}`
internetGateways = JSON.parse(await $`aws ec2 describe-internet-gateways --region ${targetRegion}`).InternetGateways
}
if (!internetGateways.some(g => g.Attachments.some(a => a.VpcId == vpc.VpcId))) {
console.log("Attaching internet gateway to VPC")
await $`aws ec2 attach-internet-gateway --internet-gateway-id ${internetGateways[0].InternetGatewayId} --vpc-id ${vpc.VpcId} --region ${targetRegion}`
internetGateways = JSON.parse(await $`aws ec2 describe-internet-gateways --region ${targetRegion}`).InternetGateways
}
let internetGateway = internetGateways.filter(g => g.Attachments.some(a => a.VpcId == vpc.VpcId))[0]
let routeTable = JSON.parse(await $`aws ec2 describe-route-tables --filters Name=vpc-id,Values=${vpc.VpcId} --region ${targetRegion}`).RouteTables[0]
if (routeTable.Routes.some(r => r.DestinationIpv6CidrBlock == "::/0" && r.GatewayId !== internetGateway.InternetGatewayId)) {
console.log("Removing incorrect route to internet gateway")
await $`aws ec2 delete-route --route-table-id ${routeTable.RouteTableId} --destination-ipv6-cidr-block ::/0 --region ${targetRegion}`
routeTable = JSON.parse(await $`aws ec2 describe-route-tables --filters Name=vpc-id,Values=${vpc.VpcId} --region ${targetRegion}`).RouteTables[0]
}
if (!routeTable.Routes.some(r => r.DestinationIpv6CidrBlock == "::/0")) {
console.log("Adding route to internet gateway")
await $`aws ec2 create-route --route-table-id ${routeTable.RouteTableId} --destination-ipv6-cidr-block ::/0 --gateway-id ${internetGateway.InternetGatewayId} --region ${targetRegion}`
routeTable = JSON.parse(await $`aws ec2 describe-route-tables --filters Name=vpc-id,Values=${vpc.VpcId} --region ${targetRegion}`).RouteTables[0]
}
const publicKey = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAEAQCegvirTL3Dm2qS/jU1GHAy0UW/hYx75ORJMU4v/wU8r37f/7ZIWWUNyEMYMe/EQUm4KA03GPnQ7Rzslub02P85k+wN1mTuaWaY0XCpCh9iETFxpH1Huqgvkp/A8Utdujg5GvIwxnQAQIZkovREC2kr+LUmlr57tWEruv4MZOo3NqscbqoF5YoZa8VnnnPRa6gHHZAbaOmNlOIHx5rNfuqLMXcfI1scrvhT931JXzjb0g38sejbVYWQkApX1eoIiJt/B3nebi3YBlEsNXwQasGURmRD0bdql4uvZwO+v+oJgIsCCuV5zFMvT1zn7bDHyzzD/S60ao8NdIVSwzInelHzGCBFUnQg6uD66iaX0/85ci0z6l5iE0iAAY2Q8WOeb5h8lyUqEekImObwx6kfRBPXRyUeTajWqWIYnSZMnskEvFX2AWvTxqJ8kbm6tjBeAJdeNlnglDGWnyYHmRj1FL9hcZIRIDmIDtvyCxnlHE+korA3hnRHPwfPTleyZY3xTDqkQ89DavCz94J2PDKWGGkcIme8lJVfDbImVfwnMRC5QTM6q63ETAQZy1SzXMG9puiYZrHD56dUCKDfAdc8qzTqRlR/6U7/KV1/6pUIRhSdIGYp0OvtTXC3S3FOAB4CxFvaiE9VG0e+X6uQ+dKmxaDl7RI3Ila/RcreYdWuBUHwl1Putxzv4nDqgFSBauLdayhVDW8fqgMobK7pOiKZLPGdYa0NEdQbJcg1mh9Jm6W8rHSO2k6IkX0f3fUryde9trLIaWjNocs2BMQdusnCF2l12TMnjN7J5aYsw9M1hTJG9POkz8tmiKMEWoLVEv2ikemTNrehcYrpAMbRwx6LYfDeUu7/UutX3706uiV/mLlj/i+jYC1FSGiORbZIp2+HMhCPltNEekuCNAau6K6XvfuRVwmm7NRiIfzgbQWwnPfqRTpcWXhZd07CpCRbQDhRraE+EGX/yukS09Zw3sRAE2qgskLDCvtC01/MSAgJQYzWn+1Vu9CiFRl+5pUVRFVnmT/NVt6AGEows2lcccPdnd0xA83kx10wE1e8wtDgU6mbzU1T2/SevreMdS9xNcTs4x+NruK7bif2ijS+fysmYYpwsLIY9nfYFtdVBU/hB0pGthNQ5E4cqV8gBSf4PKAX0f29xZhB3+vUIVeQzD/WxfSRTBLzKF7WC6dGgINeor3g59Db8DEkVXJ7p0EpKlHYOjAYumf8xk8rTJNYGkM9H3EdXsDTBJZlOE2ePWoS4Vf71chzqJpSZt7AYHEvcs2vrgxx/uP8msbjF00I8jQ47/wlkKedOqtb3LZ9drgRujUan6aWapP0jn25Ry7qu29GMfPS1xqx2sCxkDGyNLYtzZEJ jonas.peeters@icloud.com"
let keyPairs = JSON.parse(await $`aws ec2 describe-key-pairs --filters Name=key-name,Values=enterprise-new --region ${targetRegion}`).KeyPairs
if (keyPairs.length == 0) {
console.log("No key pair found, importing...")
await $`aws ec2 import-key-pair --key-name enterprise-new --public-key-material ${publicKey} --region ${targetRegion}`
}
const image = JSON.parse(await $`aws ec2 describe-images --owners amazon --filters "Name=name,Values=ubuntu-minimal/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-minimal-20260604" --region ${targetRegion}`).Images[0]
const dateFrom = new Date(Math.ceil(new Date().getTime() / 1000) * 1000)
const dateUntil = new Date(Math.ceil(new Date(dateFrom.getTime() + 10 * 60 * 60 * 1000).getTime() / 1000) * 1000)
const setupScript = fs.readFileSync("setup.sh", "utf8")
const setupScriptBase64 = Buffer.from(setupScript).toString("base64")
/**
* @type {import("@aws-sdk/client-ec2").LaunchTemplateVersion}
*/
const launchTemplate = {
LaunchTemplateId: "",
VersionDescription: "1",
LaunchTemplateData: {
ImageId: image.ImageId,
BlockDeviceMappings: [
{
DeviceName: "/dev/sda1",
Ebs: {
DeleteOnTermination: true,
SnapshotId: image.BlockDeviceMappings.filter(b => !!b.Ebs)[0].Ebs.SnapshotId,
VolumeSize: 8,
VolumeType: "gp3",
Encrypted: false
}
}
],
KeyName: "enterprise-new",
UserData: setupScriptBase64,
InstanceType: cheapestInstance.type,
InstanceInitiatedShutdownBehavior: "terminate",
NetworkInterfaces: [
{
DeviceIndex: 0,
DeleteOnTermination: true,
Groups: [],
AssociatePublicIpAddress: false,
Ipv6AddressCount: 1,
}
],
}
}
let existingLaunchTemplates = JSON.parse(await $`aws ec2 describe-launch-templates --filters Name=launch-template-name,Values=launch-template --region ${targetRegion}`).LaunchTemplates
if (!existingLaunchTemplates.length == 0) {
console.log("Launch template already exists, deleting...")
await $`aws ec2 delete-launch-template --launch-template-id ${existingLaunchTemplates[0].LaunchTemplateId} --region ${targetRegion}`
existingLaunchTemplates = []
}
await $`aws ec2 create-launch-template --launch-template-name launch-template --version-description 1 --launch-template-data ${JSON.stringify(launchTemplate.LaunchTemplateData)} --region ${targetRegion}`
existingLaunchTemplates = JSON.parse(await $`aws ec2 describe-launch-templates --filters Name=launch-template-name,Values=launch-template --region ${targetRegion}`).LaunchTemplates
//exit(0)
/**
* @type {import("@aws-sdk/client-ec2").CreateFleetRequest}
*/
const fleet = {
TargetCapacitySpecification: {
TotalTargetCapacity: targetNumberOfInstances,
DefaultTargetCapacityType: "spot"
},
SpotOptions: {
AllocationStrategy: "priceCapacityOptimized",
MaxTotalPrice: "1.00",
},
ValidFrom: dateFrom.toISOString(),
ValidUntil: dateUntil.toISOString(),
Type: "request",
TerminateInstancesWithExpiration: true,
LaunchTemplateConfigs: subnets.map(s => {
/**
* @type {import("@aws-sdk/client-ec2").FleetLaunchTemplateConfigRequest}
*/
const template = {
LaunchTemplateSpecification: {
LaunchTemplateId: existingLaunchTemplates[0].LaunchTemplateId,
Version: "1",
},
Overrides: [{
SubnetId: s.SubnetId,
}]
}
return template
}),
}
console.log("Fleet configuration:", fleet)
//exit(0)
console.log("Requesting spot fleet...")
await $`aws ec2 create-fleet --cli-input-json ${JSON.stringify(fleet)} --region ${targetRegion}`