Azure SynapseのCI/CD化をやってみた

## システム構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/013f78d5-f59c-fc98-323c-110f94d9ed7c.png)


## 概要
開発用と本番用のSynapse、DevOpsServerをインストールするためのLinuxVM、Azure DevOpsのRepoとパイプラインを準備します。

まず開発環境で変更が生じて修正した後、Synapseの発行機能でリソース全てをjson形式でRepoに出力します。そしてパイプラインを実行し、内部でテストを行い本番環境に自動的に反映させます。

## 構築


#### Azure DevOps設定 リポジトリ設定①

事前にReposにリポジトリの作成を行います。
リポジトリを作成すると自動的にmainブランチも作成されます。

![スクリーンショット 2023-03-04 164004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/dc1b6906-90bd-6f35-6816-eb37b66d9b1d.jpeg)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/54bf0b94-d0e6-cfb0-3e55-e74cdbe5fcf0.png)


![スクリーンショット 2023-03-04 164237.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/e0202bd8-f4b9-21dc-2b06-ab9b77eca4ba.jpeg)


#### Azure DevOps サービスプリンシパル設定②

Azure DevOpsから本番環境のSynapseにアクセス出来るように権限設定を行います。
後々リリースパイプラインの実行権限、本番環境のSynapseのアクセス権限設定時に使用します。

一番左下の「Project settings」から「Service connections」、「Create service connection」を選択します。

![スクリーンショット 2023-03-04 173216.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/e76233d7-0fcd-bedf-cf2f-9f09fc637d0d.jpeg)

「Azure Resource Manager」を選択。

![スクリーンショット 2023-03-04 173242.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/b2f3c1d3-7d7d-4280-ddb0-a694bc441046.jpeg)

「Service principal(automatic)」を選択。

![スクリーンショット 2023-03-04 173259.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/aeeade5a-95e1-8836-1943-b8a6b8a049f6.jpeg)

自身のサブスクリプションを選択。
![スクリーンショット 2023-03-04 173332.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/46fe93cb-c214-c8aa-2a93-b711d61c954a.jpeg)

これで作成完了です。

![スクリーンショット 2023-03-04 173416.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/ae88aec5-77b0-1dee-cf03-d441fa49a915.jpeg)


![スクリーンショット 2023-03-04 173429.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/6a7d37ab-59bb-fdce-1527-3da5a0c3098a.jpeg)



#### Synapseのデプロイ
今回画面操作で構築すると時間が掛かるのでBicepでデプロイを行います。
以下に解説の記事を書いています。

https://qiita.com/ShogoMatsumoto/items/a66234b27ee29a2f4c08

synapseのARMはMicrosoftが公開しているものがあるので、Bicepにデコンパイルします。

https://github.com/Azure/azure-quickstart-templates/tree/master/quickstarts/microsoft.synapse/synapse-poc

以下デコンパイルして修正したものになります。
必要に応じてリソース名を変更します。
ローカル環境でbicepファイルを作成し内容をコピーします。



