Azure Data Factory にて git 連携後の publish による手動リリースの検証

## 概要

Azure Data Factory （ADF）のリリース方法が複雑であるため、よりシンプルなリリース方法として git 連携後の publish によりリリースする方法の検証結果を共有します。

次の手順によりリリースを実施する想定です。1 については初回のみの実施であり、2 についてはグローバルパラメータを変更／追加する場合にのみ実施する想定です。

1. リリース対象の ADF にて Git 連携を実施
2. factory 配下にある ADF 名の json ファイル（例：`factory/manabian-prd.json`） にてグローバルパラメータの値を設定
3. リリース対象の ADF にて publish（発行）を選択

## 想定のリリース手順

### 1. リリース対象の ADF にて Git 連携を実施

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d6b2a05d-1585-ef07-b42a-52c8ee09b519.png)

### 2. factory 配下にある ADF 名の json ファイル（例：`factory/manabian-prd.json`） にてグローバルパラメータの値を設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/51a8ecb5-7e50-3d44-2259-f63bf41efe49.png)


### 3. リリース対象の ADF にて publish（発行）を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6307ff20-58c4-983a-7bcb-f9d9e8e705a1.png)


## 開発時に実施すべき事項

### 1. リンクドサービスとデータセットをパイプラインからグローバルパラメータを設定

リンクドサービスとデータセットではグローバルパラメータを設定できないため、リンクドサービスとデータセットにてパラメータを設定して、パイプラインでグローバルパラメータに基づいてパラメータを設定する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/61e4bc1e-6818-6291-9b79-af0a21a9b16f.png)


## 検証用環境とプログラムの作成

### リソース作成と権原付与

開発環境とリリース先環境として次のリソースを作成して、Azure Data Factory のマネージド ID に対して Azure Storage の`ストレージ BLOB データ共同作成者`権限を付与する。開発環境とリリース先環境にて同じ git レポジトリーを参照させて、 git レポジトリーへのコミットは開発環境の ADF からのみ行います。

- 開発環境
    - Azure Data Factory
    - Azure Storage
- リリース先環境
    - Azure Data Factory
    - Azure Storage

### 開発環境にてグローバルパラメータの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c63c99d2-8f47-2027-f1a9-2c8aab22e4c8.png)


### 開発環境にてリンクドサービスの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9693bad0-fe82-6fd0-144a-6982d9380f27.png)

<details>
  <summary>リンクドサービスの json 定義</summary>

```json
{
    "name": "AzureBlobStorage1",
    "properties": {
        "parameters": {
            "conn_str": {
                "type": "string"
            }
        },
        "annotations": [],
        "type": "AzureBlobStorage",
        "typeProperties": {
            "serviceEndpoint": "@{linkedService().conn_str}",
            "accountKind": "StorageV2"
        }
    }
}
```
</details>

### 開発環境にてデータセットの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/083663bd-b2de-9d4b-dd16-08d4e79108ea.png)

<details>
  <summary>データセットの json 定義</summary>

```json
{
    "name": "DelimitedText1",
    "properties": {
        "linkedServiceName": {
            "referenceName": "AzureBlobStorage1",
            "type": "LinkedServiceReference",
            "parameters": {
                "conn_str": {
                    "value": "@dataset().conn_str",
                    "type": "Expression"
                }
            }
        },
        "parameters": {
            "conn_str": {
                "type": "string"
            }
        },
        "annotations": [],
        "type": "DelimitedText",
        "typeProperties": {
            "location": {
                "type": "AzureBlobStorageLocation"
            },
            "columnDelimiter": ",",
            "escapeChar": "\\",
            "firstRowAsHeader": true,
            "quoteChar": "\""
        },
        "schema": []
    }
}
```
</details>

### 開発環境にてパイプラインの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a5d8ff2a-61e1-3260-8045-89508aa7d435.png)

<details>
  <summary>パイプラインの json 定義</summary>

```json
{
    "name": "pipeline1",
    "properties": {
        "activities": [
            {
                "name": "Get Metadata1",
                "type": "GetMetadata",
                "dependsOn": [],
                "policy": {
                    "timeout": "0.12:00:00",
                    "retry": 0,
                    "retryIntervalInSeconds": 30,
                    "secureOutput": false,
                    "secureInput": false
                },
                "userProperties": [],
                "typeProperties": {
                    "dataset": {
                        "referenceName": "DelimitedText1",
                        "type": "DatasetReference",
                        "parameters": {
                            "conn_str": {
                                "value": "@pipeline().globalParameters.azure_storage_conn",
                                "type": "Expression"
                            }
                        }
                    },
                    "fieldList": [
                        "exists"
                    ],
                    "storeSettings": {
                        "type": "AzureBlobStorageReadSettings",
                        "recursive": true,
                        "enablePartitionDiscovery": false
                    },
                    "formatSettings": {
                        "type": "DelimitedTextReadSettings"
                    }
                }
            }
        ],
        "annotations": []
    }
}
```
</details>


### リリース先環境にてグローバルパラメータを設定

開発環境の ADF にてコミットした内容を git レポジトリー経由で取得して、リリース先環境の ADF にてグローバルパラメータを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1b6b5635-6dc0-b0ca-40fd-c51962d3dfc6.png)


## リリース先環境での実行確認

### `publish`の実行可否の確認

正常終了することを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e1de3d67-ee01-a336-b049-d9c2c0e95999.png)


### パイプライン実行の確認

正常終了することを確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a5c6457b-41fc-8966-dfdd-74096722dd20.png)