From 62c569b33785d7a80ef5ae1fcfdb148db31f3b6c Mon Sep 17 00:00:00 2001 From: hoonoh Date: Tue, 15 Oct 2019 13:44:20 +0900 Subject: [PATCH] feat: added regions option --- README.md | 5 +++++ src/command.ts | 13 +++++++++++++ src/lib.ts | 9 ++++++--- src/regions.ts | 2 +- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4e41d202..52d0905a 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,11 @@ CLI utility to list current global AWS EC2 Spot Instance prices. Requires valid ## Options +### --regions | -r + +AWS regions to search. Accepts multiple string values. +Defaults to all available AWS regions which does not require opt-in. + ### --instanceTypes | -i Type of EC2 instance to filter. Accepts multiple string values. diff --git a/src/command.ts b/src/command.ts index 6314cea6..c454a8b9 100644 --- a/src/command.ts +++ b/src/command.ts @@ -2,6 +2,7 @@ import * as yargs from 'yargs'; import { allInstances, instanceFamilies, instanceSizes } from './ec2-types'; import { awsCredentialsCheck, getGlobalSpotPrices, ProductDescription } from './lib'; +import { defaultRegions, Region } from './regions'; const { argv } = yargs .scriptName('spot-price') @@ -9,6 +10,13 @@ const { argv } = yargs '$0', 'get current AWS spot instance prices', { + regions: { + alias: 'r', + describe: 'AWS regions.', + type: 'array', + choices: defaultRegions, + string: true, + }, instanceTypes: { alias: 'i', describe: 'EC2 type', @@ -67,6 +75,7 @@ const { argv } = yargs async args => { const { + regions, instanceTypes, families, sizes, @@ -76,10 +85,12 @@ const { argv } = yargs accessKeyId, secretAccessKey, } = args; + if ((!families && sizes) || (families && !sizes)) { console.log('`families` or `sizes` attribute missing.'); return; } + if ( (accessKeyId !== undefined && secretAccessKey === undefined) || (accessKeyId === undefined && secretAccessKey !== undefined) @@ -98,6 +109,7 @@ const { argv } = yargs try { console.log('Querying current spot prices with options:'); console.group(); + if (regions) console.log('regions:', regions); if (instanceTypes) console.log('instanceTypes:', instanceTypes); if (families) console.log('families:', families); if (sizes) console.log('sizes:', sizes); @@ -107,6 +119,7 @@ const { argv } = yargs console.groupEnd(); getGlobalSpotPrices({ + regions: regions as Region[], instanceTypes, families, sizes, diff --git a/src/lib.ts b/src/lib.ts index e2f4ce78..ac77417d 100644 --- a/src/lib.ts +++ b/src/lib.ts @@ -1,9 +1,8 @@ import { EC2, STS } from 'aws-sdk'; import { table } from 'table'; -import { Region, regionNames, regions } from './regions'; +import { defaultRegions, Region, regionNames } from './regions'; -// https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html // https://aws.amazon.com/ec2/instance-types/ export enum ProductDescription { @@ -91,6 +90,7 @@ const getEc2SpotPrice = async (options: { export const getGlobalSpotPrices = async ( options: { + regions?: Region[]; families?: string[]; sizes?: string[]; priceMax?: number; @@ -103,8 +103,11 @@ export const getGlobalSpotPrices = async ( } = {}, ) => { const { families, sizes, priceMax, limit, quiet, accessKeyId, secretAccessKey } = options; - let { productDescriptions, instanceTypes } = options; + let { regions, productDescriptions, instanceTypes } = options; let rtn: EC2.SpotPrice[] = []; + + if (regions === undefined) regions = defaultRegions; + if (productDescriptions && productDescriptions.indexOf(ProductDescription.windows) >= 0) { productDescriptions = [ProductDescription.Windows, ProductDescription['Windows (Amazon VPC)']]; } else if (productDescriptions && productDescriptions.indexOf(ProductDescription.linux) >= 0) { diff --git a/src/regions.ts b/src/regions.ts index a1debacc..3e68d3f1 100644 --- a/src/regions.ts +++ b/src/regions.ts @@ -19,7 +19,7 @@ export type Region = | 'me-south-1' | 'sa-east-1'; -export const regions: Region[] = [ +export const defaultRegions: Region[] = [ 'us-east-1', 'us-east-2', 'us-west-1',