```Synapse.bicep
//開発環境ストレージ名
var storageAccounts_dev = 'developtesta1'
//開発環境Synapse名
var workspaces_dev = 'developtestb1'
//本番環境ストレージ名
var storageAccounts_pro = 'productiontesta1'
//本番環境Synapse名
var workspaces_pro = 'productiontestb1'

var location = 'japaneast'

//開発用環境

resource storageAccounts_name_resource_dev 'Microsoft.Storage/storageAccounts@2021-09-01' = {
  name: storageAccounts_dev
  location: location
  sku: {
    name: 'Standard_RAGRS'
  }
  kind: 'StorageV2'
  properties: {
    minimumTlsVersion: 'TLS1_2'
    allowBlobPublicAccess: true
    isHnsEnabled: true
    networkAcls: {
      bypass: 'AzureServices'
      virtualNetworkRules: []
      ipRules: []
      defaultAction: 'Allow'
    }
    supportsHttpsTrafficOnly: true
    encryption: {
      services: {
        file: {
          keyType: 'Account'
          enabled: true
        }
        blob: {
          keyType: 'Account'
          enabled: true
        }
      }
      keySource: 'Microsoft.Storage'
    }
    accessTier: 'Hot'
  }
}

resource storageAccounts_name_default_dev 'Microsoft.Storage/storageAccounts/blobServices@2021-09-01' = {
  parent: storageAccounts_name_resource_dev
  name: 'default'
  properties: {
    deleteRetentionPolicy: {
      allowPermanentDelete: false
      enabled: false
    }
  }
}


resource storageAccounts_zealls_name_default_zealfs_dev 'Microsoft.Storage/storageAccounts/blobServices/containers@2021-09-01' = {
  parent: storageAccounts_name_default_dev
  name: 'datafs'
}



resource workspaces_name_resource_dev 'Microsoft.Synapse/workspaces@2021-06-01' = {
  name: workspaces_dev
  location: location
  identity: {
    type: 'SystemAssigned'
  }
  properties: {
    defaultDataLakeStorage: {
      resourceId: storageAccounts_name_resource_dev.id
      createManagedPrivateEndpoint: true
      accountUrl: 'https://${workspaces_dev}ls.dfs.core.windows.net'
      filesystem: '${workspaces_dev}fs'
    }
    encryption: {
    }
    managedVirtualNetwork: 'default'
    privateEndpointConnections: []
    managedVirtualNetworkSettings: {
      preventDataExfiltration: false
      allowedAadTenantIdsForLinking: []
    }
    publicNetworkAccess: 'Enabled'
    azureADOnlyAuthentication: false
    trustedServiceBypassEnabled: true
  }
}

resource workspaces_zeal_name_Default_dev 'Microsoft.Synapse/workspaces/auditingSettings@2021-06-01' = {
  parent: workspaces_name_resource_dev
  name: 'Default'
  properties: {
    retentionDays: 0
    auditActionsAndGroups: []
    isStorageSecondaryKeyInUse: false
    isAzureMonitorTargetEnabled: false
    state: 'Disabled'
    storageAccountSubscriptionId: '00000000-0000-0000-0000-000000000000'
  }
}

resource Microsoft_Synapse_workspaces_azureADOnlyAuthentications_workspaces_name_default_dev 'Microsoft.Synapse/workspaces/azureADOnlyAuthentications@2021-06-01' = {
  parent: workspaces_name_resource_dev
  name: 'default'
  properties: {
    azureADOnlyAuthentication: false
  }
}

resource Microsoft_Synapse_workspaces_dedicatedSQLminimalTlsSettings_workspaces_name_default_dev 'Microsoft.Synapse/workspaces/dedicatedSQLminimalTlsSettings@2021-06-01' = {
  parent: workspaces_name_resource_dev
  name: 'default'
  properties: {
    minimalTlsVersion: '1.2'
  }
}

resource Microsoft_Synapse_workspaces_extendedAuditingSettings_workspaces_name_Default_dev 'Microsoft.Synapse/workspaces/extendedAuditingSettings@2021-06-01' = {
  parent: workspaces_name_resource_dev
  name: 'Default'
  properties: {
    retentionDays: 0
    auditActionsAndGroups: []
    isStorageSecondaryKeyInUse: false
    isAzureMonitorTargetEnabled: false
    state: 'Disabled'
    storageAccountSubscriptionId: '00000000-0000-0000-0000-000000000000'
  }
}

resource workspaces_zeal_name_AutoResolveIntegrationRuntime_dev 'Microsoft.Synapse/workspaces/integrationruntimes@2021-06-01' = {
  parent: workspaces_name_resource_dev
  name: 'AutoResolveIntegrationRuntime'
  properties: {
    type: 'Managed'
    typeProperties: {
      computeProperties: {
        location: 'AutoResolve'
      }
    }
  }
}

resource Microsoft_Synapse_workspaces_securityAlertPolicies_workspaces_name_Default_dev 'Microsoft.Synapse/workspaces/securityAlertPolicies@2021-06-01' = {
  parent: workspaces_name_resource_dev
  name: 'Default'
  properties: {
    state: 'Disabled'
    disabledAlerts: [
      ''
    ]
    emailAddresses: [
      ''
    ]
    emailAccountAdmins: false
    retentionDays: 0
  }
}




//本番用環境

resource storageAccounts_name_resource_pro 'Microsoft.Storage/storageAccounts@2021-09-01' = {
  name: storageAccounts_pro
  location: location
  sku: {
    name: 'Standard_RAGRS'
  }
  kind: 'StorageV2'
  properties: {
    minimumTlsVersion: 'TLS1_2'
    allowBlobPublicAccess: true
    isHnsEnabled: true
    networkAcls: {
      bypass: 'AzureServices'
      virtualNetworkRules: []
      ipRules: []
      defaultAction: 'Allow'
    }
    supportsHttpsTrafficOnly: true
    encryption: {
      services: {
        file: {
          keyType: 'Account'
          enabled: true
        }
        blob: {
          keyType: 'Account'
          enabled: true
        }
      }
      keySource: 'Microsoft.Storage'
    }
    accessTier: 'Hot'
  }
}

resource storageAccounts_name_default_pro 'Microsoft.Storage/storageAccounts/blobServices@2021-09-01' = {
  parent: storageAccounts_name_resource_pro
  name: 'default'
  properties: {
    deleteRetentionPolicy: {
      allowPermanentDelete: false
      enabled: false
    }
  }
}



resource storageAccounts_name_default_zealfs_pro 'Microsoft.Storage/storageAccounts/blobServices/containers@2021-09-01' = {
  parent: storageAccounts_name_default_pro
  name: 'datafs'
}



resource workspaces_name_resource_pro 'Microsoft.Synapse/workspaces@2021-06-01' = {
  name: workspaces_pro
  location: location
  identity: {
    type: 'SystemAssigned'
  }
  properties: {
    defaultDataLakeStorage: {
      resourceId: storageAccounts_name_resource_pro.id
      createManagedPrivateEndpoint: true
      accountUrl: 'https://${workspaces_pro}ls.dfs.core.windows.net'
      filesystem: '${workspaces_pro}fs'
    }
    encryption: {
    }
    managedVirtualNetwork: 'default'
    privateEndpointConnections: []
    managedVirtualNetworkSettings: {
      preventDataExfiltration: false
      allowedAadTenantIdsForLinking: []
    }
    publicNetworkAccess: 'Enabled'
    azureADOnlyAuthentication: false
    trustedServiceBypassEnabled: true
  }
}

resource workspaces_zeal_name_Default_pro 'Microsoft.Synapse/workspaces/auditingSettings@2021-06-01' = {
  parent: workspaces_name_resource_pro
  name: 'Default'
  properties: {
    retentionDays: 0
    auditActionsAndGroups: []
    isStorageSecondaryKeyInUse: false
    isAzureMonitorTargetEnabled: false
    state: 'Disabled'
    storageAccountSubscriptionId: '00000000-0000-0000-0000-000000000000'
  }
}

resource Microsoft_Synapse_workspaces_azureADOnlyAuthentications_workspaces_name_default_pro 'Microsoft.Synapse/workspaces/azureADOnlyAuthentications@2021-06-01' = {
  parent: workspaces_name_resource_pro
  name: 'default'
  properties: {
    azureADOnlyAuthentication: false
  }
}

resource Microsoft_Synapse_workspaces_dedicatedSQLminimalTlsSettings_workspaces_name_default_pro 'Microsoft.Synapse/workspaces/dedicatedSQLminimalTlsSettings@2021-06-01' = {
  parent: workspaces_name_resource_pro
  name: 'default'
  properties: {
    minimalTlsVersion: '1.2'
  }
}

resource Microsoft_Synapse_workspaces_extendedAuditingSettings_workspaces_name_Default_pro 'Microsoft.Synapse/workspaces/extendedAuditingSettings@2021-06-01' = {
  parent: workspaces_name_resource_pro
  name: 'Default'
  properties: {
    retentionDays: 0
    auditActionsAndGroups: []
    isStorageSecondaryKeyInUse: false
    isAzureMonitorTargetEnabled: false
    state: 'Disabled'
    storageAccountSubscriptionId: '00000000-0000-0000-0000-000000000000'
  }
}

resource workspaces_zeal_name_AutoResolveIntegrationRuntime_pro 'Microsoft.Synapse/workspaces/integrationruntimes@2021-06-01' = {
  parent: workspaces_name_resource_pro
  name: 'AutoResolveIntegrationRuntime'
  properties: {
    type: 'Managed'
    typeProperties: {
      computeProperties: {
        location: 'AutoResolve'
      }
    }
  }
}

resource Microsoft_Synapse_workspaces_securityAlertPolicies_workspaces_name_Default_pro 'Microsoft.Synapse/workspaces/securityAlertPolicies@2021-06-01' = {
  parent: workspaces_name_resource_pro
  name: 'Default'
  properties: {
    state: 'Disabled'
    disabledAlerts: [
      ''
    ]
    emailAddresses: [
      ''
    ]
    emailAccountAdmins: false
    retentionDays: 0
  }
}

```


