環境
ruby(ruby 3.1.1p18)
rails(Rails 7.0.2.3)
docker
minitest(ローカルテスト)
やりたいこと
docker-composeのタイミングでdynamodbにテーブルを作成する。
テストケース単位でfixtureを読み込み、テーブルにデータをインサートする。
環境作成
dynamodbのコンテナイメージとテーブル作成用のawscliのコンテナイメージを使用します。
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のホスト名が変わるため、コマンドライン引数でホスト名を受け取っています。
テーブル作成コマンド
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でした。