【Azure Synapse Analytics】Azure Automation で  SQL poolの一時停止と再開を自動化する

# はじめに

Azure Synapse Analytics の SQL pool は Azure SQL DataWarehouse の後継となる DWH サービスです。Azure SQL DataWarehouse と同様、未使用時はコンピューティングを一時停止させておくことで、課金を抑えることができます。

コンピューティングの一時停止および再開は Azure Portal や Synapse Studio といった GUI からの操作に加え Azure CLI や PowerShell でも実施可能ですので、これらを活用することで処理の自動化も可能です。そこで今回は、Azure Automation を使った PowerShell による SQL pool の一時停止/起動のスケジューリングを試してみたいと思います。

# PowerShell コマンドレット

SQL pool の操作には **Update-AzSynapseSqlPool** コマンドレットを使用します。

[Update-AzSynapseSqlPool](https://docs.microsoft.com/ja-jp/powershell/module/az.synapse/update-azsynapsesqlpool?view=azps-4.5.0)

構文は以下の通りで、一時停止では **-Suspend** 、再開では **-Resume** を指定します。-WorkspaceName は対象となる Synapse Workspace、-Name は SQL pool のリソース名をそれぞれ指定します。

```PowerShell
#一時停止
Update-AzSynapseSqlPool -WorkspaceName $WorkspaceName -Name $Name -Suspend
#再開
Update-AzSynapseSqlPool -WorkspaceName $WorkspaceName -Name $Name -Resume
```

実行環境によっては Az.Synapse モジュールが無いかもしれませんので、その場合は事前にインストール作業を実施してください。以下は、Install-Module コマンドレットを使用して PowerShell Gallery からインストールする例です。

```PowerShell
Install-Module -Name Az.Synapse
```

Azure Automation の場合は、モジュールギャラリーからインポートします。詳細な手順は後述します。

# Azure Automation アカウントの作成と使用準備

Azure Automation アカウントの作成自体は Azure Portal からすぐにでき特に悩む点はありませんが、SQL pool のリソースを操作できるようにするために必要な準備がいくつかあります。今回実施したのは以下の 3 点です。

## 1. Az モジュールのインポート

今回の作業に必要な、 **Az.Accounts** 、 **Az.Automation** 、 **Az.Synapse** の 3 つをモジュールギャラリーからインポートしておきます。以下は、Az.Synapse をインポートする場合の画面イメージです。その他のモジュールについても同様の手順を実施します。
![20200811_automation_sqlpool_01_modulegarally.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/ba6d7b0f-9ebd-c31a-2c27-0d6176604a07.jpeg)
![20200811_automation_sqlpool_02_modulegarally.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/1b96cf9a-0176-70a2-1ac1-a8f28ca852d6.jpeg)

なお、依存関係の問題があるため、3 つのモジュールの中では Az.Accounts を最初にインポートする必要があります。

## 2. 変数の定義

Update-AzSynapseSqlPool コマンドレットの引数として必要な-WorkspaceName と-Name の値を定義しておき、Runbook の PowerShell スクリプトから呼び出せるようにしておきます。
![20200811_automation_sqlpool_03_variable.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/a72dbf29-a2b0-9c4b-f5d9-74985d47fbdd.jpeg)

## 3. 接続コンテキストの作成

Automation アカウントで Azure リソースにアクセスするための接続コンテキストを作成します。後述の通り、今回は PowerShell スクリプト内に直接記述しました。

# Runbook の作成と設定

ここからようやく本題の SQL pool の一時停止/再開用スクリプトの作成とスケジューリング設定になります。一時停止用と再開用に Runbook を 2 つ作成し、一時停止用は毎日 17 時、再開用は毎日 9 時に実行されるようそれぞれスケジューリングしてみます。

「Runbook」で「Runbook の作成」をクリック。「Runbook の種類」で「PowerShell」を選択し作成。
![20200811_automation_sqlpool_04_runbook.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/81557679-859d-5c88-190e-467cb88799f3.jpeg)

作成した Runbook で「編集」をクリックし、以下スクリプトを記述。
![20200811_automation_sqlpool_05_runbook.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/1d0b2a54-f07c-872e-aa02-1cde5cad8831.jpeg)

```PowerShell
$connectionName = "AzureRunAsConnection"

Disable-AzContextAutosave –Scope Process

$conn = Get-AutomationConnection -Name $connectionName
Connect-AzAccount -ServicePrincipal -Tenant $conn.TenantID `
-ApplicationId $conn.ApplicationID -CertificateThumbprint $conn.CertificateThumbprint

$AzureContext = Select-AzSubscription -SubscriptionId $conn.SubscriptionID

$WorkspaceName = Get-AutomationVariable -Name 'WorkspaceName'
$Name = Get-AutomationVariable -Name 'Name'
Update-AzSynapseSqlPool -WorkspaceName $WorkspaceName -Name $Name -Resume
```

前半は接続コンテキストの設定文です。コードについては、以下の記事を参考にさせていただきました。

[Az モジュールを使った Azure Automation Runbook の記述方法](https://qiita.com/sakamichihassin/items/736f07c53f86f76b1263)

また、先ほど定義した変数を Get-AutomationVariable で呼び出し、Update-AzSynapseSqlPool コマンドレットに渡しています。

スクリプトの記述が終わったら、「保存」「公開」を順にクリックし Runbook を発行。発行後に、スケジュール設定が可能になります。
![20200811_automation_sqlpool_05_01_runbook.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/59d0dbb0-86fa-6f97-0914-8347c6a01882.jpeg)



前の画面に戻り「スケジュールへのリンク」をクリックし、スケジュールを設定。一時停止は毎日 17 時、再開は毎日 9 時に定期実行されるよう設定します。
![20200811_automation_sqlpool_06_runbook.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/86d96082-2744-a4f0-5d95-b72cc100571a.jpeg)
![20200811_automation_sqlpool_07_runbook.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/53a4fac1-842f-7c8b-3585-fdc06dc92378.jpeg)


Runbook が正しくスケジュールされていることが確認できれば、OK です。上記手順を、一時停止用と再開用の Runbook でそれぞれ繰り返します。
![20200811_automation_sqlpool_08_runbook.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/29cf8974-1416-1d44-b8e4-c0eb11bd64d2.jpeg)

# 動作確認

設定したスケジュールどおりに SQL pool が一時停止と再開されていることが確認できます。
![20200811_automation_sqlpool_09_result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/ffff5452-3632-8de5-cada-640a7e512cdf.jpeg)
![20200811_automation_sqlpool_10_result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685288/b99474e8-2527-cf50-feec-5cd82d7df701.jpeg)

# まとめ

Azure でリソースをプログラマブルに操作する手段としては大きく次のものがあります。Azure Synapse Analytics においてもこれは変わりありません。

- PowerShell
- Azure CLI
- Azure SDK

また、作成したプログラムをスケジューリング、実行する環境としては以下のものがあります。

- Azure Automation
- Azure Functions
- Azure Logic Apps
- Azure Batch
- Azure Synapse Analytics の Orchestrate

今回は Azure Automation と PowerShell を使いましたが、その他の技術もそれぞれに特徴や制約がありますので、それらを理解した上で業務要件やご自身のスキルセットに合わせて最適なアプローチを検討なさるとよろしいかと思います。