`az login`した後に

`az deployment group create --resource-group デプロイリソースグループ --template-file Synapse.bicepのファイルパス`

を実行します。

リソースの展開を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/bad351c2-61d7-7d47-6247-bac3286d9535.png)



#### Synapse リポジトリ設定

作成したAzure DevOpsのReposとSynapseを紐づける設定を行います。
まず開発環境Synapseのファイアウォールに自身のIPを追加。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/5d00b81d-5b5c-1cc5-bca5-9131f1dc56a0.png)


開発環境のSynapseにログインし一番左の「工具箱アイコン」から「Git configuration」「構成」を選択。


![スクリーンショット 2023-03-04 164416.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/6cfe46d9-65f9-74c5-ba2a-c494ad0f3e18.jpeg)

![スクリーンショット 2023-03-04 164523.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/11b4287e-cfe6-0257-8216-02067278eb82.jpeg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/dabb1b8f-7a65-98f0-0159-c979c1c83299.png)

![スクリーンショット 2023-03-04 164754.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/0fdba637-063d-ba1b-2cfe-79186b7a57f0.jpeg)

以下の図を参考に値を入力していきます。
コラボレーションブランチはSynapseの各jsonリソースが格納されている場所。
発行ブランチは「workspace_publish」固定になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/9f637298-8f57-bb3e-936a-ed317bd4d2d9.png)




