1 Introduction
This libary provides support for some of the Amazon Web Services.
1.1 Scope and philosophy
The goal is to provide just enough “wrapper” around a service, to make it convenient to use from Racket, without obscuring how the service actually works.
The single most error-prone and time-consuming thing about working with AWS is calculating an authentication signature. If you don’t do it exactly right, the request will be rejected and the specific reason why is often not apparent. Furthermore, the method can vary subtly among some services. You can burn many hours on this, or you can use this library.
In addition there is help for the tedium of marshalling values into and out of the HTTP requests and responses.
Most of the functions do not return a failure value, instead they will throw an exn:fail:aws.
This library uses my http library to make HTTP requests, instead of net/url. Why? To support HTTP 1.1, including the Expect: 100-continue request header and response behavior, which is especially important when PUTting large objects to S3 buckets. If S3 is going to fail your request or redirect you to another URI, it is helpful for that to happen before you transmit the entire entity body. Another useful feature in HTTP 1.1 is the Range header, which permits us to get just a range of bytes from an S3 object.
1.2 Which services?
The services supported are those that are most likely to be used in an application, and used via an AWS API.
Not supported are services like EC2 that are mainly about managing the “infrastructure” for your application, such as creating servers on which to run. The assumption is that you can use the command line tools or web app console to do that. (If your application is about managing infrastructure, sorry.)
Also not supported is the ElastiCache service. Its application use interface is the memcached protocol. The unique API that Amazon does provide, is for managing the infrastructure of ElastiCache, not for using it. Likewise RDS: The AWS API lets you create and manage database servers, but you use them in your application like you would any other MySQL server.