Azure Data Factoryの環境反映パターン【手動、大規模対応】

## はじめに

Data Factoryの開発環境から本番環境への反映方法についてまとめます。

今回は大規模なDataFactory向けのパターンである、**手動**、**大規模向け**となります。

注意事項：
- Synapse では利用できません。SynapseはARM上に成果物を保持していないため
- トリガーの移行では一時的なトリガーの停止が必要です。
- 反映は増分であるため、削除の反映は手動で消すかスクリプトの利用が必要です。
- ファイアウォールを設定しないARMテンプレート用のストレージが必要です。


2022/03時点の情報です。

## 他パターン

[Azure Data Factoryの環境反映パターン【手動、小規模】](https://qiita.com/ryoma-nagata/items/5fa5ef1d7f5f8029cfa4)
[Azure Data Factoryの環境反映パターン【自動（承認付き）、小規模】](https://qiita.com/ryoma-nagata/items/3d98bb444cecbbb23a3e)

## ARMテンプレートの制限とData Factoryの対応

ひとつのARMテンプレートファイルにはリソースの最大数の制約があり、きわめて多くのリソース（パイプライン、データセット、リンクサービスなど）が存在する大規模なData Factory リソースでは、この制約で反映が難しいケースが存在します。

Data Factoryでは、ARMテンプレートファイルを分割し、リンクテンプレートという機構をもちいることでこの制限をパスします。



## 参考記事

[https://qiita.com/ryoma-nagata/items/5fa5ef1d7f5f8029cfa4](https://qiita.com/ryoma-nagata/items/5fa5ef1d7f5f8029cfa4)

[https://docs.microsoft.com/ja-jp/azure/data-factory/continuous-integration-delivery-linked-templates](https://docs.microsoft.com/ja-jp/azure/data-factory/continuous-integration-delivery-linked-templates)


## 手順

### 準備

以下のような状態だとします。
#### 開発環境

リンクサービス：
![2022-03-06-11-40-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/37f0d5e2-461a-9ec8-5b8e-03691a0fadeb.png)


データセット：
![2022-03-06-11-41-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/eeb474c3-b17b-264a-e559-c989a569a197.png)


#### 本番環境

作成した時点のデフォルト状態です。

リンクサービス：
![2022-03-06-11-44-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3129e80d-c952-1e8f-7f22-66b59f558e67.png)


データセット：
![2022-03-06-11-44-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/da012846-0d65-e801-8f08-20c0fc6a7b1a.png)


### 1. ARMテンプレート用のストレージの準備

このように**artifact**というコンテナをもつストレージを用意しました。（コンテナ名はなんでもいいです）

![2022-03-06-12-14-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8c6ced19-004b-d45a-16dd-3dbfbac25bd6.png)


このストレージに対してARMがアクセスするためにファイアウォールを設定しないようにしておきます。

![2022-03-06-12-16-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/6b9f1c3a-a5d6-d8f4-0101-9cd63419800a.png)



### 2. ARMテンプレートのエクスポート

開発環境のADF上の管理ハブから**ARMテンプレート**→**ARMテンプレートのエクスポート**を実行します。

![2022-03-06-11-47-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a95c44cd-611b-db77-8919-aae9dc81725a.png)


ダウンロードできたファイルを確認します。

![2022-03-06-11-48-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/94d49e48-73ca-6398-db3c-f6714f2d181d.png)

今回の手順では、**linkedTemplates** 内のファイルを利用します。

### 3. linked templateのアップロード

linked templateは、以下のように、masterと連番付きのARMテンプレートファイルが存在します。（＋パラメータファイル）

![2022-03-06-12-18-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8acabd48-8ed4-e87b-f8f4-043638e7bbdb.png)

大規模な構成では、この連番付きのファイルが増えていき、リソースのデプロイ数を調整します。

連番ファイル内でDefaultValueにストレージなどの情報がふくまれるので、ストレージ上にこのような情報を残しておきたくない場合には空の値にしておきましょう。※のちの手順内でパラメータにて指定されます

![2022-03-06-12-41-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/865f83f3-0540-1b27-1be3-227862e832b8.png)




この連番ファイルをすべて上述のARMテンプレート用のストレージにアップします。

![2022-03-06-12-19-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0cb9f07e-8696-4b4e-1f4b-8d6bba376668.png)




このファイルにアクセスするために、共有アクセストークンを作成します。

アクセス許可はリスト、読み取り

![2022-03-06-12-20-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c0a0a4cd-3ab2-3085-1798-a6aed53d060d.png)


必要に応じて、期限などを設定して、**SASトークンおよびURL**を生成をクリックします。

![2022-03-06-12-20-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f7405570-1af4-f0a8-7f30-a67c953cd388.png)



生成されたURLから、
?以前の文字列

![2022-03-06-12-22-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5c8e23e4-699a-373f-5ec5-f330eacd6112.png)



?を含む以降の文字列をメモします。

![2022-03-06-12-24-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b3cb9a6b-407e-9a2c-4b14-9b029e728cd1.png)


### 4. ARMテンプレートのインポート

ADFに戻り、開発環境のADF上の管理ハブから**ARMテンプレート**→**ARMテンプレートのインポート**を実行すると、カスタムデプロイ用画面に遷移します。

![2022-03-06-11-49-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2a94e5bd-89cd-0f35-77d3-193c2758d757.png)



**エディターで独自のテンプレートを作成する** を選択します。

![2022-03-06-11-49-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a15c7100-15f2-3912-7ec7-9d5a5090cd6d.png)


先ほどダウンロードしたうちの、**ArmTemplate_master.json** を読み込みます。

![2022-03-06-11-50-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/22ec6091-1f8e-4ad1-6939-6a5b788d68d0.png)


結果が表示されるので、**保存**をクリック

![2022-03-06-12-27-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b6695154-2082-4427-4085-1b5461aeb5e6.png)


**プロジェクトの詳細**では、対象の本番環境ADFが存在するリソースグループを選択します。※注意して作業しましょう

インスタンスの詳細では、本番環境用のパラメータおよびLinkedTemplate用の値を設定します。
今回は以下

 - 対象の本番環境ADFのリソース名
 - 本番環境ADF用のデータレイクストレージurl
 - 手順2でメモした**?以前の文字列** をContainer URIとして
 - 手順2でメモした**?を含む以降の文字列** をContainer SAS Tokenとして

![2022-03-06-12-28-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9420af8d-2248-89f6-6657-cae13f630af8.png)



パラメータファイルはダウンロードしておくと次回以降は読み込むだけで利用可能です。

![2022-03-06-11-57-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/11cea92f-1f8e-15f0-5128-cdda3a8d4972.png)



**確認と作成** → **作成** からデプロイします。
もし失敗する場合、ARMテンプレート用のストレージの設定ができていない場合があります。（ファイアウォール、SASTokenに?の付与をしていない）

![2022-03-06-11-57-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/70554276-d65b-8432-8e82-2a370032c2e2.png)


本番環境にデプロイされました。

![2022-03-06-11-59-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7d367f2d-6737-a85c-73fd-6d64eaa7bb8d.png)


なお、リンクサービス名は環境に関する文字列はいれないことを推奨します。（各環境間で同じ名前を使いたい）