Azure Data Factory 上のリソース群を Azure Synapse Analytics ワークスペースに移行する

# はじめに
本記事では Azure Data Factory (ADF) 上のリソース群を Azure Synapse Analytics ワークスペースに移行する方法についてまとめます。先人が分かりやすくまとめて下さっている記事をかなり参考にしていますので、そちらも合わせてご覧ください。お約束ですが、本記事は公式のドキュメントではありませんので、お手元で作業される際は参考扱いとしてご覧頂ければと思います。

## 追記
2021 年 7 月に AzureSamples の GitHub リポジトリに ADF から Synapse への移行にお使い頂ける PowerShell スクリプトが公開されています。本 Qiita は手作業で進める流れとしていますが、スクリプトがお好みの場合は以下をお試しください。
https://github.com/Azure-Samples/Synapse/tree/main/Pipelines/ImportADFtoSynapse

## 参考リンク
- [azure-synapse-analytics-ga-content-packs/README.md at main · solliancenet/azure-synapse-analytics-ga-content-packs](https://github.com/solliancenet/azure-synapse-analytics-ga-content-packs/blob/main/hands-on-labs/lab-03/README.md)
- [Migrating from Azure Data Factory to Azure Synapse Integration](https://www.data4v.com/migrating-from-azure-data-factory-to-azure-synapse-integration/)
- [Azure Synapse Analytics 日本上陸記念! Synapse リソースの移行ステップ 2020年12月バージョン - Qiita](https://qiita.com/dahatake/items/e976d70b32a4aa7d6be5)
- [Azure Synapse Analytics へ Azure Data Factoryの資産を移行する - Qiita](https://qiita.com/ryoma-nagata/items/1bbdab083c19fc6e9a53)

# 移行の流れ
ADF & Synapse パイプライン上のリソースは以下のような依存関係になっています。矢印の終端が依存先 (依存されている) リソースです。依存先リソースが存在しない場合、依存元リソースを移行してもエラーになってしまいます。

![qiita-adf-synapse-resource-relation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/b36b7bc1-9ec3-dcca-1adf-7803f3f8b1b4.png)

ADF で既定の統合ランタイム AutoResolveIntegrationRuntime しか利用していない場合は統合ランタイムの移行作業は特段不要です。セルフホステッド統合ランタイムなどを利用している場合は Synapse 側でもセットアップが必要です。

Linked service の中の Azure Key Vault は他の Linked service から参照されるリソースになります。ADF で Azure Key Vault を利用している場合は他の Linked service よりも先に移行する必要があります。

残りのリソースについて、本記事では Git 連携の強みを活かした方法で移行していきます。

# 事前作業 (必要なもののみ実施)
先んじて対応が必要なものを記載していきます。自身の環境に合わせて必要なもののみ実施すれば OK です。

## ADF で既定以外の統合ランタイムを利用している場合
Synapse ワークスペースでも統合ランタイムをセットアップしておきます。その際、統合ランタイムの名前は ADF と Synapse ワークスペースで揃えた方が後続の移行作業がスムーズに行えます。

- ADF の統合ランタイム一覧画面の例: 既定の統合ランタイム以外に 2 つのセルフホステッド統合ランタイムが存在
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/fe3a7021-7708-887d-b525-55c9269a42cc.png)

- Synapse Studio の統合ランタイム一覧画面の例: 既定の統合ランタイム以外に 2 つのセルフホステッド統合ランタイムを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/235dd4f2-b21c-c75a-c9d1-90efe10377e7.png)

## ADF の Linked service で Key Vault を利用している場合
Synapse ワークスペースのマネージド ID に Key Vault の参照権限を付与しておきます。

- Key Vault のアクセス ポリシーの例: Synapse ワークスペースのマネージド ID にシークレットの取得と一覧を許可
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/edd09f10-a2da-e713-6603-6a789374075c.png)

その後、Synapse Studio で Key Vault 用の Linked service を作成します。ADF 上の Linked service と名前は揃えておきます。作成後、Publish しておきます。

- Key Vault 用の Linked service の作成画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/b0229edb-c9f1-b6cd-fb44-a3ec3e7dfe25.png)

## ADF の Linked service でマネージド ID 認証を利用している場合
Synapse ワークスペースのマネージド ID に ADF と同等の Azure RBAC ロールを付与しておきます。

- ストレージ アカウントのアクセス制御の例: Synapse ワークスペースのマネージド ID に「ストレージ BLOB データ共同作成者」を付与
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/f53901bc-9a80-4ecf-bb99-457a10a5053e.png)

