AWS EC2 AMIを利用して構築したRedash9.0(beta)でCloudWatch Logs Insightsのデータを取得する

# What's this?
Redash9.0(beta)でデータソースとしてCloudWatch Logs Insightsが新規追加されたので、Redash9.0の構築からデータ取得までの手順をまとめた記事です。

# Redashとは
Redashは、(主に)SQLの分析結果をわかりやすく可視化し共有するオープンソースBIツールです。
「RDS」「Redshift」「BigQuery」「Google Spreadsheet」など50種類以上の様々なデータソースと連携が可能で、複数のデータソースのデータを結合させることも可能です。

# Redash9.0で追加されたデータソース
- [redash/CHANGELOG.md](https://github.com/getredash/redash/blob/master/CHANGELOG.md)

> New Data Sources: Amazon Cloudwatch, Amazon CloudWatch Logs Insights, Azure Kusto, Exasol.

Redash公式のchange logを見るとまだbeta版ですが、9.0から下記データソースが新規で追加されています。

- Amazon Cloudwatch
- Amazon CloudWatch Logs Insights
- Azure Kusto
- Exasol

# 構築手順
## 前提
- ローカル環境はmacOS + iTerm2
- AWSアカウントは既に作成済
- CloudWatch Logsにデータが存在している

## 【手順1】Redash8.0セットアップ

### EC2インスタンス作成
Docker on EC2のAMIがRedashの公式から提供されているので、こちらを利用します。

- [Setting up a Redash Instance](https://redash.io/help/open-source/setup)

今回は東京リージョンでのインスタンス作成をしたいので、「ap-northeast-1」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/9cb80488-308c-eb4c-6dc1-b8e2276cc34b.png)

次にインスタンスタイプを選択します。

>Launch the instance with the pre-baked AMI we create (for small deployments t2.small should be enough):

Redash公式ページでは小規模の開発環境であれば`t2.small`で十分とありましたが、9.0については、`t2.small`ではメモリが不十分で上手く動作しなかったため、`t2.medium`を選択しました。
どちらのインスタンスタイプも無料枠ではないので注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/d201959c-b594-6bb5-d5fc-46a3cbf7a28b.png)

インスタンスタイプを選択したら、「確認と作成」ボタンを押します。

インスタンス起動前に下記画面が表示されるので、キーペアを作成していない場合は、
任意のキーペア名をつけてキーペアの作成をします。
このとき発行されるキーペアはインスタンスにSSH接続する際に必要になるため安全な場所に保存しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/024f0f67-4691-1abc-3c13-96da2885603b.png)


これでインスタンスの作成は完了です。
今回利用したAMIにインストールされているRedashのバージョンは8.0になるので、後ほど9.0へのバージョンアップを行います。

### セキュリティグループの作成

次にセキュリティグループの作成をします。
下記ポートをインバウンドルールに追加します。

- SSH接続のための22番ポート
- HTTP接続のための80ポート
- HTTPS接続のための443ポート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/c3864148-a4a9-8245-1682-fa142e4d8d73.png)

この際、検証用に利用する方は自宅や職場など特定のIPアドレスのみを許可する設定にしておいた方が安全です。

セキュリティグループの作成が完了したら、先ほど作成したEC2インスタンスとの関連付けを行います。

インスタンス一覧画面に戻り、セキュリティグループを変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/3595a2ed-26c4-33a8-cf2c-a573421e56b5.png)

作成したセキュリティグループを選択し保存します。
もし余分なセキュリティグループがインスタンスに関連付けされている場合は削除します。
これでセキュリティグループの関連付けは完了です。

### Elastic IPの作成
今回検証用に有料のインスタンスタイプを利用しているため、利用しない時はインスタンスを停止し費用を抑えたいです。
EC2にデフォルトで付与されるパブリックIPアドレスは停止、再起動の度に変わってしまうため固定IPアドレスを設定します。

Elastic IPの新規作成をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/d9d98d2e-7f35-01ba-28ea-ea5941beca79.png)


作成したElastic IPをEC2インスタンスに関連付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/1244a578-582f-5672-2837-a37b75f91be7.png)

これで固定IPの作成とインスタンスへの関連付けの完了です。

この時点でブラウザに発行されたElasticIPアドレスでアクセスするとRedashの管理画面が表示されるはずです。

### EC2インスタンスへSSH接続確認 

作成したインスタンスにSSH接続できるか確認します。
ここからはローカル環境での作業となります。

`<Home Directory>/.ssh/config`に下記を追記します。
`<ホスト名>`,`<Elastic IP>`,`<キーペアファイルのパス>`は適宜各自の環境に置き換えてください。

```
Host <ホスト名>
 HostName <Elastic IP>
 User ubuntu
 Port 22
 UserKnownHostsFile /dev/null
 StrictHostKeyChecking no
 PasswordAuthentication no
 IdentityFile <キーペアファイルのパス>
 IdentitiesOnly yes
```

コマンドラインツールから`ssh <ホスト名>`でサーバ接続できればOKです。


## 【手順2】Redash9.0へのバージョンアップ

Redash8.0→9.0へのバージョンアップを行います。

`ssh <ホスト名>`でRedashサーバに接続

- コンテナの起動確認

