AWS Graviton+Ubuntuでredash構築

:::note warn
この記事は、[Supershipグループ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/supership)の24日目の記事になります。
:::

こんにちは、Supership株式会社の[shosho44](https://qiita.com/shosho44)です。

## はじめに
BIツールであるRedashをAWS Graviton + EC2を使用して構築する手順と具体的なコードを紹介します。
基本的に公式が紹介している[Ubuntuでの構築方法](https://github.com/getredash/redash/wiki/Local-development-setup)に沿って構築しており、詰まったポイントの対処法も記載しています。

## 構築手順
大まかに以下の流れで構築を行います。
1. EC2インスタンスのコスト把握
2. EC2インスタンスを立てる
    - VPC作成、subnet作成、EC2インスタンス作成、インターネットゲートウェイアタッチなど(他の記事に詳しいのでこの記事では手順について記載していません)
3. EC2インスタンスでRedashの環境構築を行う

### EC2インスタンスのコスト把握

EC2インスタンスのコストの確認は[aws pricing calculator](https://calculator.aws/#/createCalculator/ec2-enhancement)で行いました。
AWS gravitonとの比較対象としてt2系を選択しましたが、参考にされる場合は求められる非機能要件に沿ってインスタンスファミリーを適宜変更してください。
|インスタンス名 |オンデマンドの時間単価 |vCPU |メモリ |ストレージ |ネットワークパフォーマンス |
|---|---|---|---|---|---|
|t2.medium |USD 0.0608|	2| 4GiB| EBS のみ| 低～中|
|t4g.medium |USD 0.0432| 2|	4GiB| EBS のみ| 最大5Gビット|

比較した結果、パフォーマンスが変わらなさそうなこと、AWS Gravitonの方がコスト安なことからAWS Graviton t4g.mediumで構築することにしました。

### EC2インスタンスでRedashの環境構築を行う
調べた限りではAMIを使用してAWS Graviton上にredash version10を立てることができなさそうでした。(2024/12時点)
そのため、前述した公式から紹介されている[Ubuntuでの構築方法](https://github.com/getredash/redash/wiki/Local-development-setup)に沿って構築していきます。
以下のコマンドはすべてEC2にsshして実行します。

#### aptのアップデート
```
$ sudo apt update
```

#### パッケージのインストール
```
$ sudo apt -y install docker.io docker-buildx docker-compose-v2
$ sudo apt -y install build-essential curl docker-compose pwgen python3-venv xvfb
```

#### ユーザをdockerグループに入れる
```
$ sudo usermod -aG docker $USER
$ newgrp docker
$ sudo systemctl restart docker
$ sudo chmod 666 /var/run/docker.sock
```

#### Node Version Managerのインストール
```
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
```
実行終了時、.bashrcに設定を書き込むためのコードがおそらく出てくるのでcli上で実行します。

#### NodeJS version 18インストール
```
$ nvm install --lts 18
$ nvm alias default 18
$ nvm use 18

$ nvm list
-> v18.20.5
```

#### yarnのインストール
```
$ npm install -g yarn@1.22.22
```

#### redashをgithubからclone
```
$ git clone https://github.com/getredash/redash
$ cd redash
```

#### NodeJS dependenciesインストール
```
$ yarn
...省略...
error /home/ubuntu/redash/node_modules/puppeteer: Command failed.
Exit code: 1
Command: node install.js
Arguments: 
Directory: /home/ubuntu/redash/node_modules/puppeteer
Output:
The chromium binary is not available for arm64: 
If you are on Ubuntu, you can install with: 

 apt-get install chromium-browser

/home/ubuntu/redash/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserFetcher.js:112
            throw new Error();
            ^

Error
    at /home/ubuntu/redash/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserFetcher.js:112:19
```
エラーが出るので出力通り以下のコマンドを実行します。
```
$ apt-get install chromium-browser
```

再度yarnを行います。
```
$ yarn
...省略...
no space left on device
```
容量が足りないというメッセージが出力されました。
こちらの問題はyarnを行う際ではなく次以降の手順で発生する可能性があるため、次の節で対処法を記載します。

#### コンパイルと実行
```
$ make build
$ make compose_build
$ docker image list
redash-scheduler ...省略...
...省略...
```

#### dockerを立ち上げる
```
$ make create_database
$ make up
$ docker compose ps
...省略...
redash_email_1       bin/maildev  
...省略...
```

### 構築時に起こったno space left on deviceの対処法
結論、EC2起動時にEC2にアタッチされたEBSの容量が足りなかったため拡張して対処しました。
この記事を参考にredashの構築をされている方とエラー原因が違う可能性があるため、エラーが起こった際の調査と具体的な対処法について記載します。

- 使用容量の確認
```
$ df
Filesystem ...省略... Use% Mounted on
/dev/root  ...省略... 100% /
```

- マウントポイントを確認
```
$ lsblk
NAME         ...省略... TYPE MOUNTPOINTS
...省略...
nvme0n1      ...省略... disk 
├─nvme0n1p2  ...省略... part /
...省略...
```
nvme0n1p2がルートディレクトリにマウントされていること、ルートディレクトリの使用率が100%なことを確認しました。
また、AWSのコンソールでnvme0n1がEBSのサイズと同じことを確認しました。
以上からEBSのサイズを上げてnvme0n1p2のサイズを上げたらエラー対処をできるのではとあたりをつけました。

具体的な対処法について記載していきます。
#### EBSのサイズを上げる
8GB→16GBに変更しました。

#### EBSのサイズ変更をパーティションに反映
- filesystemを確認
```
$ df -T
Filesystem      Type ...省略... Mounted on
/dev/root       ext4 ...省略... /
```

- 反映
```
$ sudo growpart /dev/nvme0n1 2
$ sudo resize2fs /dev/nvme0n1p2
```
ファイルシステムがext4のため、サイズ変更の反映にresize2fsを使用しました。

- 反映されているか確認
```
$ lsblk
NAME         SIZE
...省略...
nvme0n1      16G
├─nvme0n1p2  7G
...省略...
```
```
$ df
Filesystem ...省略... Use% Mounted on
/dev/root  ...省略... 47%  /
```
反映されていることを確認できました。
この状態で失敗したコマンドを再度実行すると成功しました。

### アクセス確認
この記事記載の方法で構築したredashは5001番ポートでlistenしているので、5001番を指定してアクセスします。

![スクリーンショット 2024-12-23 16.52.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457786/f5218b37-8c20-3210-fd52-ad50d36f2ad8.png)

画面を確認できました。

## 参考資料
https://github.com/getredash/redash/wiki/Local-development-setup
https://qiita.com/hatorijobs/items/c503840c13672e12d188
https://blog.maromaro.co.jp/archives/13848

:::note
**最後に宣伝です。**

Supershipではプロダクト開発やサービス開発に関わる人を絶賛募集しております。
ご興味がある方は以下リンクよりご確認ください。
[Supership 採用サイト](https://supership.jp/recruit/)
是非ともよろしくお願いします。
:::