AmazonのDynamoDBを使って開発する際、AWS上のDynamoDBを使うのが王道だとは思うのですが、オフラインでは使えないという泣き所があります。
DynamoDBを選択した時点でオフライン開発を考慮しないといけないのが特殊なケースだとは思うのですが、私がよく使っている九州新幹線はLTEがあまり繋がらないんですよ・・・
で、AWSはローカルで動作するDynamoDBを提供してくれています。
さて一方、HaskellでAWSを扱うライブラリとしてはamazonkaが便利です。
amazonkaのファミリーにはamazonka-dynamodbというものがあって、文字通りDynamoDBを扱うライブラリです。
前置きが長くなりましたが、amazonka-dynamodbを使う際にローカルのDynamoDBに接続する方法を紹介します。
Network.AWS.Envの_envOverrideで接続先を切り替える
これだけ分かってしまえば解決なのですが、ただ
- _envOverrideは公開されておらずLensでアクセスしないといけない
- _envOverrideの型は
!Dual (Endo Service)
となっていてDualとかEndoとか知らなかったからビビった。
などの軽い罠があります。なんでDualやEndoが必要なのかは、正直理解できていないのですが、次のようなコードでローカルのDynamoDBに接続することが出来ます。
{-# LANGUAGE OverloadedStrings #-}
module Lib2 where
import Control.Lens
import Data.Monoid
import Network.AWS
env :: IO Env
env = do
e <- newEnv $ FromEnv "AWS_ACCESS_KEY" "AWS_SECRET_ACCESS_KEY" Nothing Nothing
pure $ e&envOverride .~ localOverride
localOverride :: Dual (Endo Service)
localOverride = Dual $ Endo localService
localService :: Service -> Service
localService svc = svc { _svcEndpoint = \_ -> localEndpoint }
localEndpoint :: Endpoint
localEndpoint = Endpoint {
_endpointHost = "localhost"
, _endpointSecure = False
, _endpointPort = 8000
, _endpointScope = ""
}
以上です。