Azure Data Factory のメタデータ駆動のコピータスクにてデプロイメント環境に応じて接続情報を切り替える方法

## 概要

Azure Data Factory のメタデータ駆動のコピータスクにてデプロイメント環境（開発や本番などの環境）に応じて接続情報を切り替える方法を共有します。メタデータ駆動のコピータスクのデフォルトで作成される接続制御テーブル（`ConnectionControlTable`）に、デプロイメント環境（`DeployEnv`）列を追加する手順を紹介します。

メタデータ駆動を作成する際にリンクサービスに対してパラメータを追加すること、接続制御テーブルの DDL と INSERT 文が生成されます。

>  パラメーター化されリンクされたサービスを使用した場合、接続制御テーブルはデータ ストアの接続値を格納します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/cb9f7223-4aab-2be3-574f-ea5de035ae08.png)

引用元：[データのコピー ツールでメタデータ駆動型の方法を使用して大規模なデータ コピー パイプラインを作成する - Azure Data Factory | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/data-factory/copy-data-tool-metadata-driven#connection-control-table)

接続制御テーブルには下記の２つのカラムと連番が付与された Id 列で構成されており、メタデータ駆動のコピータスクのパイプラインにおける`GetSourceConnectionValues`アクティビティにて`Name`列によりレコードを取得しす。接続制御テーブルにデプロイメント環境（`DeployEnv`）列を追加、および、`GetSourceConnectionValues`アクティビティにおける WHERE 句への条件追加を実施することにより、デプロイメント環境に応じて接続情報を切り替える方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/30d798e8-c813-0ed1-d2b9-4f753a5f8362.png)

引用元：[Build large-scale data copy pipelines with metadata-driven approach in copy data tool - Azure Data Factory | Microsoft Learn](https://learn.microsoft.com/en-us/azure/data-factory/copy-data-tool-metadata-driven#connection-control-table)

## 手順

### 1. 2 つのAzure SQL Database にてテーブル作成と初期データを登録

１つ目の Azure SQL Dataabse （`dev`環境相当）にて下記の SQL を実行します。

```sql[
IF  OBJECT_ID(N'dbo.adf_metadata_01', N'U') IS NOT NULL
    DROP TABLE dbo.adf_metadata_01
CREATE TABLE dbo.adf_metadata_01
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
	NAME varchar(10),
    update_timestamp DATETIME
);

INSERT INTO dbo.adf_metadata_01
(
	NAME,
	update_timestamp
)
SELECT 'A' AS NAME,CAST('2024-06-01' AS datetime2) AS update_timestamp
;

SELECT
	*
	FROM
		dbo.adf_metadata_01
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1839dd8e-0285-6919-16c5-1558c625650e.png)


２つ目の Azure SQL Dataabse （`prd`環境相当）に下記の SQL を実行します。

```sql[
IF  OBJECT_ID(N'dbo.adf_metadata_01', N'U') IS NOT NULL
    DROP TABLE dbo.adf_metadata_01
CREATE TABLE dbo.adf_metadata_01
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
	NAME varchar(10),
    update_timestamp DATETIME
);

INSERT INTO dbo.adf_metadata_01
(
	NAME,
	update_timestamp
)
SELECT 'A' AS NAME,CAST('2024-06-01' AS datetime2) AS update_timestamp
UNION ALL
SELECT 'B' AS NAME,CAST('2024-06-02' AS datetime2) AS update_timestamp
UNION ALL
SELECT 'C' AS NAME,CAST('2024-06-03' AS datetime2) AS update_timestamp
;

SELECT
	*
	FROM
		dbo.adf_metadata_01
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bccbfc14-ef8b-7b88-f05c-c15a024cd4b4.png)

### 2. パラメータ化したリンクドサービスを新規で作成する手順を含むメタデータ駆動のコピージョブを作成

パラメータとして`serer_name`と`db_name`を作成し、`完全修飾ドメイン名`と`データベース名`にそのパラメータを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0009b351-936c-4e50-b785-efa9d1f244a7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/84acefb0-e05c-d7d5-0626-7e88fdec1035.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1642f2f8-1f47-5e19-ab93-17055e6e552a.png)

### 3. 接続管理テーブルのコードをデプロイメント環境（`DeployEnv`）列に関する修正後に実行

```sql
/****** Object:  Table [adf_metadata].[ConnectionControlTable_fuy] ******/
CREATE TABLE [adf_metadata].[ConnectionControlTable_fuy](
    [Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [Name] [varchar](max) NOT NULL,
    [DeployEnv] [nvarchar](10) NULL,
    [ConnectionSettings] [nvarchar](max) NULL
) 

DECLARE @ConnectionMetadata NVARCHAR(max)  = N'[
    {
        "Name": "AzureSqlDatabase3_Source_fuy",
        "DeployEnv": "dev",
        "ConnectionSettings": {
            "serer_name": "aqdb-dev.database.windows.net",
            "db_name": "adf-metadata-dev"
        }
    },
    {
        "Name": "AzureSqlDatabase3_Source_fuy",
        "DeployEnv": "prd",
        "ConnectionSettings": {
            "serer_name": "aqdb-pr.database.windows.net",
            "db_name": "adf-metadata-prd"
        }
    }
]';
INSERT INTO [adf_metadata].[ConnectionControlTable_fuy] (
    [Name],
	[DeployEnv],
    [ConnectionSettings])
SELECT * FROM OPENJSON(@ConnectionMetadata)
    WITH (
		[Name] [varchar](max),
		[DeployEnv] [varchar](10),
        [ConnectionSettings] [nvarchar](max) AS JSON
	)
;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/dfcc9aa4-f4bc-4c40-f11b-f15ff0e08638.png)


### 4. メイン制御テーブルを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8bfec8fd-fae2-f1a5-7959-89b355c57e8d.png)

### 5. メタデータ駆動のコピータスクにより作成されたデータセットにてリンクサービスにパラメータを渡すように修正

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6bc2f17a-2234-2e1e-80bf-8e826653320d.png)

### 6. メタデータ駆動のコピータスクの３つのパイプラインにて`DeployEnv`というパラメータを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/10890f94-a2b6-d302-5336-73ffe9d2b9d6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8f8d09a1-1c2e-76b8-5ef0-bdd055898ffa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ddb6163e-395c-081b-df8c-6ffd2d446117.png)

### 7. `MetadataDrivenCopyTask_xxx_TopLevel`パイプラインと`MetadataDrivenCopyTask_xxx_MiddleLevel`パイプラインにて Execute Pipeline アクティビティにて`DeployEnv`パラメータを渡すように修正

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/471092ad-9670-0306-d124-e6c092b33d83.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/04b85942-cbaa-8394-b685-d2c896254be3.png)

### 8. `MetadataDrivenCopyTask_xxx_BottomLevel`パイプラインの`GetSourceConnectionValues`アクティビティのクエリの Where 句に`DeployEnv`列のロジックを追加

```sql
AND DeployEnv = '@{pipeline().parameters.DeployEnv}'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f9bbd194-920a-1a03-ebad-6ae6a5cdd177.png)

## 動作検証

### 1. `DeployEnv`を`dev`でデバック実行して1レコード連携されることを確認 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f1deb5ef-aba3-ac45-ef60-c3fc94ed2132.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1c596692-bb21-2f18-d4b6-a7073dda4582.png)

### 2. `DeployEnv`を`prd`でデバック実行して3レコード連携されることを確認 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b812b10e-2bf9-09e8-4ccc-47cf5d257dd6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1cc2329e-c5b5-ea98-f43d-7d21805437ea.png)