RedashをAWS（EC2＋RDS）で試してみた

こんにちは、@0yanです。
最近、課内で「戦略人事の実現のため、カオナビから別サービスに切り替えよう」という話が出始め、
- [タレントパレット](https://www.pa-consul.co.jp/TalentPalette/)
- [HRMOS CORE](https://hrmos.co/core/)
- [ヒトマワリ](https://www.hitomawari.jp/)
などを比較検討しています。

そんな折、OSSのBIツール「[Redash](https://redash.io/)」の存在を知ったので試してみました。


# 前提条件
- Windows 10 homeを使用
- AWSアカウント登録済み
- TeraTermインストール済み


# 手順
1. EC2インスタンスを作成（Redash AMIを使用）
2. RDSにMySQLデータベースを作成
3. TeraTermでEC2に接続し、CSVを転送
4. EC2にMySQLクライアントをインストールし、RDSのMySQLデータベースに接続
5. データベースとテーブルを作成し、CSVを取り込み
6. Redashにデータベースを接続
7. Redashにクエリを作成し、ダッシュボードで表示


###1. EC2インスタンスを作成（Redash AMIを使用）
①AWSマネジメントコンソールからEC2を検索、EC2ダッシュボードのサイドバーから**インスタンス**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/fa5ac88b-9e40-8816-1e66-5b1ecb3e5478.png)

②「インスタンスの作成」をクリックし、ステップ1: Amazon マシンイメージ(AMI)で**コミュニティAMI**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/5697e7aa-f863-4a11-56f1-a0b9feeb0fc6.png)

③[Setting up a Redash Instance](https://redash.io/help/open-source/setup#aws)で、Redashが作成したAWS用RedashインスタンスのAMIを調べます（今回は東京リージョンを選択しました）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/88dd360c-8530-b5e8-c76b-9ade79895469.png)

④②の検索ボックスに③で調べたAMIを入れて検索し、**選択**ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/9f607773-cf82-5d30-fd9e-11b71896162a.png)

⑤ステップ2: インスタンスタイプの選択で**t2.small**を選択し、**確認と作成**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/7c1940d8-bdb6-3696-9057-f4a498b1a036.png)

なお、下記のとおり、t2.microでは動きません（最低でも**t2.small**を選択する必要があります）のでご注意ください。

>Launch the instance with the pre-baked AMI we create (for small deployments t2.small should be enough):
>
>事前に作成したAMIを作成してインスタンスを起動します（小規模な展開の場合はt2.smallで十分です）。
>
>引用： [Setting up a Redash Instance](https://redash.io/help/open-source/setup#aws)

⑥ステップ7: インスタンス作成の確認で**セキュリティグループの編集**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/82761c8c-26ac-eb4a-a9bb-91e5ee89367d.png)

⑦下記のとおり、SSHに加えてHTTPとHTTPSを許可する必要があるため、ステップ6: セキュリティグループの設定で追加し、**確認と作成**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/3e5e56a7-7bd5-72d3-2168-117e048e65a5.png)

>When launching the instance make sure to use a Security Group, that only allows incoming traffic on ports: 22 (SSH), 80 (HTTP) and 443 (HTTPS). These AMIs are based on Ubuntu so you will need to use the user ubuntu when connecting to the instance via SSH.
>
>インスタンスを起動するときは、ポート（22（SSH）、80（HTTP）、および443（HTTPS））でのみ着信トラフィックを許可するセキュリティグループを使用してください。これらのAMIはUbuntuに基づいているため、SSHを介してインスタンスに接続する場合は、ユーザーubuntuを使用する必要があります。
>
>引用：[Setting up a Redash Instance](https://redash.io/help/open-source/setup#aws)

なお、IP制御をする必要がある場合はソースのCIDRを適時変更してください。

⑧ステップ7: インスタンス作成の確認の最下部にある**起動**をクリックし、ポップアップで「既存のキーペアの選択」または「新しいキーペアの作成」のどちらかを選択した後、**インスタンスの作成**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/4c46a700-94f2-8c93-7eaa-90652c3427e1.png)

以上でEC2インスタンスの作成は終了です。


###2. RDSにMySQLデータベースを作成
①EC2ダッシュボードのサイドバーから**セキュリティグループ**を選択、作成したEC2のセキュリティグループのグループID（sg-から始まるID）をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/2bdced41-c768-2fab-0e83-1d53387ac8d2.png)

②同ページ内の**セキュリティグループの作成**をクリックし、下図のとおりに設定後、*作成*をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/04376007-0f12-97d0-2865-93e787517a4b.png)

ポイントは**ソースに①でコピーしたグループIDを入れること**です（このセキュリティグループは、EC2インスタンスがRDSに作成するMySQLデータベースにアクセスできるようにするために作成しております）。

③RDSのページに遷移し、下部にある**データベースの作成**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/6b3c6a79-66b8-e708-36a9-d85b1b8926e7.png)

④データベースの作成ページで、下表のとおりに設定をします（記載のないものはデフォルト設定です）。

|項目|内容|
|:--|:--|
|データベース作成方法を選択|簡単作成|
|エンジンのタイプ|MySQL|
|DBインスタンスサイズ|無料利用枠|
|マスターパスワード|任意のパスワード|

⑤データベース作成完了後、RDS>データベース>④で作成したデータベース名を選択し、**変更**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/a7a94abe-5c1d-1c39-3674-c0d3c16068ce.png)

⑥セキュリティグループを②で作成したものに変更し、**次へ**をクリックした後、**DBインスタンスの変更**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/51dda7d7-17ee-ece0-55bf-55bd93c18043.png)