```
# redashディレクトリに移動
cd /opt/redash/
# コンテナの起動確認
sudo docker-compose ps

          Name                         Command               State              Ports
------------------------------------------------------------------------------------------------
redash_adhoc_worker_1       /app/bin/docker-entrypoint ...   Up      5000/tcp
redash_nginx_1              nginx -g daemon off;             Up      443/tcp, 0.0.0.0:80->80/tcp
redash_postgres_1           docker-entrypoint.sh postgres    Up      5432/tcp
redash_redis_1              docker-entrypoint.sh redis ...   Up      6379/tcp
redash_scheduled_worker_1   /app/bin/docker-entrypoint ...   Up      5000/tcp
redash_scheduler_1          /app/bin/docker-entrypoint ...   Up      5000/tcp
redash_server_1             /app/bin/docker-entrypoint ...   Up      0.0.0.0:5000->5000/tcp
redash_worker_1             /app/bin/docker-entrypoint ...   Up      5000/tcp
```

- コンテナの停止

```
sudo docker-compose down
```

- docker-compose.ymlの変更

[redash/CHANGELOG.md](https://github.com/getredash/redash/blob/master/CHANGELOG.md)のUpgradingを参考に下記を変更します。

- imageをredash/redash:8.0.0.b32245→redash/redash:previewに変更
- services/schedulerのenvironmentを削除
- services 配下にworkerを追加

```
sudo vi docker-compose.yml
```

修正後のdocker-compose.yml

```
version: "2"
x-redash-service: &redash-service
  #最新のimageに変更
  image: redash/redash:preview
  depends_on:
    - postgres
    - redis
  env_file: /opt/redash/env
  restart: always
services:
  #workerを追加
  worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "periodic emails default"
      WORKERS_COUNT: 1
  server:
    <<: *redash-service
    command: server
    ports:
      - "5000:5000"
    environment:
      REDASH_WEB_WORKERS: 4
  scheduler:
    <<: *redash-service
    command: scheduler
    #schedulerのenvironment を削除
  scheduled_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "scheduled_queries,schemas"
      WORKERS_COUNT: 1
  adhoc_worker:
    <<: *redash-service
    command: worker
    environment:
      QUEUES: "queries"
      WORKERS_COUNT: 2
  redis:
    image: redis:5.0-alpine
    restart: always
  postgres:
    image: postgres:9.6-alpine
    env_file: /opt/redash/env
    volumes:
      - /opt/redash/postgres-data:/var/lib/postgresql/data
    restart: always
  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    links:
      - server:redash
    restart: always
```


- コンテナのビルド

```
docker-compose up --force-recreate --build
```


-  Redashにログインしversion9.0になっていることを確認

画面左下のユーザー名をクリックするとRedashの現在のバージョンが表示されます。
9.0.0-betaになっていればバージョンアップ完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/74d0766b-81c3-8099-a411-5a68363f644e.png)


## 【手順3】CloudWatch Logs Insightsデータの取得

最後に作成したRedashでCloudWatch Logs Insightsのデータ取得を行います。

### IAMでRedashユーザーの作成

RedashからAWSリソースにアクセスするためにIAMにRedashユーザーを作成します。

AWS IAMから ユーザー > [ユーザーを追加]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/71e0e589-37de-8793-6583-4cf5f06b5032.png)

プログラムによるアクセスにチェックを付けます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/67dcac0a-2650-5c87-d48e-c259b31256ae.png)

アクセス権限から既存のポリシーをアタッチを選択します。
今回はLambdaのCloudWatch Logs Insightsデータを取得したいため`AWSLambdaFullAccess`にチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/18abb9a4-2584-6570-0ff5-724a00372ddd.png)

ユーザーの作成が完了すると、アクセスキーが発行されるためダウンロードし安全な場所に保管します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/710521ed-9822-32f2-0db3-67252fae690b.png)



### データソースの追加

Setting > Data Sources > [New Data Data Source] からAmazon CloudWatch Logs Insightsを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/acc83baa-9038-19c9-1ac8-b4df9c2f21db.png)

データソース追加に必要な情報を設定します。

- Name:任意
- AWS Region:東京リージョンなら「ap-northeast-1」
- AWS Access Key:IAMで発行したもの
- AWS Secret Key:IAMで発行したもの

Create後、[Test Connection]が成功すればデータソースの追加完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/d9ad34e2-9ef3-bc57-8c88-9449bc81ff4c.png)


### 指定のロググループのデータを取得

最後です。
Queriesからデータ取得のクエリを作成します。
左上のプルダウンから先ほど追加したデータソースを選択

記法についてはCloud Watch Logs Insightsの記法と変わりません。
今回はTwitter APIのログデータを取得しました。

無事取得できました。

```
{
    logGroupName: '/aws/lambda/rep_Tweet',
    startTime: 1590926139,
    queryString: '
        fields @timestamp,@message |
        filter @message like /event/ |
        sort @timestamp desc |
        display @timestamp,follow_events.0.target.name,follow_events.0.type,follow_events.0.target.screen_name,follow_events.0.target.description |
        limit 1
    '
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566229/ccbc6d6c-59cc-37cf-6846-45c5905afb8d.png)