Cloud Data Fusion を触ってみた①環境準備編

# Cloud Data Fusion を触ってみた①環境準備編

## はじめに
Google Cloud にはいくつかの ETL サービスが提供されています。

https://cloud.google.com/learn/what-is-etl?hl=ja

ETL サービスの中でも、Cloud Data Fusion はパイプラインを GUI で作成することができます。

https://cloud.google.com/data-fusion/docs?hl=ja

今回は Cloud Data Fusion で Amazon RDS のデータを BigQuery に格納するパイプラインを作成します。
この記事は環境準備編です。

## Cloud Data Fusion について
前述したとおり、Cloud Data Fusion は GUI でパイプラインを作成できる ETL サービスです。
パイプラインはバッチ・リアルタイム（おそらくストリームと同義）両方作成できます。
プラグインというパイプライン内のモジュールがあり、豊富な接続先・操作が用意されています。また独自プラグインを作成することもできるとのことです。

https://cloud.google.com/data-fusion/docs/concepts/overview?hl=ja

https://cloud.google.com/data-fusion/plugins?hl=ja


## 検証
### ネットワーク周りの準備
#### 事前調査
Data Fusion にはパブリックインスタンスとプライベートインスタンスがあります。

https://cloud.google.com/data-fusion/docs/how-to/create-instance?hl=ja

https://cloud.google.com/data-fusion/docs/how-to/create-private-ip?hl=ja

Data Fusion はパイプラインを設計する環境（Data Fusion インスタンス）と実行する環境（Dataproc）が分離しているのですが、
パブリックインスタンスは実行環境がデフォルト VPC ネットワークで生成され、事前準備なく使えるがセキュリティの懸念がある、
プライベートインスタンスは実行環境がユーザーが設定した VPC ネットワークで生成されるので、ファイアウォールのカスタマイズが可能な環境でパイプラインを動かすことができる、
という違いがあります。

https://cloud.google.com/data-fusion/docs/concepts/networking?hl=ja

わたしがはまった落とし穴が、<b>接続先へ登録する IP アドレスを確認できない</b>、という点です。
Amazon RDS に接続するには接続元のIPを AWS 側のインバウンドグループに登録する必要があります。
ですが、パブリックインスタンスだとパイプライン実行前に IP アドレスを確認できず、また毎回同じアドレスであることが保証されていません。
実際にパブリックインスタンスでパイプラインを実行すると、Dataproc のマスターとワーカーのインスタンスがエフェメラルの外部 IP を持っていることを確認できました。
![public_gce一覧.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/f2181a0a-6ba8-a6d5-eb3f-7069b7ecf81e.png)


プライベートインスタンスだと Dataproc クラスタに外部 IP が割り振られません。
Data Fusion のバージョン 6.4 以降だとプライベートインスタンスからインターネットサービスへ接続は可能とドキュメントに書いてありますが、そのときに使用する IP アドレスの詳細は見つけられませんでした。

なのでこの検証では実行環境で Amazon RDS と接続することを目指し、プライベートインスタンスを作成し、Cloud NAT を使ってインターネットサービスとやり取りするように環境を設定しました。

#### Cloud NAT の作成
公式ドキュメントの Cloud NAT 作成方法をもとに、Data Fusion 実行環境を動かしたい任意の VPC ネットワークに Cloud NAT と Cloud Router を作成しました。

https://cloud.google.com/nat/docs/gce-example?hl=ja#create-nat

#### IP アドレスの確認
Cloud NAT を使ってインターネットに出るときの IP アドレスを確認します。
Cloud NAT の IP アドレス割り当てを自動にしていると、Cloud NAT が必要な状態になっていないと IP アドレスが確認できません。
なので、 Compute Engine で外部 IP アドレスなしのインスタンスを作成し、「VPC ネットワーク」→「IP アドレス」から、Cloud NAT の IP アドレスを表示しました。（画像下から2番目）
![CloudNAT_ip.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/4ed55b71-4506-1b0a-16af-bd0177de9fd5.png)


#### Amazon RDS セキュリティグループの設定
一つ上で確認した IP アドレスを、Amazon RDS のセキュリティグループのインバウンドを追加します。
![amazonrdsセキュリティグループ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/700adcbb-cc9d-6d81-4507-e2f12f3a4ffc.png)


#### ファイアウォールの設定
Data Fusion のパイプライン実行環境は Dataproc なので、Dtataproc の各インスタンスが相互通信できるように以下の条件で上りのファイアウォールを設定する必要があります。

> TCP（全ポートの 0～65535）、UDP（全ポートの 0～65535）、および ICMP 

https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/network?hl=ja



### インスタンス作成
パイプラインを作成・実行するインスタンスを作成します。

作成ページの「詳細オプション」の「プライベート IP を有効化」を有効化すると、環境を作成する VPC ネットワークを指定できます。
![詳細オプション.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/fc71ecb5-dd1b-85a2-974d-70f5baec4b7f.png)



### パイプライン作成
インスタンスが作成されたら、「インスタンスを開く」リンクから Cloud Data Fusion UI を開きます。

今回は Data Fusion 実行環境と Amazon RDS の疎通確認をしたいので、PostgreSQL から Cloud Storage に書き出すだけのパイプラインを作成します。

前述の通り、Data Fusion の設定環境と実行環境は異なります。
なのでこの手順で進めると設定環境のパイプライン作成時は Amazon RDS に接続できない、という課題があり、ここはまだ解決できていません。
プラグインの各プロパティを入力していきますが、設定環境では接続テストはせず進めていきます。

パイプラインをデプロイ・実行し、Amazon RDS からデータを取得できた（接続できたこと）を確認できました。
![deployあと.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/c652ef4b-0c6d-0dda-f168-1b6cf7e96b0e.png)


ちなみにパイプライン実行中に Dataproc, Compute Engine, IPアドレス一覧を見ると、実行環境の様子が確認できます。

Dataproc クラスタ詳細
詳細上部にクラスタに関する警告が表示されます。警告内容によってはプロビジョニング中状態から終わらないので、パイプラインの進行が進まない場合はここをチェックして原因を確認できます。
![private_dataproc.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/26fc3928-a994-ff4c-0673-31801652fae3.png)

Compute Engine VM インスタンス一覧
![private_gce一覧.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/9d245244-a686-3f47-0405-2c74b9a465b1.png)

IP アドレス一覧（下3列）
![private_ip.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/b5576079-e745-67c2-b418-81f8d2b7c0cd.png)



## 参考

https://zenn.dev/hssh2_bin/articles/fa50217736a50dfe287a


以上です。だれかの参考になれば幸いです。