Haskell で AWS を扱うライブラリの紹介 (Amazonka)
Haskell で AWS を扱える実用的なライブラリとして Amazonka を紹介します。
本記事の執筆時点で十分にメンテナンスかつ網羅的に実装されているライブラリの1つです。
今回は非常に単純な実装例として、S3バケットを表示させてみます。
本記事のソースコードは以下の github repository にアップロードされています。
https://github.com/algas/amazonka-examples
前提知識
本記事では以下のような読者を想定しています。
- AWS IAM を使うことができる
- AWS Client から S3 を使える環境を持っている
- Haskell Lens の基本を理解している
セットアップ
haskell stack 環境を構築済みとします。
- IAM の設定
AWS IAM でユーザを作成し、S3 に対する権限を付与します。
accessKey と secretKey は次で使うので忘れずに記録しておくこと。 - 環境変数の設定
上記のユーザ作成時に取得した accessKey, secretKey を環境変数に渡します。
export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY
export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY
- リポジトリの取得
git clone https://github.com/algas/amazonka-examples.git
- ビルド
cd amazonka-examples && stack build
- 動作確認
stack exec amazonka-examples
上記のコマンドを入力すると、以下のような出力が得られます。
[BucketName "mybucket1",BucketName "mybucket2"]
依存関係
Amazonka, Amaaonka-S3 以外に Lens に依存しています。
Lens ライブラリの説明はここでは省略します。
executable amazonka-examples
hs-source-dirs: app
main-is: Main.hs
ghc-options: -threaded -rtsopts -with-rtsopts=-N
build-depends: base
, lens
, amazonka
, amazonka-s3
default-language: Haskell2010
実装
S3 バケットの一覧を表示するクライアントを実装します。
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Lens
import Network.AWS
import Network.AWS.S3
import System.IO
example :: IO ListBucketsResponse
example = do
e <- newEnv Tokyo $ FromEnv "AWS_ACCESS_KEY_ID" "AWS_SECRET_ACCESS_KEY" Nothing
runResourceT . runAWS e $ send listBuckets
printBuckets :: IO ()
printBuckets = do
ex <- example
print $ [ x ^. bName | x <- ex ^. lbrsBuckets ]
main :: IO ()
main = printBuckets
example
は IO ListBucketsResponse
を返します。上述のとおり環境変数で AWS の認証情報を設定しています。認証情報については、環境変数以外にも aws configure
で設定したファイルと profile から設定する方法などの複数の設定方法があります。
send
は listBuckets
を渡して得られた AWSResponse
から IO へとモナド変換を行っています。
send :: (MonadAWS m, AWSRequest a) => a -> m (Rs a)
printBuckets
では ListBucketsResponse
から bName
すなわちバケット名を取得しています。 ^.
は lens
の関数です。
以上が S3 のバケット名一覧を取得するコードです。
Amazonka には S3 以外にも AWS サービスを扱う機能が実装されています。