From time to time, I want a quick tool to help me compare EC2 instances price. https://ec2instances.info/ works great but it's somewhat slow and didn't have a way to just `curl` from terminal.
So I develop this small tool which you can do thing like
Are you manually detecting Curl specifically? If I use anything other than Curl, e.g. HTTPie or wget, I get the HTML page, even if I provide an `Accept: text/plain` request header. If I use one of those tools and spoof the Curl user agent string, I get the text/plain response. You should probably just look at the Accept request header, it’s there specifically so clients can tell you what kind of response they want.
but why "ansi"? ANSI is only an encoding. You can have html that's in ansi, and you can have something like OP's that's not in ansi (eg. if you add emojis).
This is "ANSI" as in ANSI X3.64 escape sequences, not "ANSI" as in a character encoding. You can output color to curl on an ANSI-compatible terminal but not to something expecting actual plain text like a browser.
I think text/ecma48 would be a better name. There are lots of ANSI standards. (I guess text/ansi-x3.64 might also work, but text/ecma48 seems simpler.)
From the wiki: "The phrase ANSI character set has no well-defined meaning and has been used to refer to the following, among other things"
So if you are thinking of CP-437 or Windows-1252 I suppose that's fair, but generally in the context of terminal apps "ANSI" without qualification refers to the escape sequences.
Now I am curious though, did ANSI the standards body have any official character encoding standards?
You can do cool things with this very quickly. For example, I always wondered the price differences between different regions, you can compare two instance prices quickly:
I've moaned about this with other CLI tools as well. I wish trend of using RGB values in ANSI escape codes would die because as ugly as the 16*3 colour fields¹ are, they are at least customisable so people can use palettes that suite their terminal and eyesight.
You don't get any such opportunity if the developers hard code the colour values in (and it's worse with a tool like this because you can't even set an environmental variable to change the tools behaviour)
Can you link me to a way to use colours that change with the terminal colour preset? I haven't come across anything like that or maybe didn't pay attention. It would be really helpful
You said you can't even set an env variable to change them so I assume that there is an even better way?
Just bare in mind that any numbers you see in documentation are sent as ASCII values rather than integers. eg `ESC[31m` (red text) should be sent to the terminal as
I really like this, but the horizontal lines are not helpful at all and just double the number of lines for no benefit.
You can obviously
curl ec2.shop | grep -v ─
but I'm not sure I want to do that every time and I'm not exactly sure why, but when I do that, I can't select the entire row, only a column at a time (zsh on iTerm 2).
I personally try looking into implementing a curl "interface" to one of my projects, realised that it actually need to check the user-agent (of curl and a plethora of curl alternatives) which I find kind of weird...
> realised that it actually need to check the user-agent
Like someone suggested for the featured page as well, I recommend you make use of the accept header.
For example, assuming your interface is outputting freeform text (since the goal was to have something readable in terminal), you could use something like this:
Accept: text/vnd.myproject.tui+plain; version=1.0
(Substitute “myproject” with the actual name of your project.)
The reason it check `curl` agent is because it share the same endpoint (root url) for both of `curl` page and browser version(the one with dropdown, grid etc)
Neat! The prices are without currency symbols - I guess it's always USD? Or maybe dependent on the region…? Would be nice if the $ symbol is printed, and even better if I could see the prices of my european servers in european currency - maybe add a param to select the currency?
It would be very helpful if you would support the `Accept: application/json` header. This way, we could use it in combination with jq to do arbitrary filtering:
For HTTPS to truly be meaningful we need to stop supporting HTTP as an on-ramp, to prevent people from just hijacking that initial unencrypted connection and sending anything they want.
If you MITM and the user agent send an HTTP request for ec2.shop it does not matter whether the webserver supports HTTP or not, you can send a fake HTTP response either way.
Anyone who likes to prevent that can submit their site to the HSTS preload list. Chrome, Firefox and Edge use a shared one, the only two relevant other agents (Safari and curl) unfortunately don't though.
I truly do not care if someone goes through the effort to MITM my curl of ec2.shop to inject fake prices or something like that.
There's nothing here that's going to be executed, it'll just be printed or grepped.
In theory you could exploit a 0 day in curl or my terminal or something like that, but I think if you truly think about the risks and tradeoffs here it's really not worth worrying about.
If curl had an hsts list to make this irrelevant that'd also be cool.
Could you update the `...&filter...` example to wrap the URL in quotes so that the `&` isn't interpretted by the shell as sending the process to the background?
Yes, it isn't that hard to support Spot prices but the price change too often so I have to scrape it for every 5 minutes. Right now, I haven't had the automation to run this yet but it's doable and my pain point too =)
Can I be sure that the prices from this endpoint are accurate (i.e. if Amzn changes the prices, this endpoint will reflect that change)?
Off-topic: if I request a spot instance, is there any way (API/cli) to know how much Amzn charges me every hour for that instance?
I've built something like this in the past (I was running a beefy server for my friends, and wanted them to know how much it was costing us at an hourly rate, before they ran it for 3 weeks straight).
It's definitely possible and not very challenging, but the API Documentation for prices was pretty weak when I built it (a year or two ago, written in Go if it makes a difference). The google cloud prices API was similarly gross. It was kinda fun, but I wouldn't enjoy maintaining that code. In reality, it turns out that $/hour isn't a super straightforward metric (there are many dimensions that go into it), so it's not super straightforward to query.
It’s not matching every number 4, just the ones at the start of a column. The m is coming from “ESC[31m”, the escape code used to set the color of the text in the column.
Neat, didn't realize how much the options for ec2 have grown over time. Can those instances with 100Gbps networking actually push that to upstream transit (ie. the Internet)? Or is that mostly for internal network communication between instances and other AWS services?
Nice list. Recently, I loaded all the prices into an Excel document to make things easier for projecting costs and determining prices. I always use the following formula for estimating monthly costs on Amezmo.
So I develop this small tool which you can do thing like