# 移行準備
ここから移行準備をしていきます。あらかじめ手元で以下のツールが使えるようにしておくと作業がスムーズです。

- Git
- 複数ファイルの文字列の一括置換が行えるツール (VSCode など)

## 1. ADF と Synapse ワークスペースの Git リポジトリ設定
以下のドキュメントを参考に ADF と Synapse ワークスペースの Git リポジトリを設定します。Azure DevOps Git または GitHub が選択できますが、どちらを選んでも OK です。既に Git リポジトリを設定済みの場合は本手順はスキップして OK です。

- [ソース管理 - Azure Data Factory | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/data-factory/source-control)
- [Synapse Studio でのソース管理 - Azure Synapse Analytics | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/cicd/source-control)

以下は参考の画面キャプチャです。

- ADF の Git リポジトリ設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/ca7211a0-f177-c8bb-dfd4-1d4886950320.png)

- Synapse ワークスペースの Git リポジトリ設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/eee120be-1b50-0beb-7cd0-67862bffa135.png)

## 2. 手元環境に Git リポジトリを clone
前段で設定した Git リポジトリを手元に clone しておきます。以下はコマンド例ですが、自身の環境に合わせて読み替えてください。

```bash:GitCloneExample(RepoForAdf)
$ git clone https://org-nakazax@dev.azure.com/org-nakazax/pj-nakazax/_git/openhack-mdw-adf-repo
Cloning into 'openhack-mdw-adf-repo'...
remote: Azure Repos
remote: Found 184 objects to send. (18 ms)
Receiving objects: 100% (184/184), 115.28 KiB | 123.00 KiB/s, done.
```

```bash:GitCloneExample(RepoForSynapse)
$ git clone https://org-nakazax@dev.azure.com/org-nakazax/pj-nakazax/_git/openhack-mdw-synapse-repo
Cloning into 'openhack-mdw-synapse-repo'...
remote: Azure Repos
remote: Found 12 objects to send. (36 ms)
Unpacking objects: 100% (12/12), 1.71 KiB | 12.00 KiB/s, done.
```

ADF 用のリポジトリは以下のようなフォルダ・ファイル構成になっているはずです。機能の利用有無によっては存在しないフォルダもあります。各 JSON ファイルが ADF 上のリソースに対応しています。

```text:ADF用リポジトリ_フォルダ・ファイル構成
C:.
│  readme.md
│
├─dataflow
│      DataflowCustomers.json
│      (中略)
│      DataflowSalesOrders.json
│
├─dataset
│      FourAdlsCsvActors.json
│      (中略)
│      VanSqlTransactions.json
│
├─factory
│      df-hinakaza-openhack-mdw.json
│
├─integrationRuntime
│      SelfHostedIntegrationRuntimeFourthCoffee.json
│      SelfHostedIntegrationRuntimeVanArsdelLtd.json
│
├─linkedService
│      AzureDataLakeStorage_sthinakazaopenhackmdw.json
│      (中略)
│      SqlServer_Rentals.json
│
├─managedVirtualNetwork
│      default.json
│
├─pipeline
│      FourthCopyActors.json
│      (中略)
│      VanCopyTransactions.json
│
└─trigger
        ScheduleTriggerFourthCopyActors.json
```

# 移行作業
ここから移行作業に入っていきます。

## 1. 移行作業用 Git ブランチの作成
作業に失敗してもすぐにやり直しができるように Synapse ワークスペース用 Git リポジトリに移行作業用のブランチを作成しておきます。以下はブランチ作成例です。ここでは SourceTree という Git クライアントを利用していますが、お好みのツールをご利用ください。

- 移行作業用ブランチの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/3d4ec134-12e2-bfc9-f09c-88b5d5876626.png)

以降はこのブランチ上で作業を進めて行きます。

## 2. Linked service の移行
最初に Linked service を移行していきます。Linked service はデータストア等の接続情報を表す ADF & Synapse のリソースです。

注意点として、アカウント キーやパスワード等のいわゆるシークレットを直接設定している Linked service は Git を用いた移行ができません。ADF 側でマネージド ID や Key Vault を用いた認証方式に変更するか、Synapse ワークスペースに手動で設定する必要があります。

以下はマネージド ID や Key Vault での認証を設定した Linked service の作業ステップです。(Linked service の移行は他に比べるとややハマりどころが多いです。数が多くない場合は Synapse Studio から手動で設定するのもアリだと思います)

