Azure Data Factory で従来型 ETLソリューション (Informatica, CData 等) 使わずシステム連携ができた話

#オンプレのSQLとAzure SQL、オンプレのSQLとSalesforceと連携とか・・・どうしよう？

コロナ真っ只中の2020年4月から現職に就任してから Azure IaaS, PaaS や Salesforce といったSaaSの導入が始まった。それまでは良くも悪くもレガシーなシステム、システム開発体制だったのを過去の経験（特にフランス系企業の日本のITヘッドをしていたときの経験が大きい）もあり提案して変え始めた。良くも悪くも言い出しっぺの私に必要となる開発、運用のボールも来たのだが、そんな中で構築をし始めたAzure Virtual Machines, Azure SQL Database (月額500円程度の最低価格で本番動かしています。安い。)やSalesforceとマスタやトランザクションデータの連携を考え始めなくてはいけなくなってきた。世の中移り変わりが激しいもので5年前には思いもしなかった　Azure Data Factory というクラウドETLツールがあるのを発見。日本語も英語もまだまだ始まったばかりで情報が乏しい気がするが、意外に使えたので記録しておこうと思う。

#Azure Data Factoryとは https://azure.microsoft.com/ja-jp/services/data-factory/
一言で言うとクラウドETLツール。コネクターが非常に多く（発展途上なのか正確な一覧が見つからない）オーソドックスなSQLのODBC接続からテキストファイル、Excel、BlobストレージやNo SQLデータベース、Salesforceなどなどとにかくコネクターが多い。ニッチなコネクターも追加料金なしで標準料金で使えるので（少なくとも現在は）うれしい。オンプレミスのSQLサーバー等に対してはオンプレサーバー上にAzure Integration Runtime インストーラーでインストールを行いAzureのData Factoryと接続する必要がある。Azure の Data Factories でSelf-Hostedオンプレ用インテグレーションランタイムを作成すると2つのキーの発行がされるのでそのうちの1つをオンプレのサーバーのインストール後に表示されるキー入力画面で入力することでつながる。
![Azure Data Factory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/6e7e30e3-bbbb-b494-20f4-767fa6aaff67.png)
サブスクリプション、リソースグループなどを指定しリージョン、名前を決める。Versionは新しいV2で問題ないはず。なお、Git ConfigurationとなりGithubやAzure DevOpsと連携ができるようだが、使用しないチェックマークがあるのでそれを
選べばGitのような開発環境なしで入れ物が作成でき続行ができる。
 ![Azure Data Factory Integration Runtime2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/eb6c5bbb-3e94-9ffb-338b-dcfe06a99c35.png)

![Azure Data Factory Integration Runtime1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/0c905953-399c-dab9-7b1f-531eee31aa08.png)![Azure Data Factory Integration Runtime1-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/d3905b44-188e-4050-1601-cb9dd661d472.png)

入れ物を作ったあとはパイプラインを作成、データフローを作成、データコピーをするなどいろいろ表示されるがまず最初にやらなければならないのはLink Serviceの作成。ここで接続したいオンプレ、クラウドサーバーとの接続情報を登録する。
![Azure Data Factory4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/ced82aee-3889-7146-d76e-208d8c4f86ed.png)
Azure IRと呼ばれるインテグレーションランタイムも作成しておかなければならない。デフォルトで作成されているものはSalesforceとの接続が仕様で使えないことが判明した（デフォルトで作成されているIRは実行環境のリージョンが自動判定になっているがSalesforceとの連携ではAzure実行環境をどこにするのか指定が必要、Salesforceのサーバーに近い場所が短時間で終わることになり無難なようなのであえて作成を促している様子）。
リンクサーバーとインテグレーションランタイムができればようやくETL編集といった感じだ。
![IntegrationRuntime.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/61f6c96d-b285-9fb4-dc01-189eb77f4672.png)
ETL編集画面でテーブルを選択しInsert、Upsertなどの選択をしていくことになる。
![Azure Data Factory3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/81edbda6-44b9-523d-f9b7-65bba0c94102.png)

Debugボタンで都度実行、Triggerでスケジュール設定ができる。
一つのパイプラインと呼ばれる実行単位に複数のETL（アクティビティと呼ばれている）を入れ込むことができる。
上記画像は3つのアクティビティを実行を処理させる場合の例。

一つ一つのアクティビティにIN、Outを設定していく。
![Query.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/6cbb2e36-d18e-ca91-2258-d227b75a2226.png)
![Sink.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/bb2a5c93-d374-2214-ca5e-f815ce47c18b.png)
![mapping.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/e3819c84-11f1-e845-041e-f835e2136139.png)

あとはDebugで問題なければスケジュールして終わりだった。
![Debug実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/14f766bd-a26e-51c8-5eb1-bf702b6211c2.png)

#備考
一応、設定内容はJSON形式で作成、保存されるようだがGUIで完結することが多いので非常に便利。AzureはAWSよりUIにかなり力を入れている気がした。下図の設定はオンプレSQLからSalesforceに連携する際に使ったUpsertの設定画面の例。
![AzureUIイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/280d105a-90d5-e01c-eecf-e56a777d6f1d.png)

1時間で3種類ほどETLが組めた。従来はInformaticaやCDataといったETLソリューションを活用していたし思い浮かべることが多かったが、Azure Data Factoryのようなソリューションが登場し知れば知るほどこのあたりのツールのプレーヤーが変わっていくと感じた。