以上でRDSでのMySQLデータベースの作成は終了です。


###3. TeraTermでEC2に接続し、CSVを転送
①EC2インスタンスのIPv4パブリックIPをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/93ad7635-47ca-f0f3-163a-0f39c39ac89b.png)

②TeraTermを起動し、ホストに①でコピーしたIPv4パブリックIPをペーストして**OK**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/e61d3323-f905-4935-e6a1-ec5f36d637ef.png)

③ユーザー名に「ubuntu」、パスワードは空白のまま、秘密鍵にEC2インスタンスの鍵ペア生成時にダウンロードしたpemファイルを選択して**OK**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/198051a3-6c11-96d0-4ef8-f847fd022152.png)

【補足】
TeraTermでログインする際のユーザー名はOSによって異なります。

|OS|ユーザー名|
|:--|:--|
|Amazon Linux|ec2-user|
|Ubuntu|ubuntu|
|CentOS|centos|

Redash AMIはUbuntuベースのため、ユーザー名が「Ubuntu」となっております。ご注意ください。

④CSVを格納するフォルダを作成します。

```
$ pwd
/home/ubuntu
$ mkdir csv
$ cd csv
~/csv$ pwd
/home/ubuntu/csv
```

⑤以下の記事に従い、データベースに取り込みたいCSVファイルをEC2インスタンスのCSVフォルダに転送します。
>[TeraTermで効率良くファイル転送](https://qiita.com/go-to/items/409e32116213bdf4b1ce)

⑥CSVフォルダに転送できたか確認します。

```
~/csv$ pwd
/home/ubuntu/csv
~/csv$ ls
student.csv
```

以上でEC2インスタンスへのCSVファイルの転送は終了です。


###4. EC2にMySQLクライアントをインストールし、RDSのMySQLデータベースに接続
①`sudo apt install mysql-client-core-5.7`コマンドでMySQLクライアントをEC2インスタンスにインストールします。

②RDSに作成したMySQLデータベースのエンドポイントをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/ca610b5a-8a59-1c1e-2c22-7b1c76b72707.png)

③以下のコマンドでMySQLデータベースに接続します。

```
$ mysql -h RDSエンドポイント -P 3306 -u admin -p
Enter password: マスターパスワード
```

以上でMySQLデータベースへの接続ができました。


###5. データベースとテーブルを作成し、CSVを取り込み
①以下のコマンドでデータベース及びテーブルを作成します。なお、今回、データベース名はexample_db、テーブル名はstudentとしました。

```
mysql> create database example_db;
mysql> show databases;
mysql> use example_db;
mysql> create table student (
  列名 データ型,
  ･･･
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

なお、列名に丸かっこなどの記号が入っている際、MySQLではバッククォート「`」で囲みます。

>[SQL文のテーブルもしくは列名に［］をつけるのはどういう意味か](https://teratail.com/questions/68572)

②以下のコマンドでCSVフォルダに転送したCSVファイルをMySQLデータベースに取り込みます。

```
mysql> load data local infile "/home/ubuntu/csv/student.csv" into table student fields terminated by ',';
```

なお、CSV取り込みについては以下の記事を参考にさせて頂きました。

>[【MySQL】CSVファイルをデータベースにインポートする](http://blog.chatlune.jp/2018/03/01/mysql-import-csv/)

以上でRedashを使う準備がすべて終了しました。


###6. Redashにデータベースを接続
①EC2インスタンスのIPv4パブリックIPをブラウザに入力し、Redashを起動します。

②起動すると、下図のとおり、Adminユーザー登録画面になるので登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/5ff9a3ff-5f05-10bc-73a5-e17d86868f2a.png)

③ログインすると下図のような画面になるので**Connect a Data Source**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/41831a2e-a711-a69f-f691-a343d292b818.png)

④データソースの中から**MySQL(RDS)**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/5e49975c-a0a9-3cd0-961d-9b681a863b15.png)

⑤下図のとおり、入力を求められますので、下表に従い入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/88902de2-702c-6228-ac94-1bde339dac19.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/94e3d5ce-f4b1-e5d7-052b-e43bb71d9aca.png)

|項目|入力内容|
|:--|:--|
|Name|データソース名（任意）|
|Host|RDSのエンドポイント|
|User|admin|
|Password|RDSで設定したマスターパスワード|
|Database name|example_db|

⑥**Create**をクリック後、**Test Connection**をクリックします。「Success」と表示されればRedashとデータベースの接続成功です。


###7. Redashにクエリを作成し、ダッシュボードで表示
力尽きました･･･（苦笑）
以下の記事が詳しいのでご覧くださいませ。

>[re:dash でグラフを作成してみる](https://hawksnowlog.blogspot.com/2016/12/creat-graph-on-redash.html)


#さいごに
実は今までHeroku＋PostgreSQLばかり触っていたので、AWSとMySQL自体、触るのが初めてでした。
なので備忘録も兼ねてAWSとMySQLの操作についても細かく記載しました。
「この記事長いな」と思われた方、すみませんでしたm(_ _)m

今回、Redashを試してみて「こんなに便利なもんがOSSで良いのか!」と感動しました。
非エンジニアの人事課メンバーにはRedashでもハードルは高い（SQLにすら抵抗がある）ので、タレントパレット・HRMOS CORE・ヒトマワリのどれかを入れることになるんだろうな～と思いますが、経営企画の方が安価なBIツールを探していたので、これを紹介したら喜びそうだなと感じました（ので教えようと思います）。

本記事をご覧くださった方、長文にも関わらずご覧頂きありがとうございました。