はじめに

Looker StudioからMySQLデータベースに接続する方法は既にGoogle公式ドキュメントによって公開されている。
しかし、Looker Studio ⇔ MySQLデータベース間のネットワークについては詳細に触れておらず、暗黙的にインターネットを経由した接続方法で解説されている。
だが、データベースはプライベートサブネット(インターネットからの直接アクセスが不可のネットワーク)内に作成されることが一般的であり、この手順そのままでは接続することができない。
この記事では、Looker Studioからインターネットを経由しVPCプライベートサブネットにあるRDS MySQLデータベースへ間接的に接続する方法を紹介する。
要件は以下とする。

要件

  • DBデータのエクスポート、Looker Studioでのエクスポートデータ参照による方法は不可とする。あくまでDB接続を確立する必要があるものとする。
  • プライベートサブネットにあるプライマリあるいはライターDBインスタンスをパブリックサブネットへ移動し直接接続することは不可とする。ここでの移動とはスナップショットを作成しそれを元にDBインスタンスを再作成することを意味しているが、いずれにせよその方法は不可とする。

構成

取り得る選択肢は次の3パターン。これ以外の方法が無いという意味ではない。
パターン2はパターン3の向き先を変更する程度の差異であるため省略し、パターン1とパターン3について解説する。
architecture

前提

次の構成までは既に作成済みのものとして手順を記載する。
要点の解説に注力したいのと記事全体が冗長になることを避けるためである。
また、RDSのDBサブネットグループは最低2つのサブネットを必要とするが、表記上簡略化するため構成図ではパブリックとプライベートそれぞれ1つとしている。(実際はパブリックとプライベートそれぞれで2つのサブネットが存在する)
premise

加えて、事前にRDSインスタンス内にデータベースとテーブルを作成し、そのテーブルへ動作確認用サンプルデータをSQL INSERTによって投入済みである。

手順

パターン1:パブリックサブネットにリードレプリカを作成しそれに対し接続する

1-1. パブリックサブネットのみのDBサブネットグループを作成する

AWSマネジメントコンソール > RDS > サブネットグループ > DBサブネットグループを作成 からDBサブネットグループを作成する。
入力値となる名前と説明は任意の値をセットし、 VPCは前提で用意したVPCを選択する。
アベイラビリティゾーンはパブリックサブネットが存在する2つのものを選択し、サブネットはパブリックのものを2つ選択する。(前提でも触れているが仕様上2つ以上のサブネットを選択する必要があるため2つ作成し選択している)
step1-1

1-2. リードレプリカ用セキュリティグループを作成する(任意)

セキュリティグループについては、プライマリあるいはライターと同一のものをリードレプリカに設定しても良いが、アクセス元や用途、許可するルールも質的に異なるため、今回はリードレプリカ用途として個別にセキュリティグループを作成する。(以降は本手順を実施したものとして進める)

AWSマネジメントコンソール > EC2 > セキュリティグループ の「セキュリティグループを作成」からリードレプリカ用セキュリティグループを作成する。
入力値となるセキュリティグループ名や説明などは任意の値を入れ、VPCは前提で用意したVPCを選択する。
インバウンドルールには以下の3つを設定する。
2つ目と3つ目のIPアドレスは記事作成時点のLooker Studio IPv4アドレスである。
これは今後変わりうるため適宜Google公式ドキュメントを参照すること。
アウトバウンドルールなどその他はデフォルトのままで良い。

  • タイプ:MySQL/Aurora ソース:カスタム:RDSプライマリあるいはライターのセキュリティグループID
  • タイプ:MySQL/Aurora ソース:カスタム:142.251.74.0/23
  • タイプ:MySQL/Aurora ソース:カスタム:74.125.0.0/16

step1-2

1-3. RDSインスタンスのリードレプリカを作成する

AWSマネジメントコンソール > RDS > データベース一覧あるいは詳細画面の「アクション」から「リードレプリカの作成」を押下する。
※リードレプリカ作成は前提として自動バックアップが有効(1日以上)になっている必要がある。
 AWS公式ドキュメント参照
step1-3-1

