【AWS】EC2へのMetabaseの導入

以前、Elastic Beanstalkで構築しようとしたのですが、望んだとおりの結果が得られなかったので、自分でEC2へ導入してみようと思いました。

# EC2インスタンスの用意
今回は「t3.small」を利用することにしました。
EBSは`汎用SSD`の`10GB`にしました。
※ Metabaseはポート3000で起動するので、3000にアクセスできるようにセキュリティーグループの設定をしてください。
※ Metabaseにアクセスする為に、Public IPアドレスを付与してください。
　 インスタンス生成時の設定 or Elastic IP

# EC2へDockerをインストールする

## yumアップデート
まずは、yumをアップデートします。

```sh:yumのアップデート
sudo yum update -y
```
`complete!`が表示されれば完了です。

## Dockerインストール
Dockerをインストールします。

```sh:Dockerのインストール
sudo yum install docker -y
```

## Dockerの起動
Dockerを起動します。

```sh:Docker起動
sudo systemctl start docker
```
起動コマンドのが実行できれば、下記のコマンドで起動できているかを確認します。

```sh:起動確認コマンド
sudo systemctl status docker
```

```sh:確認コマンド実行結果
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-02-06 00:51:30 UTC; 24s ago
```
実行結果に`Active: active (running)`と表示されていれば正常に起動されています。

## Dockerの自動起動設定
再起動等を行った際に、Dockerを自動で起動するように設定します。

```sh:Docker自動起動設定
sudo systemctl enable docker
```
下記のような実行結果が表示されていれば、自動起動の設定が完了しています。

```sh:自動起動設定結果
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
```

## ユーザーをDockerグループに追加
ec2-user を docker グループに追加すると、sudo を使用せずに Docker コマンドを実行できます。

```sh:ユーザー追加
sudo usermod -a -G docker ec2-user
```
実行が完了したら、下記のコマンドでDockerコマンドが実行できるか確認してください。

```sh:確認用コマンド
docker info
```

```sh:実行が成功した場合の結果表示
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.09.9-ce
Storage Driver: overlay2
  ・
  ・
  ・
```

### 確認コマンドが失敗する場合
下記の例のように表示された場合は、実行が失敗しています。

```sh:失敗時メッセージ
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/info: dial unix /var/ru
n/docker.sock: connect: permission denied
```

この場合、Dockerを再起動する必要があります。
下記のコマンドで再起動後、再度確認してください。

```sh:Docker再起動
sudo systemctl restart docker
```

上記のコマンドでも正常に実行できない場合は、インスタンスを再起動してみてください。

## Metabaseのインストール
今回は、ローカルファイルシステムを使用して、H2埋め込みデータベースを実行し、アプリケーションのデータを保存する方法にします。
この方法だと、コンテナを削除すると、設定ファイル等がすべて消えてしまうので、本番運用をする際は、RDS等にPostgresSQL等のDBを用意して、アプリケーションデータを保存することが必要です。

```sh:Metabaseのdocker実行
docker run -d -p 3000:3000 --name metabase metabase/metabase
```

### 起動の確認

EC2のインスタンスのパブリックIPアドレスを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/2a337ca7-825f-d761-26a0-5e776a336999.png)

上記方法で確認したIPアドレスの3000番ポートにブラウザでアクセスします。
http://XX.XXX.xxx.xxx:3000

下記のような画面が表示されれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/95b04526-0a46-8c9a-9b4f-f0149d5295fc.png)

# Metabaseの初期設定
`開始しましょう`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/1e1934b5-cc66-18ab-849a-3faa543a07a3.png)

## 個人情報の入力
必要な情報を入力します。

## データを追加する
利用するデータベースの情報を追加します。

## データ使用の優先度
Metabaseへの動作レポートの送信を行うかを選択する事ができます。

# EC2再起動時の設定

## コンテナの一覧を表示する
コンテナの情報を表示し、起動するコンテナIDを確認する。

```sh:コンテナの一覧を表示
docker ps -a
```

```sh:実行結果
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
01254c6459fa        metabase/metabase   "/app/run_metabase.sh"   8 hours ago         Up 6 minutes        0.0.0.0:3000->3000/tcp   metabase
```

## コンテナの起動
下記のコマンドでコンテナを起動します。

```sh:コンテナの起動
docker start <CONTAINER ID> 
```

## コンテナの自動起動設定
起動するコンテナ名を取得します。

```sh:コンテナ名の取得
docker ps -a
```

```sh:コンテナの自動起動設定
docker update --restart=always <コンテナ名>
```
下記のコマンドで自動起動の設定を確認できます。

```sh:自動起動設定確認コマンド
docker inspect -f "{{.Name}} {{.HostConfig.RestartPolicy.Name}}" $(docker ps -aq) | grep always
```


## 自動起動の無効化
```sh:コンテナの自動起動を無効化
docker update --restart=no <コンテナ名>
```

# 実行ログの取得

コンテナIDを取得し、実行情況を表示します。

```sh:コンテナIDの検索方法
docker ps -a
```

```sh:実行状況の取得
docker logs -f -t <コンテナID>
```