Amazon RedshiftからAzure SQL DataWarehouseへデータをコピーする

[公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/data-factory/connector-amazon-redshift) はありますが、AWS側の設定なども含めて細かくやり方を残しておきます。

# 事前準備
## Azure SQL DataWarehouse準備
* 作成手順は公式ドキュメント参考
[Azure Portal で Azure SQL データ ウェアハウスを作成し、クエリを実行する
](https://docs.microsoft.com/ja-jp/azure/sql-data-warehouse/create-data-warehouse-portal)

* 今回は「東日本リージョン」に作ります
* Data Factoryから接続するため、SQL DWのファイアウォール設定はONにしておいてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b63ada9c-906c-b56b-a23e-73d2e707476c.png)

## Amazon Redshift準備
* 作成手順は公式ドキュメント参考
[Amazon Redshiftクラスターを作成する](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/event-publishing-redshift-cluster.html)

* データがなければサンプルデータをロードしておいてください
[サンプルデータをロードする](https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/cm-dev-t-load-sample-data.html)

* Query Editorを使って、対象テーブルのテーブル定義を表示します。

```
SELECT * FROM pg_table_def WHERE tablename = '[テーブル名]'
```

## Redshiftと同じ構造のテーブルをSQL DWに作る
* SSMSでSQL DWに接続して、先程確認したテーブル定義と同じ構造のテーブルを作っておきます。空のテーブルでよいです。  
[SQL Server Management Studio (SSMS) で SQL Data Warehouse に接続する](https://docs.microsoft.com/ja-jp/azure/sql-data-warehouse/sql-data-warehouse-query-ssms)

## Azure Data Factoryを準備する
* Azure Data Factoryを作成します。執筆時点ではまだ日本リージョンにはないので、今回は米国東部リージョンに作ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b490aa77-465e-e8cc-bd93-d2017cb52e58.png)

* 作ったらData Factoryポータルにいきます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/3c3855ac-3b45-0089-cc97-6654e319a997.png)

* こんな感じで表示されたらOKです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/08a71c3c-0d58-116e-27c6-4f172eda934c.png)

# Redshiftのセキュリティグループ編集
Redshiftにアクセスするので、RedshiftのセキュリティグループでAzureからの接続を許可しないといけません。
5439ポートを0.0.0.0/0、つまり全空けだと当然うまくいきますが、それだとなんかイヤなのである程度アクセス元を絞りたいと思います。

Redshiftにアクセスするのは、最初に接続してテーブル構造とかを持ってくるのが「Data Factory」、実際にデータコピーするのが「SQL DataWarehouse」になります。
Data FactoryとSQL DWの接続元IPアドレスは特定することができないので、最もアクセス元を絞れるのは、リージョンで払い出させれる可能性のあるIPアドレスレンジということになります。
Data Factoryは「米国東部リージョン」、SQL DWは「東日本リージョン」に作っているので、両方のリージョンからのアクセスを許可してあげる必要があります。

* 以下ダウンロードサイトより、米国東部リージョンと東日本リージョンのIPRangeを取得します。
[Azure Datacenter IP Ranges](https://www.microsoft.com/en-us/download/details.aspx?id=41653)

* かなりの量なので、AWS CLIでセキュリティグループの設定を追加していきます。1セキュリティグループ当たり、60ルールが上限なので、そのへんはセキュリティグループを複数作って対応していきます。

```
for ip in `cat iprange.txt`; do aws ec2 authorize-security-group-ingress --group-id [Security Group ID] --protocol tcp --port 5439 --cidr $ip; done
```

# Redshift to SQLDWデータコピー
* Data Factoryページから、[Copy Data]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/d761538b-7097-4df6-0c71-098f73825651.png)

* Task nameを入力します。実行は今回1度きりの実行にするので、[Run once now]をチェックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f72d7639-50f2-06b1-8bb8-83f26148b3d7.png)

* まずはコピー元の選択からです。[Create new connection]ボタンを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/ac03e523-5a71-dfd8-4f71-5178f7747b56.png)

* 一覧が表示されるので[Amazon Redshift]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/4225fa1b-4f38-9d35-0835-7a2eaa8cee0c.png)

* エンドポイント、データベース名、ユーザ名、パスワードなど、Redshiftの各種情報を入力していきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/4a342f53-e637-cefb-4139-80ed0f4557e8.png)

* 入力完了した時点でRedshiftに接続しにいくので、セキュリティグループの設定が間違っていたらここでエラーになります。

* 次にコピーしたい対象テーブルを選択します。全てでもよいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/222fdef1-4f95-0a01-d5d5-2592db6ce077.png)

* コピー先の選択です。[Create new connection]ボタンを選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/dfd9256d-7e56-e919-6a7f-a5d07997346e.png)

* [Azure SQL Data Warehouse]を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/2e8fb7e9-a9c3-9f5e-967d-cfc35f4a7973.png)

* 手動でエンドポイントを入力することもできますが、サブスクリプションから対象データベースを選択することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/6206df9a-0c0a-283a-7cfb-d7e607bd0089.png)

* コピー先のテーブルを選択してマッピングさせます。SQL DW側に事前にテーブルを作っておく必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/108c2a7c-e33e-25df-35f3-e5e30c1b6f58.png)

* コピーしたいカラムを選択します。デフォルトだと全てのカラムをコピーすることになるのでそのままいきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/40b07986-4a95-a7d8-68c3-0ef042ce81f6.png)

* 設定画面では、RedshiftからS3にアンロードして、BlobにコピーしてBlobからSQL DWにロードしたりできます。
    * 大量データだとそっちのほうが早いのかな。試したけど時間特に変わりませんでした。。
* とりあえず今回はS3/Blobは使わないで直接コピーしてみます。全てのチェックを外してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/fb1f17df-4d82-f3fa-678e-fb3aa9f21fbf.png)

* サマリーが出るので問題なければ実行しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/c50af2de-471f-9d4e-4f1e-6f6ea0bd835a.png)

* デプロイが走ります。[Monitor]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e7130c16-d714-9e20-7130-b37041f31f61.png)

* タスクが実行されていることが分かります。実行結果を確認してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/9453bf94-b6d2-b319-5462-e28b0d8b9481.png)

* [Details]ボタンを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/0b8b05e0-da54-9e32-c81e-24df7c55ae21.png)

* 転送時間やスループットを確認することができます。今回は、172,456レコード、11MBのデータを27秒でコピーしたことが分かります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/909b4ed8-a94b-a666-c9d0-90fbde2bb036.png)