![スクリーンショット 2023-03-04 172450.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/37f4b525-416a-9e28-293c-55aebdd74385.jpeg)

こちらで設定完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/6ae5340f-c9ac-c485-33f5-fe39a21464fc.png)


リポジトリのブランチと紐づけることで、現在のSynapseのリソースがそれぞれjson形式で保存されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/0ab4c79d-9140-331b-0016-4227c8784527.png)


試しにtestを出力するNotebookを新規に作成します。
そして「すべてコミット」を選択します。

![スクリーンショット 2023-03-04 172637.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/18a6e0d8-cab1-8264-ad8a-c8a14bf0de4e.jpeg)

![スクリーンショット 2023-03-04 172705.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/07a04ac5-334b-60cf-1c89-e9d43af8b1ce.jpeg)

![スクリーンショット 2023-03-04 172722.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/96d13566-db3d-b096-3060-6b44ee7acf75.jpeg)

![スクリーンショット 2023-03-04 172802.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/82989d68-8f96-efd2-7a2f-6be94449a20a.jpeg)


これで新規に作成したNotebookが開発環境に紐づくリポジトリ内に保存されていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/b839055c-65c9-f77e-24a5-1666ce24cf70.png)

次にSynapseの各リソースを二つのjsonファイルに出力を行います。
「発行」を選択します。
![スクリーンショット 2023-03-04 172637.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/18a6e0d8-cab1-8264-ad8a-c8a14bf0de4e.jpeg)