入力値のDBインスタンス識別子は任意の値をセットする。
可用性の欄は「単一のDBインスタンス」を選択する。
接続の欄のDBサブネットグループは手順1-1で作成したものを選択し、パブリックアクセスは「パブリックアクセス可能」、既存のVPCセキュリティグループは手順1-2で作成したものを選択する。
それ以外はデフォルトで良い。(その他の変更は任意)
step1-3-2

1-4. Looker Studioからリードレプリカへ接続する

Looker Studio公式サイトの「使ってみる」などからLooker Studioのコンソールへ遷移する。
遷移先画面のサイドメニュー「作成 > データソース」を押下する。(これまでに使用したことがない場合は国の選択などが求められるがそれらは任意の値で入力し先へ進める)
step1-4-1
コネクター選択画面では「MySQL」を探し選択する。
step1-4-2

次のコネクターの設定画面で以下の通りMySQLデータベースの認証情報を入力し「認証する」を押下する。

  • ホスト名またはIP:リードレプリカのエンドポイント(*.rds.amazonaws.com)
  • ポート:空白のまま(デフォルトポートでリードレプリカを作成している場合)
  • データベース:RDSプライマリ作成時に指定したDB名(DB識別子ではない)
  • ユーザー名:RDSプライマリ作成時に指定したマスターユーザー名
  • パスワード:RDSプライマリ作成時に指定したマスターパスワード
  • SSLを有効にする:チェック
  • クライアント認証を有効にする:チェックなしのまま
  • MySQL SSL クライアント設定ファイル:次のAWS公式ドキュメントから該当リージョンのPEMファイルをダウンロードしそれを選択する。東京リージョンでRDSインスタンスを作成したのであれば「ap-northeast-1-bundle.pem」をダウンロードする。

認証に成功するとテーブルなどの選択が可能になるため、テーブルを選択するかSQLクエリを入力し「接続」ボタンを押下する。
step1-4-3

次の画面が表示されれば接続成功
step1-4-4

パターン3:1と2の合わせ技

2-1. RDSリードレプリカ用とNLB用のセキュリティグループを作成する

2-1-1. NLB用セキュリティグループ作成

AWSマネジメントコンソール > EC2 > セキュリティグループ の「セキュリティグループを作成」からNLB用セキュリティグループを作成する。
入力値となるセキュリティグループ名や説明などは任意の値を入れ、VPCは前提で用意したVPCを選択する。
インバウンドルールには以下の2つを設定する。(Looker StudioのIPv4アドレス。Google公式ドキュメント参照)
アウトバウンドルールなどその他はデフォルトのままで良い。

  • タイプ:MySQL/Aurora ソース:カスタム:142.251.74.0/23
  • タイプ:MySQL/Aurora ソース:カスタム:74.125.0.0/16

step2-1-1

2-1-2. RDSリードレプリカ用セキュリティグループ作成

AWSマネジメントコンソール > EC2 > セキュリティグループ の「セキュリティグループを作成」からリードレプリカ用セキュリティグループを作成する。
入力値となるセキュリティグループ名や説明などは任意の値を入れ、VPCは前提で用意したVPCを選択する。
インバウンドルールには以下の2つを設定する。
アウトバウンドルールなどその他はデフォルトのままで良い。

  • タイプ:MySQL/Aurora ソース:カスタム:RDSプライマリあるいはライターのセキュリティグループID
  • タイプ:MySQL/Aurora ソース:カスタム:2-1-1で作成したNLB用セキュリティグループID

step2-1-2

2-2. RDSインスタンスのリードレプリカを作成する

AWSマネジメントコンソール > RDS > データベース一覧あるいは詳細画面の「アクション」から「リードレプリカの作成」を押下する。
※パターン1で触れたように前提として自動バックアップは有効になっている必要がある。

手順「1-3」と同様に入力値のDBインスタンス識別子は任意の値をセットする。
可用性の欄は「単一のDBインスタンス」を選択する。
接続の欄のDBサブネットグループはRDSプライマリと同じものを選択し、パブリックアクセスは「パブリックアクセス不可」、既存のVPCセキュリティグループは手順「2-1-2」で作成したものを選択する。
それ以外はデフォルトで良い。(その他の変更は任意)

step2-2

2-3. ターゲットグループとNLBを作成する

2-3-1. ターゲットグループ作成

