Azure Synapse Analytics workspace成果物の Azure DevOps によるCI/CD【基本編(yamlパイプライン)】

# Azure Synapse Analytics 成果物の Azure DevOps によるCI/CD【基本編(yamlパイプライン)】

## はじめに

Synapse Analytics (workspace)の開発環境から本番環境への反映方法についてまとめます。

いくつかオプションがあるのですが、今回は **基本編** です

2022/05時点の情報です。

### 参考

[Azure Synapse Analytics ワークスペースの継続的インテグレーションとデリバリー](https://docs.microsoft.com/ja-jp/azure/synapse-analytics/cicd/continuous-integration-delivery)

[How to use CI/CD integration to automate the deploy of a Synapse Workspace to multiple environments](https://techcommunity.microsoft.com/t5/azure-synapse-analytics-blog/how-to-use-ci-cd-integration-to-automate-the-deploy-of-a-synapse/ba-p/2248060)

[Synapse workspace deployment](https://marketplace.visualstudio.com/items?itemName=AzureSynapseWorkspace.synapsecicd-deploy&ssr=false#overview)

[CI CD in Azure Synapse Analytics Part 5 - Deploying Azure Synapse Workspace from ARM](https://techcommunity.microsoft.com/t5/data-architecture-blog/ci-cd-in-azure-synapse-analytics-part-5-deploying-azure-synapse/ba-p/2775403)

[Azure/Synapse-workspace-deployment](https://github.com/Azure/Synapse-workspace-deployment)

[Azure Synapse Studio CICD using YAML pipelines](https://techcommunity.microsoft.com/t5/azure-synapse-analytics-blog/azure-synapse-studio-cicd-using-yaml-pipelines/ba-p/3045553)

[santiagxf/synapse-cicd](https://github.com/santiagxf/synapse-cicd)


## 概念

### Data Factory / Synapse workspaceのgit構成時のイメージ

Data Factory と Synapse workspaceをgit構成すると、このようなイメージになります。

![2022-06-01-08-19-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/56cc4143-d1b1-a7b0-ba0e-dbcdad25b15c.png)


**DevOps組織/プロジェクト/リポジトリ** : ソースコードを管理するリポジトリ

**コラボレーションブランチ** : 各作業ブランチを統合して、Data Factory / Synapse workspace のリソースに反映するブランチ。 main ブランチやdevelopment ブランチが該当することになります。

**発行ブランチ** : Data Factory / Synapse workspace のリソースに反映する際にテンプレートを配置するブランチ。発行ボタンを押すと更新されます。

### Data Factory と Synapse workspaceの違い

#### Data Factoryの考え方

Data Factoryで作成した成果物（パイプラインなど）はすべてAzure Resource Manager にてサブリソースとして管理され、ARM テンプレートファイルで操作可能な状態になっています。

したがって、adf_publishブランチのテンプレートを手動[ARMテンプレートファイルによるデプロイ](https://qiita.com/ryoma-nagata/items/5fa5ef1d7f5f8029cfa4)での一括反映に利用ができます。（自動の場合は、ARM テンプレートデプロイタスクが利用可能）

![2022-06-01-08-30-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/aa6ed62e-0629-fc31-1682-1bc7d86cd408.png)


#### Synapse workspace での違い

Synapse workspaceでは、作成した成果物は基本的に ARMで操作できない、**リソース固有のデータ** として扱われています。

このため、workspace_publish 内に保管されたテンプレートはSynapse workspaceのdevエンドポイントを通してしか利用ができず、Data Factory のようにARMテンプレートファイルによる手動での一括反映は不可となっています。

![2022-06-01-08-31-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f3ca2282-5a33-798f-014e-51cb01d00d50.png)


## 自動反映構成方法

Github上にハンズオンのリポジトリを作成したのでこれを利用していきます。一旦リソースのデプロイ後、git構成まで進めておきます。※DevOpsが利用しているサービスプリンシパルを **Synapse 管理者** にするのを忘れないようにしてください。

https://github.com/ryoma-nagata/SynapseCICD-HOL

### DevOpsパイプラインの構成

1.開発環境側をgit構成すると以下のような状態となります。

![2022-06-01-08-45-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/21e26007-16ec-83ab-4861-bb9ba902ca8e.png)


2.発行ボタンを押すと、workspace_publishブランチが作成され、テンプレートファイル（ARM用ではない）と対応したパラメータファイルが作成されます。

![2022-06-01-08-48-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f97603a8-310a-6bcc-3dc6-5c7666a15f33.png)


3.CICDパイプラインをセットアップします。

[https://github.com/ryoma-nagata/SynapseCICD-HOL/blob/master/.ado/synapse/azure-pipelines.yml](https://github.com/ryoma-nagata/SynapseCICD-HOL/blob/master/.ado/synapse/azure-pipelines.yml) ファイルをuploadし、変数を編集します。

変数では、開発環境のSynapse Workspaceと ステージング環境のSynapse Workspaceの名称とリソースグループ名などを入れます。

![2022-06-01-09-00-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/35a59555-2155-4fa5-4fce-c430c6a0919a.png)


4.workspace_publishにはテンプレートのパラメータファイルがありますので、これをrenameして内容を編集します。※次に発行した際に再度元のファイルが作成されます。


![2022-06-01-09-08-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/69c06094-58a3-993f-e48c-7e15dbeafece.png)


名称は **TemplateParametersForWorkspace_stg.json** としましょう。パイプラインから参照させる予定です。

5.パイプラインを作成し、Run します。※詳細手順はGithubリポジトリを参照

woskspace_publishブランチ上のパイプラインを選択するので注意です。

![2022-06-01-09-01-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f9a87aa5-c0db-95ab-04db-d4a6017eae76.png)


![2022-06-01-09-03-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/b9976f4e-bee4-0d1a-2324-1d7cd41c8892.png)


#### パイプラインの内容

マルチステージパイプラインとなっています。

![2022-06-01-09-05-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/6cd27e27-a08f-00ca-0b2d-4dd6dc7b8177.png)



##### PublishArtifact

成果物として、workspace_publish内のテンプレートファイルを **synapse** という名称で発行しています。
発行したファイルはpublishedから確認できます。

![2022-06-01-09-09-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/26f34d8f-018e-5103-c490-f9f3f23d5bf1.png)


##### Deployment STG

以下を順番に実行しています。

1.成果物のダウンロード:前ステージで発行した成果物をダウンロードします。(deploymentステージでは既定で実行されます)

2.Synapse WorkspaceのIPフィルタのホワイトリストにDev OpsエージェントのパブリックIPを追加します。（認証が成功してからネットワーク許可をするゼロトラスト的発想）

3.Triggerを全停止します。

4.ダウンロードしたテンプレートファイルを利用してデプロイします。

5.Triggerを全再開します。

6.DevOpsエージェントのパブリックIPをホワイトリストから削除します。

どうもファイアウォールの変更が非同期に動いてしまうようなので、waitを入れていたりもします。

### 開発環境

パイプラインが正常実行できたら、OKなわけですが、パラメータファイルの使い方を抑えるためにリンクサービスの追加をしてみます。

ナレッジセンターに移動します。

![2022-06-01-08-42-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/82d39d46-240c-8dc8-a166-2b71566b6d07.png)


データセットを追加します。

![2022-06-01-09-43-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bf773e5b-9831-56e3-85ca-ead24f030a46.png)


リンクサービスが追加されているはずです。

![2022-06-01-09-44-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/71f4a37d-752f-ffbe-d15a-6ad4bb030e06.png)


SAS トークンが初期化されていると思いますが、パブリックなblobのため、トークンに **''** (空文字)を入力します。

![2022-06-01-09-45-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a8a4b4c6-7cc5-f6a1-7acb-a2a204ac3304.png)


[テンプレートファイル](https://github.com/ryoma-nagata/SynapseCICD-HOL/blob/master/sample/nyc_load.zip)をインポートしてみます。

![2022-06-01-09-48-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/d6316098-b79e-0dba-fc95-e2bb7f58dfad.png)

![2022-06-01-09-55-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/601e193c-b232-9932-b5b8-e0216b46aa8f.png)


デバッグの成功確認後、発行ボタンを押すとworkspace_publishブランチが更新され、CICDが自動実行されます。

![2022-06-01-10-14-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/909f21fc-0e5d-4250-6293-737e9aa1e48a.png)


### stg環境

自動デプロイ後、成果物の反映を確認できます。

![2022-06-01-10-24-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a7dfd6cf-44bc-ce48-3bc7-21d01a41b42d.png)


が、リンクサービスがつながらない状態となります。

![2022-06-01-10-24-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9a06d35d-6c9e-b579-0b18-1c0cd8836e6e.png)

理由はパラメータファイルです。

#### パラメータファイルの編集

パラメータファイル内の接続情報は機密情報としてみなされるため、空となります。
既定で出力されるTemplateParametersForWorkspace.json　をみてみます。

![2022-06-01-10-15-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/52234bd2-c90e-5d33-5888-931042893245.png)


デプロイの際には _stg.jsonを利用していますが、そこには新しく追加したリンクサービス情報がありません。

![2022-06-01-10-19-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/53779006-78cc-608b-0f07-bfd57185e809.png)


これを正しい形に編集します。

開発環境のリンクサービス内容を確認します。

![2022-06-01-10-20-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3b54c1fa-1db8-cd6e-99c6-3cb28d3c2103.png)


sasUriの値をコピーします。

![2022-06-01-10-20-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5d4668eb-a6c6-f660-a95e-42af23df2b70.png)


sasトークンは空文字を設定しているので、以下のようにします。

[参考：Azure Data Factory でパブリック公開されているAzure Storageに接続する方法](https://qiita.com/ryoma-nagata/items/62544c049b23bb40f992)

![2022-06-01-10-22-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/1f1790e0-6276-a96e-da10-fbf18155638b.png)


※なお、Defaultと入っている情報はデプロイ対象外となるので変更不要です。

Commitすると再度パイプラインが実行されます。

![2022-06-01-10-32-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c80d7b8f-ed0d-c05b-46e1-63070f882122.png)


完了後、リンクサービスを確認すると接続が成功します。

![2022-06-01-10-28-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9ac7ccbd-84e8-e888-86c4-af335138e6cc.png)