QuickSight と EC2(MySQL) を接続してみた
こんにちは、すながわです。
業務で QuickSight に触れる機会がありましたため、QuickSight-EC2(MySQL) 接続を記録に残します。具体的には以下のような構成を作ります。
EC2 作成
以下構成で作成しました。
- AmazonLinux 2023
- パブリック IP あり
- パブリックサブネットへ配置
パブリックサブネットへ配置した理由は、ローカルから ssh で直接ログインするためです。一方、プライベートサブネットに EC2 を配置しても今回の QuickSight からの接続は同様に行えると思いますので、任意に設定ください。
EC2 に MySQL をインストール
EC2 に MySQL をインストール、ログインする手順は以下ブログをご参照ください。
ログインできたら QuickSight から MySQL へ接続するための専用のユーザーを作成しておきます。
mysql> CREATE USER 'sample_user_for_qs' IDENTIFIED BY 'Pass!123';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'sample_user_for_qs'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql> select user, host from mysql.user;
+--------------------+-----------+
| user | host |
+--------------------+-----------+
| sample_user_for_qs | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+--------------------+-----------+
5 rows in set (0.00 sec)
ちなみに上記のユーザーは、新規作成せずに既にある root などを使っても構いません。一方で、root のデフォルトでは、mysql.user テーブルの "host" が上記のように "localhost" のみとなっており、外部からこのユーザーで接続することができない(接続しようとすると Host xxx is not allowed to connect to this MySQL server エラーとなる)ので、適宜権限を修正してください。今回はわかりやすく、上記のようにユーザーを新規作成するやり方にしました。
また、後ほど QuickSight から EC2 内の MySQL データベースへ接続するため、任意のデータベースおよびテーブルも作成しておきます。
mysql> CREATE DATABASE blog_db;
Query OK, 1 row affected (0.01 sec)
mysql> USE blog_db;
Database changed
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| blog_db |
+------------+
1 row in set (0.00 sec)
mysql> CREATE TABLE user (id int, name varchar(10));
Query OK, 0 rows affected (0.03 sec)
mysql> SHOW tables;
+-------------------+
| Tables_in_blog_db |
+-------------------+
| user |
+-------------------+
1 row in set (0.00 sec)
mysql> INSERT INTO user values (1, 'Taro');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO user values (2, 'Hanako');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO user values (3, 'Jiro');
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+------+--------+
| id | name |
+------+--------+
| 1 | Taro |
| 2 | Hanako |
| 3 | Jiro |
+------+--------+
3 rows in set (0.00 sec)
QuickSight ENI 用のセキュリティグループの作成
QuickSight 用のセキュリティグループを作成し、
以下のように EC2 のセキュリティグループからの全ての TCP を許可するインバウンドルールを設定します。
- タイプ:すべてのTCP
- プロトコル:TCP
- ポート範囲:0-65535
- ソース:EC2のセキュリティグループ
上記のようにインバウンドルールを追加する理由は、QuickSight 用の ENI にアタッチされたセキュリティグループの通信はステートフルじゃないためです。このような設定を入れないと、QuickSight から EC2 への行きの通信はできても帰りの通信で弾かれてしまうため、結果として通信がうまくいきません。
詳細は以下ブログをご参照ください。
EC2(MySQL)のセキュリティグループの設定
EC2 のセキュリティグループには以下のように QuickSight ENI にアタッチされたセキュリティグループからの通信を許可します。ssh 用のルールもありますが、これはローカルから EC2 にアクセスするためのものです。
QuickSight 実行ロールの作成
以下の設定でロールを作成します。詳細は公式ドキュメントをご参照ください。
カスタム信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "quicksight.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
許可ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:CreateNetworkInterface",
"ec2:ModifyNetworkInterfaceAttribute",
"ec2:DeleteNetworkInterface",
"ec2:DescribeSubnets",
"ec2:DescribeSecurityGroups"
],
"Resource": "*"
}
]
}
QuickSight アカウント設定メニューからVPC接続定義を作成
QuickSight ホーム画面 → 右上プロフィールアイコン → QuickSight を管理 → VPC 接続の管理 → VPC接続の追加 の順に選択します。その後以下のように設定し、画像下側の "追加" ボタンを選択。
- VPC接続名:<任意の名前>
- VPC ID:EC2 が所属する VPC
- 実行ロール:前述の実行ロールを指定
- サブネット:1a と 1c のプライベートサブネットを指定
- セキュリティグループID:前述で作成済みの QuickSight アクセス用のセキュリティグループ ID
VPC 接続が作成されます。以下のようにステータスが AVAILABLE になればOKです。
データセットの作成
右上の "新しいデータセット" を選択します。
データセットの中から「MySQL」を選択します。
データソースの設定は以下のようにします。ポイントはデータベースサーバーとして EC2 のプライベート IP を指定する部分です。
- データソース名:<任意の名前>
- 接続タイプ:先ほど作成した VPC 接続を選択
- データベースサーバー:<EC2 のプライベート IP>
- ポート:3306
- データベース名:前述の項で作成したデータベース名
- ユーザー名:前述した QuickSight 接続用に作成したユーザー名
- パスワード:MySQL ログイン時のパスワード
- SSL の有効化:チェックを外す
完成形が以下画像です。画像左下のボタンは "接続を検証" するボタンなので、ボタンを押下して以下画像のように "検証済み" と表示されることを確認してください。確認できたら、右下の "データソースを作成" を選択します。
以下の画面になるので、事前作成しておいた MySQL のテーブル user を選択し、右下の「選択」を実行します。
SPICEへインポートを選択し、"Visualize" を選択します。
以下画面となるので、「インタラクティブシート」を選択した状態で「作成」をクリックします。
あとは、ダッシュボードができるので、適当なビジュアルで mysql のデータを可視化しましょう。これで MySQL on EC2 を QuickSight に繋げることができました。
終わりに
今回は QuickSight と EC2(MySQL) を繋げる部分を実施してみました。
やってみると QuickSight 用のセキュリティグループの設定や ENI を 2つ以上設定する必要があることなど、普段知らないことが知れたのでとても有意義でした。また、MySQL のユーザーの "localhost" の部分は原因がわからず苦労しました。
本記事がどなたかのお役に立てば幸いです。
参考文献