The aws package attempts to provide support for using Amazon Web Services like S3 (storage), SQS (queuing) and others
to Haskell programmers. The ultimate goal is to support all Amazon Web Services.
Make sure you have a recent GHC installed, as well as cabal-install, and installation should be as easy as:
$ cabal install awsIf you prefer to install from source yourself, you should first get a clone of the aws repository, and install it from
inside the source directory:
$ git clone https://github.com/aristidb/aws.git
$ cd aws
$ cabal installThe aws package is organised into the general Aws module namespace, and subnamespaces like Aws.S3 for each Amazon Web
Service. Under each service namespace in turn, there are general support modules and and Aws.<Service>.Commands.<Command>
module for each command. For easier usage, there are the “bundling” modules Aws (general support), and Aws.<Service>.
The primary concept in aws is the Transaction, which corresponds to a single HTTP request to the Amazon Web Services.
A transaction consists of a request and a response, which are associated together via the Transaction typeclass. Requests
and responses are simple Haskell records, but for some requests there are convenience functions to fill in default values
for many parameters.
To be able to access AWS resources, you should put your into a configuration file. (You don’t have to store it in a file,
but that’s how we do it in this example.) Save the following in $HOME/.aws-keys.
default AccessKeyID SecretKey
You do have to replace AccessKeyID and SecretKey with the Access Key ID and the Secret Key respectively, of course.
Then, copy this example into a Haskell file, and run it with runghc:
{-# LANGUAGE OverloadedStrings #-}
import qualified Aws
import qualified Aws.S3 as S3
import Data.Conduit
import Data.Conduit.Binary
import Data.IORef
import Data.Monoid
{- A small function to save the object's data into a file. -}
saveObject :: Aws.HTTPResponseConsumer ()
saveObject status headers source = source $$ sinkFile "cloud-remote.pdf"
main :: IO ()
main = do
{- Set up AWS credentials and the default configuration. -}
cfg <- Aws.baseConfiguration
let s3Cfg = Aws.defaultConfiguration
{- Create an IORef to store the response Metadata (so it is also available in case of an error). -}
metadataRef <- newIORef mempty
{- Create a request object with S3.getObject and run the request with simpleAwsRef. -}
Aws.simpleAwsRef cfg s3Cfg metadataRef $ S3.getObject "haskell-aws" "cloud-remote.pdf" saveObject
{- Print the response metadata. -}
print =<< readIORef metadataRefYou can also find this example in the source distribution in the Examples/ folder.
- I get an error when I try to access my bucket with upper-case characters / a very long name.
Those names are not compliant with DNS. You need to use path-style requests, by setting
s3RequestStylein the configuration toPathStyle. Note that such bucket names are only allowed in the US standard region, so your endpoint needs to be US standard.
- 0.5.0
-
New configuration system: configuration split into general and service-specific parts.
Significantly improved API reference documentation.
Re-organised modules to make library easier to understand.
Smaller improvements.
- 0.4.1
- Documentation improvements.
- 0.4.0.1
- Change dependency bounds to allow the transformers 0.3 package.
- 0.4.0
- Update conduit to 0.4.0, which is incompatible with earlier versions.
- 0.3.2
- Add awsRef / simpleAwsRef request variants for those who prefer an
IORefover aData.Attempt.Attemptvalue. Also improve README and add simple example.
- aws on Github
- aws on Hackage (includes reference documentation)
- Official Amazon Web Services website