- ADF 用リポジトリの `linkedService` フォルダ配下の JSON ファイル群を Synapse 用リポジトリの `linkedService` フォルダにコピー (フォルダが存在しない場合は新規作成する)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/b9c0dc5d-8698-6962-cd81-84bad0aa2891.png)

- `type` 置換
各 JSON ファイル内の `type` を以下のように置換します。ファイル数が少ない場合は手作業でも良いですが、多い場合は VSCode などのツールを使うとスムーズに行えると思います。

```json:置換前(Linkedservice)
"type": "Microsoft.DataFactory/factories/linkedservices"
```

```json:置換後(Linkedservice)
"type": "Microsoft.Synapse/workspaces/linkedservices"
```

- (参考) 置換後の JSON 全体の例

```json:置換後JSON全体(Linkedservice)
{
	"name": "AzureDataLakeStorage_sthinakazaopenhackmdw",
	"properties": {
		"annotations": [],
		"type": "AzureBlobFS",
		"typeProperties": {
			"url": "https://sthinakazaopenhackmdw.dfs.core.windows.net"
		}
	},
	"type": "Microsoft.Synapse/workspaces/linkedservices"
}
```

- (参考) VSCode での一括置換のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/dbb4c47c-4fcf-2ee1-3b8e-364606152c58.png)

- `type` の置換が完了したら Git にコミット & プッシュ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/1190230d-48e3-7ffa-df31-f283630fcabc.png)

- Azure Repos で作業用ブランチに切り替えて JSON ファイル群が追加されていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/e0fa54ee-ff88-c8b3-51c6-6ee180e55d5c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/1dd8f1d7-d6c9-cb4b-e151-27b2c2970991.png)

- Synapse Studio で作業用ブランチに切り替えて Linked service が追加されていることを確認する (作業用ブランチが表示されていない場合はブラウザをリフレッシュ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/9e22ea48-3939-eac8-981a-395d343d9012.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/79f5d696-cadd-14b8-dff1-cf1d148ec1ed.png)

- Test connection が成功することを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/85d7b03a-251a-7b20-a18f-710f97d1b31b.png)

### 補足1: Key Vault を利用している場合の一時エラー
私の手元で試した際、上記の手順で移行した Linked service のうち、マネージド ID の認証は Test connection まで問題なく成功しました。一方、Key Vault を利用している Linked service は Test connection に失敗しました。どうも UI か何かのエラーのようで、Key Vault の Linked service を選択し直すなどして再度 Test connection を実施すると成功しました。

- Test connection に失敗
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/f04f15f9-aa5e-0d5b-14eb-0d955b95ab95.png)

- Key Vault の Linked service を選択し直し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/5e840006-e2bc-626a-5d00-11d71fc575d1.png)

- 再度 Test connection を実行、成功したので Apply
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/723aed5b-0d1e-4cae-bb91-a3137a32a2c5.png)

- 即時の Publish を求められるので [OK] をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/2f33483c-fd2c-4a22-7d1d-e1b25cbdba6d.png)

### 補足2: シークレットを直接設定している Linked service のエラー
セクションの冒頭で記載した通り、アカウント キーやパスワードなどのいわゆるシークレットを直接設定している Linked service を Git のコミット & プッシュ方式で移行しようとすると、以下のようなエラー `Failed to decrypt sub-resource payload` が出ます。

```text:Linkedserviceエラー例
Failed to decrypt sub-resource 'None' payload on cloud with error: Failed to decrypt sub-resource payload {
"name": "AzureDataLakeStorage_sthinakazaopenhackmdw",
"properties": {
"type": "AzureBlobFS",
"annotations": [],
"typeProperties": {
"url": "********************",
"encryptedCredential": "********************"
}
}
} and error is: Cloud stored credentials cannot be found with retry, please check whether related resource had been deleted before. Value is: {
"Version": "2017-11-30",
"ProtectionMode": "Key",
"SecretContentType": "Plaintext",
"CredentialId": "DF-HINAKAZA-OPENHACK-MDW_261c61c7-f712-4213-8adc-da61b19dd987"
}, type is Plaintext and credentialId is DF-HINAKAZA-OPENHACK-MDW_261c61c7-f712-4213-8adc-da61b19dd987.., status code: BadRequest.
. Activity ID: b6c89131-82ef-4d02-93f5-4261c048b4a6
```