発行完了後は「workspace_publish」というブランチが自動的に作成され、Synapseのリソースとパラメータが記載されたjsonファイルが保存されます。

![スクリーンショット 2023-03-04 172833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/40887cb8-dca7-0955-3fd5-38231cd3b430.jpeg)




#### Azure DevOps Artifacts設定

左欄から「Pipeline」「Release」を選択してリリースパイプラインの新規作成を行います。
「Add」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/4f980779-ab80-23a9-7251-b382ea5a9c64.png)


開発環境のSynapseから発行されたブランチを指定。

![スクリーンショット 2023-03-04 172935.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/303795c4-7cde-cfcc-2666-8934d7f0ad80.jpeg)

これでArtifactsの設定は完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/ea31eec8-fd7d-0c06-1700-20e3d61d0b54.png)

#### Azure DevOps Stage内のタスク設定

「1job, 0 task」の部分を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/ea31eec8-fd7d-0c06-1700-20e3d61d0b54.png)

「＋」を選択し、検索欄に「Synapse」を入力。
「Synapse workspace deployment」の「Add」を選択。

![スクリーンショット 2023-03-04 173023.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/c01768a2-4cec-d11b-c63d-1ce8ce50a296.jpeg)

下記のようにタスクが追加されるので下記のパラメータを入力していきます。

##### Template
synリポジトリのworkspace_bulishブランチ内のTemplateForWorkspace.jsonを選択。

##### Template paramaters
synリポジトリのworkspace_bulishブランチ内のTemplateParametersForWorkspace.jsonを選択。

##### Synapse workspace connection type
先程作成したサービスコネクションを選択。

##### Synapse workspace resource group
Synapse本番環境が配置されているリソースグループを選択。

##### Synapse workspace name
Synapse本番環境のワークスペース名を入力。

![スクリーンショット 2023-03-04 173057.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/4b252ea9-e30e-22f4-9a31-ad9c1fe10746.jpeg)

![スクリーンショット 2023-03-04 173124.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/54859e78-b908-37c3-30ce-4969712ae2cf.jpeg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/f80bfe9b-5157-6690-a530-e566710d289a.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/4cac2d20-728f-d74b-e099-984717c1706d.png)



#### AzureDevOpsサーバー インストール
DevOpsの実行環境になる仮想VMを構築します。
またVMのパブリックIPアドレスが固定になるため、本番環境Synapseのファイアウォールも設定できるようになります。

ホームから「Virtual Machines」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/e5d76310-8e84-2fb2-1e0a-c7af6dbae15d.png)

「作成」、「Azure 仮想マシン」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/82958406-732a-7e22-b11e-b378c88c22ed.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/8e00801f-fae9-fa12-3910-bbec4657dd73.png)

リソースグループと仮想マシン名を入力し、他はデフォルトの値で作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/6728b1bf-4d23-2334-6845-5f950265f14d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/d51d9825-a670-65bd-2788-0f9df73c8d07.png)

「作成」を選択し、「秘密キーのダウンロードとリソースの作成」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/1cea98f2-1458-f22d-22f8-b394133c9cd6.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/a4a998ba-d676-cee4-2061-594836c46326.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/c9c8deb7-f743-99ff-24d3-c91d9846dadc.png)

デプロイ完了後、最左欄にある「接続」をクリック。
ネイティブSSHの「選択」をクリックし「構成」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/5be3794f-f04d-9e8a-35f4-7c4d2a7a4388.png)


下図のコマンドをPowerShellで実行。
`ssh -i 暗号鍵ファイルのパス azureuser@パブリックIP`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/ced7fdf1-4ffd-fb3c-b46c-e37e6e1d764b.png)


