🐡

GitHub Actionsにて、サービスコンテナ経由で、DynamoDB Localを使う

2022/05/29に公開

「GitHub Actions で、DynamoDB Local を使ったテストを動かしたい」となりました。

「github actions dynamodb local」とかでググったんですが、サードパーティの Actions を使う例しかヒットしませんでした。

同方法でも良いかと思いますが、なるべく公式 Action 以外使いたくなかったので、サービスコンテナを使ってみることにしました。

https://docs.github.com/ja/github-ae@latest/actions/using-containerized-services/about-service-containers

この記事のコードは、下記に置いてあります。

https://github.com/hirokisakabe/dynamodb-local-actions-sample

実際のコードの抜粋

.github/workflows/ci.yml
# GitHub Actionsの定義
name: CI

on:
  pull_request:
  push:
    branches:
      - main

jobs:
  sample-job-on-the-runner-machine:
    runs-on: ubuntu-latest
    env:
      AWS_ACCESS_KEY_ID: DUMMY_AWS_ACCESS_KEY_ID
      AWS_SECRET_ACCESS_KEY: DUMMY_AWS_SECRET_ACCESS_KEY
      AWS_DEFAULT_REGION: ap-northeast-1
    steps:
      - uses: actions/checkout@v3
      - run: aws dynamodb create-table --cli-input-json file://users-table.json --endpoint-url http://localhost:8000
      - run: aws dynamodb describe-table --table-name users-table --endpoint-url http://localhost:8000
    # 実際にDynamoDB Localを設定しているところはここ
    services:
      dynamodb:
        image: amazon/dynamodb-local:latest
        ports:
          - 8000:8000
users-table.json
// サンプル用のテーブル定義
{
  "TableName": "users-table",
  "KeySchema": [
    {
      "AttributeName": "userId",
      "KeyType": "HASH"
    },
  ],
  "AttributeDefinitions": [
    {
      "AttributeName": "userId",
      "AttributeType": "S"
    }
  ],
  "ProvisionedThroughput": {
    "ReadCapacityUnits": 1,
    "WriteCapacityUnits": 1
  }
}

解説

DynamoDB Local は Docker イメージとして提供されているので、サービスコンテナとして設定できます。

https://hub.docker.com/r/amazon/dynamodb-local

サービスコンテナのドキュメントには PostgreSQL と Redis の例が載っていますが、DynamoDB も同じように使えます。

services:
  dynamodb:
    image: amazon/dynamodb-local:latest
    ports:
      - 8000:8000

これだけで GitHub Actions 上にて、http://localhost:8000 で DynamoDB にアクセスできるようになります。

実際にアクセスしてみます。

# DynamoDB Localにテーブルを作ってみる
- run: aws dynamodb create-table --cli-input-json file://users-table.json --endpoint-url http://localhost:8000

# 作ったテーブルを確認する
- run: aws dynamodb describe-table --table-name users-table --endpoint-url http://localhost:8000

テーブルを作成できました。

ports の設定

services:
  dynamodb:
    image: amazon/dynamodb-local:latest
    # ここについて
    ports:
      - 8000:8000

ちなみに、ports の設定は、job をランナーマシン上で動かしているため、必要です。

コンテナ上で動かす場合は、ports の設定が不要になります。
また、サービス名(この場合dynamodb)がホスト名になるので、endpoint-url がhttp://dynamodb:8000になります。

Discussion