はじめに
本記事では 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
- Migrating from Azure Data Factory to Azure Synapse Integration
- Azure Synapse Analytics 日本上陸記念! Synapse リソースの移行ステップ 2020年12月バージョン - Qiita
- Azure Synapse Analytics へ Azure Data Factoryの資産を移行する - Qiita
移行の流れ
ADF & Synapse パイプライン上のリソースは以下のような依存関係になっています。矢印の終端が依存先 (依存されている) リソースです。依存先リソースが存在しない場合、依存元リソースを移行してもエラーになってしまいます。
ADF で既定の統合ランタイム AutoResolveIntegrationRuntime しか利用していない場合は統合ランタイムの移行作業は特段不要です。セルフホステッド統合ランタイムなどを利用している場合は Synapse 側でもセットアップが必要です。
Linked service の中の Azure Key Vault は他の Linked service から参照されるリソースになります。ADF で Azure Key Vault を利用している場合は他の Linked service よりも先に移行する必要があります。
残りのリソースについて、本記事では Git 連携の強みを活かした方法で移行していきます。
事前作業 (必要なもののみ実施)
先んじて対応が必要なものを記載していきます。自身の環境に合わせて必要なもののみ実施すれば OK です。
ADF で既定以外の統合ランタイムを利用している場合
Synapse ワークスペースでも統合ランタイムをセットアップしておきます。その際、統合ランタイムの名前は ADF と Synapse ワークスペースで揃えた方が後続の移行作業がスムーズに行えます。
ADF の Linked service で Key Vault を利用している場合
Synapse ワークスペースのマネージド ID に Key Vault の参照権限を付与しておきます。
その後、Synapse Studio で Key Vault 用の Linked service を作成します。ADF 上の Linked service と名前は揃えておきます。作成後、Publish しておきます。
ADF の Linked service でマネージド ID 認証を利用している場合
Synapse ワークスペースのマネージド ID に ADF と同等の Azure RBAC ロールを付与しておきます。
移行準備
ここから移行準備をしていきます。あらかじめ手元で以下のツールが使えるようにしておくと作業がスムーズです。
- Git
- 複数ファイルの文字列の一括置換が行えるツール (VSCode など)
1. ADF と Synapse ワークスペースの Git リポジトリ設定
以下のドキュメントを参考に ADF と Synapse ワークスペースの Git リポジトリを設定します。Azure DevOps Git または GitHub が選択できますが、どちらを選んでも OK です。既に Git リポジトリを設定済みの場合は本手順はスキップして OK です。
- ソース管理 - Azure Data Factory | Microsoft Docs
- Synapse Studio でのソース管理 - Azure Synapse Analytics | Microsoft Docs
以下は参考の画面キャプチャです。
2. 手元環境に Git リポジトリを clone
前段で設定した Git リポジトリを手元に clone しておきます。以下はコマンド例ですが、自身の環境に合わせて読み替えてください。
$ 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.
$ 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 上のリソースに対応しています。
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 クライアントを利用していますが、お好みのツールをご利用ください。
以降はこのブランチ上で作業を進めて行きます。
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
フォルダにコピー (フォルダが存在しない場合は新規作成する)
-
type
置換
各 JSON ファイル内のtype
を以下のように置換します。ファイル数が少ない場合は手作業でも良いですが、多い場合は VSCode などのツールを使うとスムーズに行えると思います。
"type": "Microsoft.DataFactory/factories/linkedservices"
"type": "Microsoft.Synapse/workspaces/linkedservices"
- (参考) 置換後の JSON 全体の例
{
"name": "AzureDataLakeStorage_sthinakazaopenhackmdw",
"properties": {
"annotations": [],
"type": "AzureBlobFS",
"typeProperties": {
"url": "https://sthinakazaopenhackmdw.dfs.core.windows.net"
}
},
"type": "Microsoft.Synapse/workspaces/linkedservices"
}
補足1: Key Vault を利用している場合の一時エラー
私の手元で試した際、上記の手順で移行した Linked service のうち、マネージド ID の認証は Test connection まで問題なく成功しました。一方、Key Vault を利用している Linked service は Test connection に失敗しました。どうも UI か何かのエラーのようで、Key Vault の Linked service を選択し直すなどして再度 Test connection を実施すると成功しました。
補足2: シークレットを直接設定している Linked service のエラー
セクションの冒頭で記載した通り、アカウント キーやパスワードなどのいわゆるシークレットを直接設定している Linked service を Git のコミット & プッシュ方式で移行しようとすると、以下のようなエラー Failed to decrypt sub-resource payload
が出ます。
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 にインポートした際にこれが復号化できずにエラーになっていると推察されます。
{
"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
が存在しない = 復号化が不要なためエラーが起きないものと推察されます。
{
"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
フォルダにコピー (フォルダが存在しない場合は新規作成する)
-
type
置換
各 JSON ファイル内のtype
を以下のように置換します。
"type": "Microsoft.DataFactory/factories/datasets"
"type": "Microsoft.Synapse/workspaces/datasets"
- (参考) 置換後の JSON 全体の例
{
"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 が追加されていることを確認する
4. Data flow の移行
-
ADF 用リポジトリの
dataflow
フォルダ配下の JSON ファイル群を Synapse 用リポジトリのdataflow
フォルダにコピー (フォルダが存在しない場合は新規作成する)
-
Data flow の JSON には
type
は含まれないため、そのまま Git にコミット & プッシュ -
Synapse Studio で作業用ブランチに切り替えて [Develop] ハブ > [Data flows] に Data flow が追加されていることを確認する
5. Pipeline の移行
-
ADF 用リポジトリの
pipeline
フォルダ配下の JSON ファイル群を Synapse 用リポジトリのpipeline
フォルダにコピー (フォルダが存在しない場合は新規作成する)
-
type
置換
各 JSON ファイル内のtype
を以下のように置換します。
"type": "Microsoft.DataFactory/factories/pipelines"
"type": "Microsoft.Synapse/workspaces/pipelines"
- (参考) 置換後の JSON 全体の例
{
"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 が追加されていることを確認する
-
代表的なパイプラインをデバッグ実行して正常終了するかを確認する
6. Trigger の移行
-
ADF 用リポジトリの
trigger
フォルダ配下の JSON ファイル群を Synapse 用リポジトリのtrigger
フォルダにコピー (フォルダが存在しない場合は新規作成する)
-
Trigger の JSON には
type
は含まれないため、そのまま Git にコミット & プッシュ -
Synapse Studio で作業用ブランチに切り替えて [Manage] ハブ > [Triggers] に Trigger が追加されていることを確認する
7. 移行作業用ブランチのマージ & Publish
Synapse ワークスペース用 Git リポジトリの移行作業用ブランチをコラボレーション ブランチ (ここでは master ブランチ) にマージし、Publish します。
8. 後片付け
これで移行作業は完了です。必要に応じて移行元の ADF のクリーン アップなどを実施します。
以上です。