LoginSignup
15
13

More than 5 years have passed since last update.

Haskell で AWS を扱う amazonka ライブラリの紹介

Posted at

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 環境を構築済みとします。

  1. IAM の設定
    AWS IAM でユーザを作成し、S3 に対する権限を付与します。
    accessKey と secretKey は次で使うので忘れずに記録しておくこと。
  2. 環境変数の設定
    上記のユーザ作成時に取得した accessKey, secretKey を環境変数に渡します。
    export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY
    export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY
  3. リポジトリの取得
    git clone https://github.com/algas/amazonka-examples.git
  4. ビルド
    cd amazonka-examples && stack build
  5. 動作確認
    stack exec amazonka-examples
    上記のコマンドを入力すると、以下のような出力が得られます。
    [BucketName "mybucket1",BucketName "mybucket2"]

依存関係

Amazonka, Amaaonka-S3 以外に Lens に依存しています。
Lens ライブラリの説明はここでは省略します。

amazonka-examples.cabal
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 バケットの一覧を表示するクライアントを実装します。

Main.hs
{-# 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

exampleIO ListBucketsResponse を返します。上述のとおり環境変数で AWS の認証情報を設定しています。認証情報については、環境変数以外にも aws configure で設定したファイルと profile から設定する方法などの複数の設定方法があります。
sendlistBuckets を渡して得られた AWSResponse から IO へとモナド変換を行っています。
send :: (MonadAWS m, AWSRequest a) => a -> m (Rs a)

printBuckets では ListBucketsResponse から bName すなわちバケット名を取得しています。 ^.lens の関数です。

以上が S3 のバケット名一覧を取得するコードです。
Amazonka には S3 以外にも AWS サービスを扱う機能が実装されています。

15
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13