シークレットは以下のように `encryptedCredential` の中で暗号化されて保存されるのですが、Synapse にインポートした際にこれが復号化できずにエラーになっていると推察されます。

```JSON:アカウントキー認証のJSON例
{
	"name": "AzureDataLakeStorage_sthinakazaopenhackmdw",
	"type": "Microsoft.DataFactory/factories/linkedservices",
	"properties": {
		"annotations": [],
		"type": "AzureBlobFS",
		"typeProperties": {
			"url": "https://sthinakazaopenhackmdw.dfs.core.windows.net",
			"encryptedCredential": "ew0KICAiVmVyc2lvbiI6ICIyMDE3LTExLTMwIiwNCiAgIlByb3RlY3Rpb25Nb2RlIjogIktleSIsDQogICJTZWNyZXRDb250ZW50VHlwZSI6ICJQbGFpbnRleHQiLA0KICAiQ3JlZGVudGlhbElkIjogIkRGLUhJTkFLQVpBLU9QRU5IQUNLLU1EV18yNjFjNjFjNy1mNzEyLTQyMTMtOGFkYy1kYTYxYjE5ZGQ5ODciDQp9"
		}
	}
}
```

以下はマネージド ID 認証をしている Linked service の例です。`encryptedCredential` が存在しない = 復号化が不要なためエラーが起きないものと推察されます。

```JSON:マネージドID認証のJSON例
{
	"name": "AzureDataLakeStorage_sthinakazaopenhackmdw",
	"properties": {
		"annotations": [],
		"type": "AzureBlobFS",
		"typeProperties": {
			"url": "https://sthinakazaopenhackmdw.dfs.core.windows.net"
		}
	},
	"type": "Microsoft.DataFactory/factories/linkedservices"
}
```

## 3. Dataset の移行
- ADF 用リポジトリの `dataset` フォルダ配下の JSON ファイル群を Synapse 用リポジトリの `dataset` フォルダにコピー (フォルダが存在しない場合は新規作成する)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/e04362e2-a9f8-d773-e8a4-b1c49f82e668.png)

- `type` 置換
各 JSON ファイル内の `type` を以下のように置換します。

```json:置換前(Dataset)
"type": "Microsoft.DataFactory/factories/datasets"
```

```json:置換後(Dataset)
"type": "Microsoft.Synapse/workspaces/datasets"
```

- (参考) 置換後の JSON 全体の例

```json:置換後JSON全体(Dataset)
{
	"name": "FourAdlsCsvActors",
	"properties": {
		"linkedServiceName": {
			"referenceName": "AzureDataLakeStorage_sthinakazaopenhackmdw",
			"type": "LinkedServiceReference"
		},
		"folder": {
			"name": "FourthCoffeeRentals"
		},
		"annotations": [],
		"type": "DelimitedText",
		"typeProperties": {
			"location": {
				"type": "AzureBlobFSLocation",
				"fileName": "Actors.csv",
				"folderPath": "FourthCoffeeRentals",
				"fileSystem": "source-data-container"
			},
			"columnDelimiter": ",",
			"escapeChar": "\\",
			"firstRowAsHeader": true,
			"quoteChar": "\""
		},
		"schema": []
	},
	"type": "Microsoft.Synapse/workspaces/datasets"
}
```

- `type` の置換が完了したら Git にコミット & プッシュ
- Synapse Studio で作業用ブランチに切り替えて [Data] ハブ > [Linked] > [Integration datasets] に Dataset が追加されていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/021f4dcc-8586-d743-44d3-5d4226a18ab9.png)

- 代表的なデータをプレビューし正常に参照できるかを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/947a2538-7151-2944-803f-af9875cc06c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/bcec1615-36fe-9076-1759-945dee22cef6.png)

## 4. Data flow の移行
- ADF 用リポジトリの `dataflow` フォルダ配下の JSON ファイル群を Synapse 用リポジトリの `dataflow` フォルダにコピー (フォルダが存在しない場合は新規作成する)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/539f6ff0-1df7-d57b-8a23-4c76c8ab695e.png)

- Data flow の JSON には `type` は含まれないため、そのまま Git にコミット & プッシュ
- Synapse Studio で作業用ブランチに切り替えて [Develop] ハブ > [Data flows] に Data flow が追加されていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/a23b4812-1719-cc90-6cfb-34c48adc0b4f.png)

