LoginSignup
8
1

More than 1 year has passed since last update.

ローカルテストでdynamodbを動くようにした

Last updated at Posted at 2023-02-03

環境

ruby(ruby 3.1.1p18)
rails(Rails 7.0.2.3)
docker
minitest(ローカルテスト)

やりたいこと

docker-composeのタイミングでdynamodbにテーブルを作成する。
テストケース単位でfixtureを読み込み、テーブルにデータをインサートする。

環境作成

dynamodbのコンテナイメージとテーブル作成用のawscliのコンテナイメージを使用します。

docker-compose
dynamodb-local:
        command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"
        image: "amazon/dynamodb-local:latest"
        ports:
            - "8000:8000"
        working_dir: /home/dynamodblocal
        volumes:
            - /local_path/:/home/dynamodblocal/data
awscli:
    image: "amazon/aws-cli"
    entrypoint: [ "" ]
    tty: true
    command: "/bin/bash /usr/app/create_dynamodb.sh 'ホスト名'"
    volumes:
        - type: bind
          source: ./local_path/create_dynamodb.sh
          target: /usr/app/create_dynamodb.sh
    environment:
        AWS_ACCESS_KEY_ID: fake_access_key
        AWS_SECRET_ACCESS_KEY: fake_secret_access_key
        DYNAMODB_REGION: ap-northeast-1
    depends_on:
        - dynamodb-local

dynamodbに関してはawsの公式ドキュメントにdocker-composeが載っていました。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.DownloadingAndRunning.html
awscliは公式ドキュメントから発見できなかったので、既存コードにあったmysqlを参考にして作成しました。
github actoinとローカルの時でdynamodbのホスト名が変わるため、コマンドライン引数でホスト名を受け取っています。

テーブル作成コマンド

create_dynamodb.sh
aws dynamodb create-table \
    --table-name table_name \
    --attribute-definitions \
        AttributeName=CustomerId,AttributeType=N \
        AttributeName=SortKey,AttributeType=S \
    --key-schema \
        AttributeName=CustomerId,KeyType=HASH \
        AttributeName=SortKey,KeyType=RANGE \
    --provisioned-throughput \
    ReadCapacityUnits=1,WriteCapacityUnits=1 \
    --endpoint-url http://ホスト名:8000 \
    --region ap-northeast-1 \
    --no-cli-auto-prompt \
    --no-cli-pager

ここで要注意なのが、--no-cli-pagerです。
テーブルを作成するとき、aws側からテーブル定義のjsonが帰ってくるのですがそれがpagerで開かれるため処理が終わらず、それより下のコードが実行されないです。
これを利用して、わざとawscliのコンテナを起動しっぱなしにしてコマンドの検証をしたりしていました。
あと、ローカルではエンドポイントとリージョンの指定が必須です。
ホスト名はローカルではコンテナ名でgithub actionではlocalhostでした。

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