DynamoDBをローカルで動かす

serverless frameworkでDynamoDB Localを動かす(Mac)

こんにちは!

serverless frameworkを使って、DynamoDB Localを動かしたことについて書きます。

DynamoDBを使った開発をしており、AWS上の設定を変更せずにローカルで一回テストしたかったので、 DynamoDB Localを導入することにしました。

serverless framework、DynamoDBについての説明は省略します。 また、serverless frameworkのインストールは完了済みの前提で記載します。 OSは、MacOS Ventura(13.4)/Intelを使ってます。

に分けて記載してます。 (2023年6月時点での情報になります。古くなってしまっている場合もありますのでご了承下さい。)


DynamoDB Localのインストール

  • 下記コマンドでインストールします。
serverless plugin install -n serverless-dynamodb-local
serverless dynamodb install
  • ここで、注意点があり、現段階だと下記の対応をしない場合、「serverless dynamodb install」でエラーになりました。
    • エラーメッセージ
    Error getting DynamoDb local latest tar.gz location undefined: 403
    Error in downloading Dynamodb local Error: Parse Error: User callback error
    
    • 対応方法
      • 下記のissueを参考にライブラリを直接修正します。
      • 要約すると2点の対応になります。
        1. /node_modules/dynamodb-localhost/dynamodb/config.json
          • download_urlの値を「http」から「https」へ変更
        2. /node_modules/dynamodb-localhost/dynamodb/installer.js
          • 「require(“http”)」を「require(“https”)」へ変更。

DynamoDB Localの起動

  • serverless.ymlに下記を追記します。
custom:
  〜省略〜
  dynamodb:
    start:
      host: 127.0.0.1
      migrate: true
      inMemory: true
      port: 8000
  〜省略〜
plugins:
  〜省略〜
  - serverless-dynamodb-local
  • 下記コマンドで起動します。
serverless dynamodb start
  • 注意点
    • 私の環境だとserverless.ymlがhost:localhostの記載になっていた場合、下記のエラーが発生する時が有りました。これはmigrateエラーなのでDynamoDBの起動自体は出来てます。
      • エラーメッセージ
      UnknownEndpoint: Inaccessible host: `localhost' at port `8000'. This service may not be available in the `localhost' region.
      
      • 対応方法
        • serverless.ymlの記載をhost: 127.0.0.1にする。
        • 下記の環境変数を登録。
        export AWS_DEFAULT_REGION=localhost
        export AWS_REGION=localhost
        
    • 過去のバージョンでは http://localhost:8000/shell にアクセスすることでDBの操作ができていたようですが、現在は出来なくなっているようです。代わりに「DynamoDB Admin」というフリーソフトを使いました。

DynamoDB AdminをDockerで起動

  • dockerを使い、DynamoDB Adminを起動しました。
    • 「host.docker.internal」とはコンテナ内部からホストをさす場合に使うドメイン名になります。
docker run -p 8001:8001 -e DYNAMO_ENDPOINT=http://host.docker.internal:8000 -e AWS_REGION=localhost aaronshaf/dynamodb-admin:latest
  • 停止させる場合は、docker stopで出来ます。
docker ps
docker stop [コンテナID]

最後に

なかなかはまりどころが有りスムーズには進みませんでした。。。 もしかしたらDynamoDB Localを使うより、 motoライブラリのmockを使用した方が環境構築は簡単だったかもしれないです。 ひとまず、ローカルでDynamoDBを動かせるようになって良かったです。