## 5. Pipeline の移行
- ADF 用リポジトリの `pipeline` フォルダ配下の JSON ファイル群を Synapse 用リポジトリの `pipeline` フォルダにコピー (フォルダが存在しない場合は新規作成する)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/c95acd82-1924-3866-bed8-92def1518b98.png)

- `type` 置換
各 JSON ファイル内の `type` を以下のように置換します。

```json:置換前(Pipeline)
"type": "Microsoft.DataFactory/factories/pipelines"
```

```json:置換後(Pipeline)
"type": "Microsoft.Synapse/workspaces/pipelines"
```

- (参考) 置換後の JSON 全体の例

```json:置換後JSON全体(Pipeline)
{
	"name": "FourthCopyActors",
	"properties": {
		"activities": [
			{
				"name": "CopyActors",
				"type": "Copy",
				"dependsOn": [],
				"policy": {
					"timeout": "7.00:00:00",
					"retry": 0,
					"retryIntervalInSeconds": 30,
					"secureOutput": false,
					"secureInput": false
				},
				"userProperties": [],
				"typeProperties": {
					"source": {
						"type": "DelimitedTextSource",
						"storeSettings": {
							"type": "FileServerReadSettings",
							"recursive": true
						},
						"formatSettings": {
							"type": "DelimitedTextReadSettings"
						}
					},
					"sink": {
						"type": "DelimitedTextSink",
						"storeSettings": {
							"type": "AzureBlobFSWriteSettings"
						},
						"formatSettings": {
							"type": "DelimitedTextWriteSettings",
							"quoteAllText": true,
							"fileExtension": ".txt"
						}
					},
					"enableStaging": false,
					"translator": {
						"type": "TabularTranslator",
						"typeConversion": true,
						"typeConversionSettings": {
							"allowDataTruncation": true,
							"treatBooleanAsNumber": false
						}
					}
				},
				"inputs": [
					{
						"referenceName": "FourFileServerCsvActors",
						"type": "DatasetReference"
					}
				],
				"outputs": [
					{
						"referenceName": "FourAdlsCsvActors",
						"type": "DatasetReference"
					}
				]
			}
		],
		"folder": {
			"name": "FourthCoffeeRentals"
		},
		"annotations": [],
		"lastPublishTime": "2020-11-09T19:39:57Z"
	},
	"type": "Microsoft.Synapse/workspaces/pipelines"
}
```

- `type` の置換が完了したら Git にコミット & プッシュ
- Synapse Studio で作業用ブランチに切り替えて [Integrate] ハブ > [Pipelines] に Pipeline が追加されていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/72dee6c5-9829-50da-173f-af871e4da0a0.png)

- 代表的なパイプラインをデバッグ実行して正常終了するかを確認する

## 6. Trigger の移行
- ADF 用リポジトリの `trigger` フォルダ配下の JSON ファイル群を Synapse 用リポジトリの `trigger` フォルダにコピー (フォルダが存在しない場合は新規作成する)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/9cfaa9cf-4762-acc5-bd21-00aadcfdb8cc.png)

- Trigger の JSON には `type` は含まれないため、そのまま Git にコミット & プッシュ
- Synapse Studio で作業用ブランチに切り替えて [Manage] ハブ > [Triggers] に Trigger が追加されていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/2a2478d5-3495-433b-7b14-d5e4724f3c12.png)

## 7. 移行作業用ブランチのマージ & Publish
Synapse ワークスペース用 Git リポジトリの移行作業用ブランチをコラボレーション ブランチ (ここでは master ブランチ) にマージし、Publish します。

- Synapse Studio で作業用ブランチに切り替えて [Create pull request] をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/0adda029-fec1-b824-e4ac-1d264fd96bc0.png)

- Azure DevOps で Pull request を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/02c5ef00-a4d6-de98-6502-13bfbcafca82.png)

- Pull request を Complete & merge
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/eb73858c-dfa8-d210-3949-608aecd1a173.png)

- Synapse Studio でコラボレーション ブランチ (ここでは master) に切り替えて [Publish] をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/0098ab4d-92d3-7b40-6bd0-063ac57987b7.png)

- [OK] をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/59ae4192-6881-166d-c914-7695e597660f.png)

- Publish が完了するのを待つ (数が多いと数分程度掛かる可能性があります)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284925/35e4d51c-1687-fbe0-ed5b-4d47a7e7e4d6.png)

## 8. 後片付け
これで移行作業は完了です。必要に応じて移行元の ADF のクリーン アップなどを実施します。

以上です。