実行するとLinuxにアクセス出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/cc4a79de-7ead-4b42-47cb-6a4bcb0fd1dd.png)


ここからAzureDevOpsに戻り「Project Settings」から「Agent pools」、「Add pool」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/140746cb-2543-92d1-e1af-e375e86304bc.png)


上のタブをLinuxにし、Download the agent の下にあるURLをコピーするボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/cdfd11e7-43be-51be-159d-96be53c9c090.png)

下記コマンドをLinuxで実行し、設定ファイルのダウンロードを行います。
`wget コピーしたURL`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/6735aca5-9ab7-3de8-d895-13a23a658486.png)

次に
`tar zxvf ダウンロードしたファイル名`
を実行して圧縮ファイルを解凍します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/bc322d35-0038-d616-cefa-0c9dce55369e.png)

解凍後は以下のファイルが配置されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/bdcb2ccb-2c41-5961-aa4c-e1662a7910d0.png)

コマンド`./config.sh`を実行し、以下のURLを参考にAzureDevOps側のPATを設定して値を入力していきます。

https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/personal-access-token-agent-registration?view=azure-devops

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/9b497b09-4a29-6e79-6c93-c8ffe05a589e.png)


コマンド`./run.sh`を実行しAzure DevOpsサーバーを起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/bf276815-403d-7112-afb2-9502fdc24cba.png)

起動できるとAzure DevOpsの画面でエージェントが実行されていることを確認出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/38c86381-8cdc-26bc-9c13-18a498145042.png)


#### 本番環境Synapse 権限設定

Linuxの仮想VMのパブリックIPを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/c80d43ff-e2fd-6d87-d90f-0dcce7685ec3.png)


確認後、自身のIPとパブリックIPをファイアウォールに設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/43281a44-a695-4492-c211-51776d338354.png)


本番環境のSynapseにログインし一番左の「工具箱アイコン」から「Acess control」を選択。

![スクリーンショット 2023-03-04 173911.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/85be3bb5-909c-0964-176c-23206e1a6031.jpeg)

ここで先程作成したサービスプリンシパルの表示名を確認します。
「Manage Service Principal」を選択。
![スクリーンショット 2023-03-04 173429.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/6a7d37ab-59bb-fdce-1527-3da5a0c3098a.jpeg)

下記のように表示名が出るので、コピーしてSynapse権限追加時の検索欄に貼り付けて追加します。

![スクリーンショット 2023-03-04 173452.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/39956543-7736-2ab2-0e17-6e2bcafe4064.jpeg)

![スクリーンショット 2023-03-04 174048.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/8e822988-b3c6-de67-b764-cabb31820c0f.jpeg)

![スクリーンショット 2023-03-04 174104.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/a4cc81a8-d9e3-69d8-c97a-a42778f07647.jpeg)

![スクリーンショット 2023-03-04 174120.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/51076bbb-bbde-0a8d-34d3-dcfc015a92c1.jpeg)

#### AzureDevOps リリースパイプライン実行

本番環境でNotebookが何も作成されていないことを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/49159ade-b7aa-2274-7c59-0384efb355f8.png)

Azure DevOpsの右上の「Create release」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/bac50e74-f74e-3aee-38a4-203a625b19cf.png)


「Create」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/180768fb-a50c-86cf-98f9-ecf59f7a51d5.png)

実行ログ内でNotebookがデプロイされていることが確認出来ます。
この部分でリソースに不正がないか自動でチェックされ、不整合など発見されるとエラーが発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/cbae78e2-6fb6-2dd7-c974-04d4f35dd081.png)


実行が完了しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/89b0dd1c-ec47-a384-6063-35477ec89733.png)


本番環境Synapseを確認すると開発環境と同じNotebookが自動的に反映されてることが確認出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2752288/8891b5e8-c2db-4906-a198-534db4ef8bc0.png)


こちらで内容は以上となります。
見て下さりありがとうございました。