QuickSightでVPC内のAuroraに接続する環境をCDKで構築する手順

関連する投稿を行いました。

https://qiita.com/moritalous/items/98d63c4da1f95f994e33

---

QuickSightでRDSやRedshiftなどのVPC内のリソースに接続するには、ネットワーク疎通のための設定が必要です。[参考ドキュメント](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/working-with-aws-vpc.html)

ネットワーク設定をCDKを使ってやってみました。

## 手順

### 1. VPCを作成

まずはVPCを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/becc39e6-c85b-5689-4b9e-c72929446077.png)

```typescript:cdk
const vpc = new ec2.Vpc(this, 'vpc')
```

### 2. Auroraを作成

次にAuroraを作成します。
クエリエディタを使用したかったので、Aurora Serverless V1を選択しています。
認証情報はSecrets Managerに保存されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/946ca4da-5884-bad2-ce38-f13e2926972a.png)

```typescript:cdk
const aurora = new rds.ServerlessCluster(this, 'aurora', {
  engine: rds.DatabaseClusterEngine.auroraPostgres({
    version: rds.AuroraPostgresEngineVersion.VER_11_18,
  }),
  defaultDatabaseName: defaultDatabaseName,
  vpc: vpc,
  enableDataApi: true
})
```

### 3. セキュリティグループの設定

Aurora用のセキュリティグループにルールを追加し、QuickSightが作成するENI用のセキュリティグループを新規作成します。

* Auroraのセキュリティグループ

    * インバウンドルール
    
    | タイプ | プロトコル | ポート範囲 | ソース | 
    | --- | --- | --- | --- |
    | PostgreSQL | TCP | 5432 | QuickSight ENI用のセキュリティグループ |
    
    * アウトバウンドルール
    
    | タイプ | プロトコル | ポート範囲 | ソース | 
    | --- | --- | --- | --- |
    | すべてのトラフィック | すべて | すべて | 0.0.0.0/0 |

* QuickSight ENI用のセキュリティグループ

    * インバウンドルール
    
    | タイプ | プロトコル | ポート範囲 | ソース | 
    | --- | --- | --- | --- |
    | すべての TCP | TCP | 0 - 65535 | Auroraのセキュリティグループ |
    
    * アウトバウンドルール
    
    | タイプ | プロトコル | ポート範囲 | ソース | 
    | --- | --- | --- | --- |
    | すべてのトラフィック | すべて | すべて | 0.0.0.0/0 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/4b25e624-f104-9f46-56c8-bf0fbdd559be.png)

```typescript:cdk
const auroraSgs = aurora.connections.securityGroups

const quichsightSg = new ec2.SecurityGroup(this, 'quicksight-sg', {
  vpc: vpc,
})

auroraSgs.forEach((auroraSg) => {
  quichsightSg.addIngressRule(auroraSg, ec2.Port.allTcp())
  quichsightSg.addEgressRule(auroraSg, aurora.connections.defaultPort!)
  
  auroraSg.addIngressRule(quichsightSg, aurora.connections.defaultPort!)
})
```

以上で、ネットワーク設定は完了です。

## データの登録

QuickSightで可視化するためのデータを、Auroraに登録します。Aurora Serverless V1の場合は、マネジメントコンソールのクエリエディタから登録できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/c439d6d5-02d3-0792-ee79-96d3a429c931.png)

### 1. テーブル作成

```sql
CREATE TABLE quicksight_table (
    group_name VARCHAR,
    recorded_at TIMESTAMP,
    sensor_name VARCHAR,
    sensor_value DOUBLE PRECISION
)
```

### 2. データ登録

```sql
INSERT INTO quicksight_table (group_name, recorded_at, sensor_name, sensor_value)
VALUES
    ('group1', '2023-03-25 10:00:00', 'sensor1', 10.5),
    ('group1', '2023-03-25 10:01:00', 'sensor2', 10.7),
    ('group2', '2023-03-25 10:00:00', 'sensor1', 8.5),
    ('group2', '2023-03-25 10:01:00', 'sensor3', 8.7),
    ('group3', '2023-03-25 10:00:00', 'sensor1', 15.3),
    ('group1', '2023-03-25 10:02:00', 'sensor1', 11.2),
    ('group1', '2023-03-25 10:03:00', 'sensor4', 10.9),
    ('group2', '2023-03-25 10:02:00', 'sensor1', 9.1),
    ('group2', '2023-03-25 10:03:00', 'sensor1', 8.9),
    ('group3', '2023-03-25 10:01:00', 'sensor5', 14.9),
    ('group1', '2023-03-25 10:04:00', 'sensor1', 10.3),
    ('group1', '2023-03-25 10:05:00', 'sensor1', 11.1),
    ('group2', '2023-03-25 10:04:00', 'sensor3', 9.3),
    ('group2', '2023-03-25 10:05:00', 'sensor1', 8.6),
    ('group3', '2023-03-25 10:02:00', 'sensor1', 15.6),
    ('group1', '2023-03-25 10:06:00', 'sensor2', 10.8),
    ('group1', '2023-03-25 10:07:00', 'sensor1', 11.2),
    ('group2', '2023-03-25 10:06:00', 'sensor2', 9.4),
    ('group2', '2023-03-25 10:07:00', 'sensor1', 8.8),
    ('group3', '2023-03-25 10:03:00', 'sensor1', 15.1)
```

上位5件だけ表示

| group_name |       recorded_at       | sensor_name | sensor_value |
|------------|-------------------------|-------------|--------------|
|    group1    | 2023-03-25 10:00:00 |   sensor1    |     10.5       |
|    group1    | 2023-03-25 10:01:00 |   sensor1    |     10.7       |
|    group2    | 2023-03-25 10:00:00 |   sensor1    |     8.5         |
|    group2    | 2023-03-25 10:01:00 |   sensor1    |     8.7         |
|    group3    | 2023-03-25 10:00:00 |   sensor1    |     15.3       |


## QuickSightの作成と設定

### 1. QuickSightを作成
    
QuickSightはCDKでは作成できないのでマネジメントコンソールで作成します。

### 2. QuickSightのVPC接続設定

先程作成したVPCの情報を入力します。ENIが作成されます。

* 管理画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/832ccda5-5efc-0e53-8315-88e569954c0b.png)

* VPC接続を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/5b29a688-c9a8-1589-53b4-9071b63b8953.png)

### 3. QuickSightのデータセットを追加

* 新しいデータセットを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/1885865c-aff3-fd6b-61a9-4b99a2ab594e.png)

* Auroraを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/530758db-5ab9-200e-375d-019f0d0de573.png)

* 接続情報を入力します。接続情報はSecrets Managerで確認します。入力後、左下のボタンをクリックすると、接続可能かどうかの検証を実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/1df971f4-354e-86a3-79f7-4414bd1bcd3a.png)

* テーブルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/753131e9-2e8f-bfe9-9566-2558b8d84669.png)

* データセットの作成が完了します。モーダルのVisualiseボタンをクリックし、可視化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/0a527208-930f-3150-0a89-0ae6176af821.png)

* 表形式で表示するとこんな感じです。正しくデータを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/92c37ed8-5f9d-64e1-2e3c-5a485ef8d4a0.png)

## 最終構成図

最終的にはこのような構成となります。QuickSightはCDKやCloudFormationで作成できないので手動での作成です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/27300714-a05f-702a-dfb5-d74bfec70f98.png)