🐕

Rails AWS DynamoDBの使用

2022/11/12に公開約3,100字

作成したサンプルはこちら
https://github.com/chikugoy/rails_dynamodb

Rails の API を下記記事で作成していますので、そちらを本記事で流用します。
https://zenn.dev/korezen/articles/cc72b917132ad3

AWS DynamoDB は Local を使用します。
https://github.com/deangiberson/docker_aws_dynamodb_local

aws-sdk と dynamoid インストール

Gemfile
gem 'aws-sdk', '~> 3.0'
gem 'dynamoid', '~> 3'

aws-sdk と dynamoid の設定

config/initializers/aws.rb
Aws.config.update({
  region: ENV['AWS_DEFAULT_REGION'],
  credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
})
config/initializers/dynamoid.rb
Dynamoid.configure do |config|
  config.region = 'ap-northeast-1'
  config.endpoint = 'http://rails_dynamodb:8000'
  config.namespace = 'development'
  config.read_capacity = 5
  config.write_capacity = 5
end

rails_dynamodb-admin も入れて aws-dynamodb-local の確認ができるようにしています

docker-compose.yml
version: "3.9"
services:
  rails_dynamodb_db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
    ports:
      - "5432:5432"
  rails_dynamodb_web:
    build:
      context: .
      dockerfile: ./docker/Dockerfile
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    environment:
      AWS_ACCESS_KEY_ID: dynamodb
      AWS_SECRET_ACCESS_KEY: dynamodb
      AWS_DEFAULT_REGION: ap-northeast-1
    depends_on:
      - rails_dynamodb_db
      - rails_dynamodb
  rails_dynamodb:
    image: deangiberson/aws-dynamodb-local
    ports:
      - "8000:8000"
    environment:
      AWS_ACCESS_KEY_ID: dynamodb
      AWS_SECRET_ACCESS_KEY: dynamodb
      DEFAULT_REGION: ap-northeast-1
  rails_dynamodb-admin:
    container_name: rails_dynamodb-admin
    image: aaronshaf/dynamodb-admin:latest
    environment:
      - DYNAMO_ENDPOINT=rails_dynamodb:8000
      - AWS_ACCESS_KEY_ID=dynamodb
      - AWS_SECRET_ACCESS_KEY=dynamodb
      - AWS_REGION=ap-northeast-1
    ports:
      - "8001:8001"
    depends_on:
      - rails_dynamodb

aws-dynamodb-local の確認

http://127.0.0.1:8001/
development_regex というテーブルをUIから手動で作成しています。

model の編集

既存モデルを Dynamoid 用に編集します。

app/models/regex.rb
class Regex
  include Dynamoid::Document

  table name: :regex, key: :regex_id
  field :title, :string
  field :created_at, :datetime
  field :updated_at, :datetime
end

controller の編集

既存コントローラーを Dynamoid 用に編集します。

app/controllers/api/v1/regexes_controller.rb
module Api
  module V1
    class RegexesController < ApplicationController
      before_action :set_regex, only: [:show, :update, :destroy]

      def index
        # regexes = Regex.order(created_at: :desc)
        regexes = Regex.all
        render json: { status: 'SUCCESS', message: 'Loaded regexes', data: regexes }
      end
    end
  end
end

確認

テストデータ投入後
http://localhost:3000/api/v1/regexes

{
    "status": "SUCCESS",
    "message": "Loaded regexes",
    "data": [
        {
            "regex_id": "1"
        }
    ]
}

Discussion

ログインするとコメントできます