#!/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}`