はじめに
以前にGo+React+MySQL環境をつくる記事を投稿したのですが、
GoをRailsに、MySQLをdynamodb-localに変更する機会があったので簡単にまとめてみます。
Reactに関しては同じ手順になるので割愛します
ディレクトリ準備
sample-project
┣ docker
┃ ┣ backend
┃ ┃ ┗ Dockerfile
┃ ┣ react
┃ ┗ Dockerfile
┣ .env
┣ docker-compose.yml
ファイル準備
FROM node
RUN apt-get update
FROM ruby:2.7.5 as base
RUN apt-get update && apt-get install -y build-essential make
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && apt-get install -y nodejs
RUN npm install --global yarn
RUN mkdir /app
WORKDIR /app
COPY ./backend/Gemfile /app/Gemfile
COPY ./backend/Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY ./backend /app
FROM base as dev
services:
app:
build: ./docker/react
container_name: react_qiita
tty: true
working_dir: /usr/src/app
volumes:
- ./react:/usr/src/app
command: sh -c "yarn start"
ports:
- "3000:3000"
rails_qiita:
build:
context: .
dockerfile: ./docker/rails/Dockerfile
target: dev
command: bash -c "rm -f tmp/pids/server.pid && yarn install && bundle exec rails s -p 8080 -b '0.0.0.0'"
volumes:
- ./backend:/app
container_name: rails_qiita
tty: true
ports:
- "8080:8080"
dynamodb-qiita-local:
command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"
image: "amazon/dynamodb-local:latest"
container_name: dynamodb-qiita-local
ports:
- "8000:8000"
volumes:
- "./docker/dynamodb:/home/dynamodblocal/data"
working_dir: /home/dynamodblocal
dynamodb-qiita-admin:
container_name: dynamodb-qiita-admin
image: aaronshaf/dynamodb-admin:latest
environment:
DYNAMO_ENDPOINT: ${DYNAMO_ENDPOINT}
ports:
- "8001:8001"
depends_on:
- dynamodb-qiita-local
Rails
Rails用のプロジェクトフォルダを作成し、Gemfile,Gemfile.lockを作成します
mkdir backend && cd backend
touch Gemfile Gemfile.lock
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem 'rails'
今回はapiモードでbackendフォルダにプロジェクトを作成します
rails new . --api
Gemfileが更新されるので以下を実行します
docker-compose build
docker-compose up
localhost:8080にアクセスして以下の画面が表示されていればOKです
dynamodb-local
こちらも以前にDockerでdynamodb-local環境を構築する記事を投稿していますが、
ここではRailsとdynamodb-localの疎通確認まで行います
今回も記事と同じくGUIからdynamodb-localを操作できるようにコンテナを2つ立てています
dynamodb-adminのエンドポイントをdynamodb-localに設定することで、GUIから操作できるようになります
そのエンドポイントを環境変数として.envに設定しています
また、dynamodb-localでdb操作をする上で必要なIAMの認証情報も設定します
dynamodb-localに接続するIAMユーザーは一対一であることにも注意します
DYNAMO_ENDPOINT=dynamodb-qiita-local:8000
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=ap-northeast-1
docker-compose upでコンテナを起動すると次のようなエラーが出る場合があります
WARNING: [sqlite] cannot open DB[1]: com.almworks.sqlite4java.SQLiteException: [14] unable to open database file
この時の解決方法はこちらの記事を参考にしました
これはコンテナを起動した際に作成される./docker/dynamodbファイルへのアクセス権限がなくてエラーになっているので、以下を実行して権限問題を解消します
sudo chmod 777 ./docker/dynamodb
再度コンテナを起動し、localhost:8001にアクセスして以下の画面が表示されていればOKです
Railsとdynamodb-localの疎通確認
Gemfileにdynamoidを追加します
gem dynamoid
IAM認証をするためにaws.ymlとaws.rbを作成します
development:
access_key_id: ENV['AWS_ACCESS_KEY_ID']
secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
region: ENV['AWS_DEFAULT_REGION']
endpoint: http://dynamodb-qiita-local:8000
Aws.config.update(Rails.application.config_for(:aws).symbolize_keys)
次に疎通確認をするためにPostモデルを作成します
class Post
include Dynamoid::Document
table name: :posts, key: :id, capacity_mode: :on_demand
field :name, :string
end
ここまででGemfileが更新されているのと、
uninitialized constantというエラーを回避するためにRailsサーバを再起動する必要があるのでbuildとupをします
docker-compose build
docker-compose up
Railsが問題なく立ち上がることを確認したら、Railsコンソールに入りレコードを作成してみます
$ docker exec -it rails_qiita sh
# rails c
> a=Post.new
> a.id="1"
> a.name="hoge"
> a.save
作成に成功するとコンソールでは以下の表示がされます
localhost:8001にアクセスしてみると、テーブルとレコードが作成されていることを確認できます
また、aws cliでもテーブルとレコードが作成できることを確認してみます
// テーブル作成
aws dynamodb \
--region ap-northeast-1 \
--endpoint-url http://localhost:8000 \
create-table \
--table-name HogeTable \
--attribute-definitions \
AttributeName=userId,AttributeType=N \
AttributeName=userName,AttributeType=S \
--key-schema \
AttributeName=userId,KeyType=HASH AttributeName=userName,KeyType=RANGE \
--billing-mode PAY_PER_REQUEST
// レコード作成
aws dynamodb \
--region ap-northeast-1 \
--endpoint-url http://localhost:8000 \
put-item \
--table-name HogeTable \
--item '
{
"userId": {
"N": "1"
},
"userName": {
"S": "ほげ太郎"
}
}
'
確認できました
React
割愛
おわりに
今後はdynamodb-localの使い方やreactとrailsの疎通などを学んでいきます
参考
Rails関連
dynamodb-local関連
Railsとdynamodb-localの疎通関連