おひとり

できる限りひとりで楽しむための情報やプログラミング情報など。

【サーバーレスバッチ処理ハンズオン】2章 DynamoDB LocalとMinioでローカルにインフラを再現

※この記事は「AWSでサーバーレスなバッチ処理を作るハンズオン」の2章です。こちらの記事からスタートできます。

f:id:hitoridehitode:20211127193658p:plain
DymamoDB LocalとS3互換のMinioをDockerを使って起動

ここでは、Dockerを使って、ローカルPC内にDynamoDB(Local)とS3互換のMinioを立ち上げます。
可能ならば開発中もAWSのリソースに接続したいところですが、

  • プログラムのミスにより高額な請求の発生
  • 試行錯誤による長時間利用

は避けたいところですよね。
そこで、今回はローカルでの開発中はローカルにあるサービスにアクセスするようにします。

リポジトリ

この章における変更箇所は以下のコミットで確認できます。

https://github.com/SRsawaguchi/simple-serverless-batch/commit/57b870c159257cbba067842e7ad6c659c7e5dc03

また、このハンズオン全体のリポジトリはこちらです。

github.com

DynamoDB Localの起動

最初にDynamoDB Localを立ち上げます。
docker-compose.yamlを作成しましょう。

touch docker-compose.yaml

docker-compose.yamlに以下のコードを書き込みます。

version: '3.8'

services:
  dynamodb-local:
    image: "amazon/dynamodb-local:latest"
    container_name: dynamodb-local
    hostname: dynamodb
    ports:
      - "8000:8000"
    volumes:
      - "./docker/dynamodb:/home/dynamodblocal/data"
    working_dir: /home/dynamodblocal
    command: "-jar DynamoDBLocal.jar -sharedDb -dbPath ./data"

起動します。

docker compose up

ではDynamoDBテーブルを作成しましょう。日付をPartition Keyにしただけのシンプルなテーブルです。

※AWS CLIがインストールされていない場合、公式ガイドを参考にインストールをしてください。

aws dynamodb create-table \
    --endpoint-url http://localhost:8000 \
    --table-name Messages \
    --attribute-definitions \
        AttributeName=Date,AttributeType=S \
    --key-schema \
        AttributeName=Date,KeyType=HASH \
    --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 

ローカルのDynamDBに対してリクエストを送るので、--endpoint-url http://localhost:8000というオプションがついていることを確認してください。

作成されたことを確認しましょう。

aws dynamodb describe-table \
    --endpoint-url http://localhost:8000 \
    --table-name Messages

何かしら情報が表示されたことを確認しましょう。

では、データを投入しておきます。

aws dynamodb put-item \
    --endpoint-url http://localhost:8000 \
    --table-name Messages \
    --item '{ 
        "Date": {"S": "2021/11/28"}, 
        "Message": {"S": "Hello, World"}
      }'

追加してデータを確認するには以下のコマンドを実行します。

aws dynamodb get-item \
    --endpoint-url http://localhost:8000 \
    --table-name  Messages \
    --key '{"Date":{"S":"2021/11/28"}}'

補足)
開発中はDynamoDBテーブルのデータをGUIで見ると早いです。
必要に応じてdynamodb-adminをインストールしてみてください。

f:id:hitoridehitode:20211128110758p:plain
dynamodb-adminでテーブルの内容をGUIで確認できる。

Minio(S3互換)の起動

続いてS3互換のMinioを立ち上げます。
DynamoDBを立ち上げたときのdocker composeを終了させていない場合は、Ctrl + cで終了させときます。

docker-compose.yamlservices配下に以下の記述を追加します。

  minio:
    image: quay.io/minio/minio:RELEASE.2021-10-10T16-53-30Z
    hostname: minio
    volumes:
      - ./docker/minio/data:/data
      - ./docker/minio/export:/export
      - ./docker/minio/policies:/policies
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: root
      MINIO_ROOT_PASSWORD: himitsu123
    command: server --console-address ":9001" /data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

追記したらもう一度起動しましょう。

docker compose up

問題なく起動したらMinioのコンソールにアクセスしてみます。

http://127.0.0.1:9001/login

ログイン情報は以下です。

Username Password
root himitsu123

続いてbucketを作成します。
Minioのコンソールから作成してもOK。AWS CLIで作る場合は以下のコマンドを実行します。

AWS_ACCESS_KEY_ID=root \
AWS_SECRET_ACCESS_KEY=himitsu123 \
aws s3api create-bucket \
    --endpoint-url http://127.0.0.1:9000 \
    --bucket handson-bucket

※MinioにAWS CLIにアクセスする際には、Minio起動時に設定したルートユーザの情報を使います。

変数名
AWS_ACCESS_KEY_ID root
AWS_SECRET_ACCESS_KEY himitsu123

handson-bucketというbucketができました。

以下のコマンド、もしくはMinioコンソールから確認してみます。

AWS_ACCESS_KEY_ID=root \
AWS_SECRET_ACCESS_KEY=himitsu123 \
aws s3 ls \
    --endpoint-url http://127.0.0.1:9000

これで準備は完了です!

次のステップ

いよいよ、Lambda関数を作成していきます。

www.ohitori.fun