AWSマネジメントコンソール > EC2 > ターゲットグループ 一覧画面から「ターゲットグループの作成」を押下する。

ターゲットタイプの選択では「IPアドレス」を選択する。
ターゲットグループ名は任意の値を入力し、プロトコル : ポートは「TCP:3306」を入力、IP アドレスタイプは「IPv4」のままで、VPCは前提で用意したVPCを選択する。
次の「ターゲットを登録」画面では、ネットワークに同じVPCを選択し「VPC サブネットからの IPv4 アドレスを入力します。」欄には手順「2-2」で作成したリードレプリカのIPv4アドレスを入力する。
※リードレプリカのIPv4アドレスは nslookup エンドポイント(*.rds.amazonaws.com) などで確認できる。
ポートは「3306」として、「保留中として以下を含める」ボタンを押下しIPターゲットを画面下部に追加する。
「ターゲットグループを作成」ボタンを押下し作成する。

2-3-2. NLB作成

AWSマネジメントコンソール > EC2 > ロードバランサー 一覧画面から「ロードバランサーの作成」を押下する。

ロードバランサータイプは「Network Load Balancer」で「作成」ボタンを押下する。
入力値となるロードバランサー名は任意の値をセットし、スキームはデフォルトの「インターネット向け」、IP アドレスタイプもデフォルトの「IPv4」で良い。
ネットワークマッピングのVPCは前提で用意したVPCを選択し、マッピングでは選択可能な2つのAZを選択し、それぞれのサブネットはパブリックの方を選択する。
※基本的にDNSを使用するためIPv4アドレスの選択についてはデフォルトの「AWS によって割り当て済み」のままで良い。
セキュリティグループは手順「2-1-1」で作成したものを選択する。
リスナーとルーティングではプロトコル「TCP」ポート「3306」、デフォルトアクションのターゲットグループは手順「2-3-1」で作成したものを選択する。
その他はデフォルトのままで良いので再度「ロードバランサーの作成」ボタンを押下し作成する。

2-4. Looker StudioからNLBへ接続する

ステップ1と同様にLooker Studio公式サイトの「使ってみる」などからLooker Studioのコンソールへ遷移する。
手順はほとんど同じため画像は割愛する。

遷移先画面のサイドメニュー「作成 > データソース」を押下する。(これまでに使用したことがない場合は国の選択などが求められるがそれらは任意の値で入力し先へ進める)
コネクター選択画面では「MySQL」を探し選択する。

次のコネクターの設定画面で以下の通りMySQLデータベースの認証情報を入力し「認証する」を押下する。

  • ホスト名またはIP:NLBのDNS名(*.amazonaws.com)
  • ポート:空白のまま
  • データベース:RDSプライマリ作成時に指定したDB名(DB識別子ではない)
  • ユーザー名:RDSプライマリ作成時に指定したマスターユーザー名
  • パスワード:RDSプライマリ作成時に指定したマスターパスワード
  • SSLを有効にする:チェック
  • クライアント認証を有効にする:チェックなしのまま
  • MySQL SSL クライアント設定ファイル:次のAWS公式ドキュメントから該当リージョンのPEMファイルをダウンロードしそれを選択する。東京リージョンでRDSインスタンスを作成したのであれば「ap-northeast-1-bundle.pem」をダウンロードする。

認証に成功するとテーブルなどの選択が可能になるため、テーブルを選択するかSQLクエリを入力し「接続」ボタンを押下する。
手順「1-4」と同様にディメンションなどが記載された画面が表示されれば接続完了。

おわりに

この記事で解説した方法はあまり良くない解決方法という意味でHACKである。
パターン1はDBデータをインターネットに面したパブリックサブネットにデプロイするため、データに対するネットワークレイヤのセキュリティ防御層が薄くなる。
パターン3はターゲットグループのターゲット指定でリードレプリカのDNS名ではなく動的なIPv4アドレスを設定せざるを得ないため、リードレプリカの再作成などでIPアドレスの再設定が必要になる。(RDS MySQLリードレプリカは再起動の場合、IPアドレスは変更されない)
どの方法がベストであるとは断言しない。いずれの選択を取るかはセキュリティやコストなどの観点・要件から判断すること。