DynamoDB をlocal環境にインストールしてみた
はじめに
こんにちは。DAAEの栗山です。
今回はlocal環境にDynamoDBをインストールしてみたいと思います。
趣味と勉強を兼ねて、AWSを使用した「サーバレスアプリを作ってみたいな~」と思っているのですが、やはりlocal環境で開発できると何かと安心ですよね。どうしたものかと調べてみると、DynamoDBはlocal環境で動かすことのできるダウンロード版があることがわかりました。
今回は「 DynamoDB をlocal環境にインストールする方法」&「その際に発生したエラーの解決方法」をご紹介します。
動作環境
今回使用した環境は以下になります。
(WSL) Ubuntu 20.04.5 LTS
AWS CLIがインストール済み
$ aws --version
aws-cli/2.9.0 Python/3.9.11 Linux/5.10.102.1-microsoft-standard-WSL2 exe/x86_64.ubuntu.20 prompt/off
Docker Composeがインストール済み
$ docker compose version
Docker Compose version v2.4.1
AWS CLIとDocker Composeについては、動作させた環境のバージョンを上記に記します。
local環境用DynamoDBってどんなもの?
Setting up DynamoDBの説明のポイントをまとめます。
local環境用DynamoDBを使用することで、DynamoDBのWEBサービスを使用することなく、local環境で開発ができます。
local環境での検証が終わったら、DB接続エンドポイントを変更することで、DynamoDBのWEBサービスへ移行できます。
どうやら望んでいた通りのプロダクトのようです! これなら開発時のバグでどんなにたくさんのリクエストを投げても課金されません。
local環境用DynamoDBのインストール方法
Deploying DynamoDB locally on your computerによると、local環境用DynamoDBのインストール方法は3つあります。
Download ※JRE必須
Docker
Apache Maven
今回は私にとって最も手軽なDockerを使用します。
Dockerによるlocal環境用DynamoDBの起動
適当なディレクトリを作成して、docker-compose.ymlを配置します。
[docker-compose.yml]
version: '3.8'
services:
dynamodb-local:
command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"
image: "amazon/dynamodb-local:latest"
container_name: dynamodb-local
ports:
- "8000:8000"
volumes:
- "./docker/dynamodb:/home/dynamodblocal/data"
working_dir: /home/dynamodblocal
ポイントをメモしておきます。
portは8000
ホストに作成されるvolumeは「./docker/dynamodb」
※上記のdocker-compose.ymlはAWS公式のものです。随時アップデートがあるでしょうから、使用する際はリンクから最新のものをご使用ください。
Dockerを立ち上げます。
$ cd docker-compose.ymlを配置したディレクトリ
$ docker compose up
以下のようなログが出れば、起動成功です!
dynamodb-local | Initializing DynamoDB Local with the following configuration:
dynamodb-local | Port: 8000
dynamodb-local | InMemory: false
dynamodb-local | DbPath: ./data
dynamodb-local | SharedDb: true
dynamodb-local | shouldDelayTransientStatuses: false
dynamodb-local | CorsParams: null
dynamodb-local |
local環境用DynamoDBへのアクセスでエラー発生&解決
こちらに記載がある通りのコマンドで Dockerで起動したDynamoDBにアクセスします。
ポイントは --endpoint-urlオプションでlocal環境のURLを指定することですね。
$ aws dynamodb list-tables --endpoint-url "http://localhost:8000"
しかしエラーが出てしまいました。
$ aws dynamodb list-tables --endpoint-url "http://localhost:8000"
Connection was closed before we received a valid response from endpoint URL: "http://localhost:8000/".
Dockerのコンソール(DynamoDBのログ)には以下のようなエラーが出ています。これはいったいどういうことでしょうか?
dynamodb-local | WARNING: [sqlite] SQLiteQueue[shared-local-instance.db]: stopped abnormally, reincarnating in 3000ms
省略
stackoverflowを見てみると、ホストに作成されるvolumeのアクセス権の問題のようです。
実際に権限を確認してみましょう。
$ cd docker-compose.ymlを配置したディレクトリ
$ ls -la ./docker/dynamodb/
total 8
drwxr-xr-x 2 root root 4096 Dec 11 09:14 .
drwxr-xr-x 3 root root 4096 Dec 11 09:14 ..
このあたりの権限がrootの755になっているのが問題のようですね。上記stackoverflowのこちらの解決策を試してみます(ログインユーザーの775に変更)
$ sudo chown $USER docker -R
$ chmod 775 -R docker
このあと、あらためてdocker composeコマンドでDocker環境を立ち上げ、DynamoDBに接続します。
$ aws dynamodb list-tables --endpoint-url "http://localhost:8000"
{
"TableNames": []
}
やりましたね! これでlocal環境版DynamoDBをインストールし、無事に接続することができました!
参考文献
\もっと身近にもっとリアルに!DAAE公式Twitter/
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/