Minioとamazon/dynamodb-localでlocal-stackをつかわない様に環境を作成する

##### 概要

Lambdaを利用する時に、S3とdynamo-dbの利用環境は多く、開発でlocal実装をする。

##### 経緯

上記の環境を作成するために、Local-Stackを利用することを考えたがやれることが多く、他の人の学習コストが積む気配があったので、minio(S3の代用)、Dynamodb、Dynamodb-adminを利用してLocalの環境を作成することにした。LambdaまでDockerniseしようとしたが、sam-cliが便利でぬけなかったのと、sam-cliが内部でDockerniseしているためとりあえずあきらめたwwww

## TL;DR

すべてdocker-composeに記載してネットワークのHOSTだけ気をつければ普通に動く。
Environmentにまとめておくと楽なので、.envをdocker環境だけ利用する

[レポ](https://github.com/Ntakuya/sam-multiple-form-data-sample/tree/feature/dockernise-s3-dynamo)

## 利用するDockerImage

| name | url | desc |
| :-- |:--|:--|
| minio | https://hub.docker.com/r/minio/minio | S3の代用手段 |
| dynamodb-local | https://hub.docker.com/r/amazon/dynamodb-local | AWSが提供してくれてるdynamo-dbのLocal環境 |
| dynamodb-admin | https://hub.docker.com/r/aaronshaf/dynamodb-admin | dynamo-dbのGUIツール地味にあると嬉しいphpのadmin的なあれ |

### outline

1. minioの設定を追加
2. dynamodb-localの設定を追加
3. dynamodb-adminの設定を追加

## 1. minioの設定を追加

S３の代用となるminioを追加。立ち上がったらGUIで確認できます。

```docker-compose.yml
version: "3.8"
services:
  s3-local-on-minio:
    image: minio/minio
    container_name: s3-local
    ports:
      - "9001:9000"
    command: ["--compat", "server", "/data"]
    restart: always
    env_file:
      - .env
    environment:
      MINIO_ACCESS_KEY: "${AWS_ACCESS_KEY_ID}"
      MINIO_SECRET_KEY: "${AWS_SECRET_ACCESS_KEY}"
      AWS_ACCESS_KEY: "${AWS_ACCESS_KEY_ID}"
      AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}"
      AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}"
      AWS_DEFAULT_REGION: "${AWS_DEFAULT_REGION}"
      AWS_S3_ENDPOINT_URL: "${AWS_S3_ENDPOINT_URL}"
      AWS_S3_BUCKET_NAME: "${AWS_S3_BUCKET_NAME}"
```

environmentで利用した情報を作成します。
Keyとかシークレットがかぶっているのは、面倒だったためてを抜きました。(ちゃんと設定してあげてください)

```.env
AWS_ACCESS_KEY_ID=dummy_s3_access_key
AWS_SECRET_ACCESS_KEY=dummy_s3_secret_key
AWS_DEFAULT_REGION=us-east-1

AWS_S3_ENDPOINT_URL=http://host.docker.internal:9001/
AWS_S3_BUCKET_NAME=sample
```

正常に起動できると下記の様なものが見れます。
(localhost:9001)[http://localhost:9001/minio/login]


![MinIO-Browser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144543/e3988822-c54e-2a02-43dc-4075ec761749.png)

## 2. dynamodb-localの設定を追加

Amazonが提供してくれている dynamodb-localを入れていきます。

```docker-compose.yml
version: "3.8"
services:
  ## ここから追記
  dynamodb-local:
    image: amazon/dynamodb-local
    container_name: dynamodb-local
    ports:
      - "8000:8000"
  ## ここまで追記
  s3-local-on-minio:
    image: minio/minio
    container_name: s3-local
    ports:
      - "9001:9000"
    command: ["--compat", "server", "/data"]
    restart: always
    env_file:
      - .env
    environment:
      MINIO_ACCESS_KEY: "${AWS_ACCESS_KEY_ID}"
      MINIO_SECRET_KEY: "${AWS_SECRET_ACCESS_KEY}"
      AWS_ACCESS_KEY: "${AWS_ACCESS_KEY_ID}"
      AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}"
      AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}"
      AWS_DEFAULT_REGION: "${AWS_DEFAULT_REGION}"
      AWS_S3_ENDPOINT_URL: "${AWS_S3_ENDPOINT_URL}"
      AWS_S3_BUCKET_NAME: "${AWS_S3_BUCKET_NAME}"
```

dynamodb-adminをかいてから起動した方が個人的に楽なので、そのままadminを記載していきます。

## 3. dynamodb-adminの設定を追加

```docker-compose.yml
version: "3.8"
services:
  dynamodb-local:
    image: amazon/dynamodb-local
    container_name: dynamodb-local
    ports:
      - "8000:8000"
  s3-local-on-minio:
    image: minio/minio
    container_name: s3-local
    ports:
      - "9001:9000"
    command: ["--compat", "server", "/data"]
    restart: always
    env_file:
      - .env
    environment:
      MINIO_ACCESS_KEY: "${AWS_ACCESS_KEY_ID}"
      MINIO_SECRET_KEY: "${AWS_SECRET_ACCESS_KEY}"
      AWS_ACCESS_KEY: "${AWS_ACCESS_KEY_ID}"
      AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}"
      AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}"
      AWS_DEFAULT_REGION: "${AWS_DEFAULT_REGION}"
      AWS_S3_ENDPOINT_URL: "${AWS_S3_ENDPOINT_URL}"
      AWS_S3_BUCKET_NAME: "${AWS_S3_BUCKET_NAME}"
  ## ここから追記
  dynamodb-admin:
    container_name: dynamodb-admin
    image: aaronshaf/dynamodb-admin:latest
    env_file:
      - .env
    environment:
      DYNAMO_ENDPOINT: "${AWS_DYNAMO_DB_URL}"
    ports:
      - 8001:8001
    depends_on:
      - dynamodb-local
  ## ここまで追記

```

追加で記載したenvの情報も追記

```.env
AWS_ACCESS_KEY_ID=dummy_s3_access_key
AWS_SECRET_ACCESS_KEY=dummy_s3_secret_key
AWS_DEFAULT_REGION=us-east-1

AWS_S3_ENDPOINT_URL=http://host.docker.internal:9001/
AWS_S3_BUCKET_NAME=sample

## ここから追記
AWS_DYNAMO_DB_URL=http://host.docker.internal:8000/
AWS_DYNAMO_DB_TABLE=Sample
```

通信については、host.docker.internalを利用してdockerのcontainer間通信をしてもらいます。(localhostだと動かなかった)

以上を書き終えてdockerを起動します。


```terminal
$ docker-compose up
```

成功すると。
[localhost:9001](http://localhost:9001/minio/login)にminioと、
[localhost:8001](http://localhost:8001/)にdynamodb-adminが表示されます。


minio
![MinIO-Browser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144543/e3988822-c54e-2a02-43dc-4075ec761749.png)

dyanmodb-admin
![DynamoDB-Admin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144543/5df3b63c-cc8e-65c7-74ff-01d52c02add1.png)