2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

amazonka-dynamodbで接続先をローカルのDynamoDBにする

Last updated at Posted at 2017-12-09

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 = ""
                }

以上です。

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?