【Azure】SQL Database の DTU を Azure Automation を 使ってオートスケールしてみた


こんにちは、システム開発部の長谷です。

現在、Azure で提供されている App Service とSQL Database を使用してWebシステムの開発を行っているのですが、運用を開始するにあたって、なるべくコストを削減させるためにオートスケールの実装を考えております。

ただ、App Service にはオートスケールの機能があるのですが、SQL Database にはそういった機能は付いておりません。

何か方法はないかと思い、色々と調べていたところ Azure Automation という機能を利用すれば SQL Database のオートスケールができるという記事をみつけました。

実際に検証をしたところ見事にオートスケールができたので、今回はそのやり方について紹介したいと思います。

前提

SQL Database には複数の購入モデル(DTU、仮想コアベース、サーバーレス)があるのですが、今回は DTU を使用します。

Azure Automation とは?

  • Azure Potal の機能の一つで、タスク(Azure Automation では Runbook という)を自動化することができる機能
  • 時間指定による定期的な実行(毎日0時等)が可能
  • Runbook は PowerShell、PowerShell ワークフロー、Python 2、DSC の言語で作成可能

実装イメージ

  • Azure Automation に powershell 形式 で SQL Database の スケーリング 処理 の Runbook を作成
  • 作成したRunbookをスケジュールに追加し、時間指定で自動的にRunbookが実行されるようにする

手順

Azure Automation アカウントを追加する

① Azure Portal にログインする

② Azure サービスから「Automation アカウント」を選択

③ Automation アカウントを追加するため「+追加」を選択

④ Automation アカウント情報を入力して作成

名前 任意の名称
サブスクリプション 使用しているサブスクリプションを選択
リソースグループ 使用しているリソースグループを選択
場所 サーバーのリージョン
Azure 実行アカウントの作成 「はい」を選択 ※1


※1) Azure 実行アカウントの作成は必ず「はい」にすること
⇒SQL Database を Runbook で操作するためには、 実行アカウントの承認が必要となる為
「いいえ」にすると SQL Database の操作 を Runbook から 実行できなくなる

作成すると Automation アカウントが、リストに表示される

追加した Automation アカウントに モジュールを追加する

Runbook(タスク)から SQL Database を操作するため、以下のモジュールを追加する

Az.Account すべてのAzure資格情報と共通構成を管理するモジュール
Az.Automation Azure Automation に関する情報を管理するモジュール
SqlServer 最新の SQL 機能をサポートする新しいコマンドレットが用意されているモジュール

⑤ モジュールは Automation アカウントごとに設定するため、作成したアカウントを選択する

⑥ 「モジュール ギャラリー」を選択する

共有リソース > モジュール ギャラリー

⑦ モジュールギャラリー画面から登録するモジュールをインストールする

ここでは Az.Account モジュールを登録(インストールする順番は関係ない)

⑧ Az.Accounts モジュール の詳細画面が表示されるので、「インポート」をクリックする

⑨ インポートの確認画面表示されるので「OK」をクリックする


Az.Accounts モジュールのインポートが開始される

インポートに成功すると、画面右上に「インポートに成功しました」とメッセージが表示される

⑩ 同様に、残りのモジュールのインポートを行う

Runbook(タスク)を作成する

⑪ 作成した Automation アカウントから「Runbook」を選択する

プロセス オートメーション > Runbook

⑫ Runbook を作成するため 「+ Runbook の作成」を選択

⑬ Runbook 情報を入力して作成

名前 任意の名称
Runbook の種類 PowerShell
説明 任意の説明文

作成した Runbook がリストに表示される

※AzureAutomationTutorial, AzureAutomationTutorialPython2, AzureAutomationTutorialScript は Automation アカウント 作成時にデフォルトで用意されているものなので今回は使用しない

Runbook にコードを記述する

作成した Runbook にオートスケールを実行する処理を記述
※ 言語は PowerShell を使用する

■ 大まかな実装の流れ
① Azure Automation の接続情報を取得
② 取得した Azure Automation の接続情報を使用して、Azure アカウントへの接続を行う
③ SQL Database のスペックを変更する
※ PowerShell で SQL Database の スペックを変更するには Azure アカウントへの接続が必須

⑭ 作成した Runbook を選択する

⑮ 「編集」を選択してコードエディタ を開く


※ここにコードを記述する

⑯ Azure Automation の接続情報を取得する処理を記述する

■ コード

# Azure Automation の接続情報を取得するコマンドを記述して、それを変数に代入する
$connection = Get-AutomationConnection -Name "{Automation アカウント接続名}"

■ コマンドの詳細

Get-AutomationConnection
Azure Automation の接続に関する情報を取得します。
オプション
-Name 情報を取得する Azure Account 名

⑰ 手順21 の Automation アカウント接続名 は 「接続」から確認ができる

共有リソース > 接続

⑱ 取得した Azure Automation の接続情報を使用して、Azure アカウントへの接続を行う

■ コード

# Azure アカウントの承認
Connect-AzAccount -Tenant $connection.TenantID `
-ApplicationId $connection.ApplicationID -CertificateThumbprint `
$connection.CertificateThumbprint

※ 式の途中で改行する場合は末尾に「`(グレイヴ・アクセント)」をつける

■ コマンドの詳細

Connect-AzAccount
Azure アカウントへの接続を行う
オプション
-Tenant Azure Automation の テナントID
-ApplicationId Azure Automation の アプリケーションID
-CertificateThumbprint Azure Automation の証明書情報

⑲ SQL Database のスペックを変更する

■ コード

# SQL Database の プランを S0(Standard DTU 10) に変更する
Set-AzSqlDatabase -ResourceGroupName "{リソースグループ名}" `													
-DatabaseName "{SQL Database 名}" -ServerName "{SQL Server 名}" `													
-Edition "Standard" -RequestedServiceObjectiveName "S0"

■ コマンドの詳細

Set-AzSqlDatabase
SQL Database のプロパティを設定する
オプション
-ResourceGroupName 使用しているリソースグループ
-DatabaseName 使用する SQL Database 名
-ServerName 使用する SQL Server 名
-Edition 変更したいプラン(Basic 又は Standard 又は Premium)
-RequestedServiceObjectiveName 変更したい DTU(例:S1、P2 等) を記述

完成コード

上記コードを合わせるとこうなります

# Azure Automation の接続情報を取得するコマンドを記述して、それを変数に代入する
$connection = Get-AutomationConnection -Name "{Automation アカウント接続名}"

# Azure アカウントの承認
Connect-AzAccount -Tenant $connection.TenantID `
-ApplicationId $connection.ApplicationID -CertificateThumbprint `
$connection.CertificateThumbprint

# SQL Database の プランを S0(Standard DTU 10) に変更する
Set-AzSqlDatabase -ResourceGroupName "{リソースグループ名}" `													
-DatabaseName "{SQL Database 名}" -ServerName "{SQL Server 名}" `													
-Edition "Standard" -RequestedServiceObjectiveName "S0"

作成した Runbook の動作確認を行う

⑳ 作成した Runbook の動作確認を行うため、テスト ウィンドウを開く

コードエディタ 画面にある 「テスト ウィンドウ」を 選択

㉑ 「開始」を選択して テストを実行する

㉒ 正常にテストが完了すると、ストリームが表示される


※ テストに失敗した場合は赤文字でエラーが表示される

対象の SQL Database の プランが変更されていることが確認できる

作成した Runbook をスケジュールに登録する

作成した Runbook を定期的に実行できるようにするため、スケジュール に登録する
※ Runbook をスケジュールに登録するためには Runbook を発行して、運用環境で使用できるようにする必要がある

㉓ Runbookを 発行するため、「公開」をクリックし「はい」を選択する

Runbook の発行に成功すると、画面右上にメッセージが表示される

㉔ 次にスケジュールへの登録を行うため、「スケジュールへのリンク」をクリックする

㉕ スケジュール設定画面が表示されるので、新しくスケジュールを作成して登録を行う

スケジュール > + 新しいスケジュールを作成します
※スケジュールが既に用意されている場合は作成不要

㉖ スケジュールの時間設定情報を入力して、「作成」をクリック

名前 任意の名称
説明 任意の説明文
開始時 任意の開始日時を選択
タイムゾーン 任意のタイムゾーンを選択
繰り返し 「一度だけ」「定期的」のいずれかを選択
間隔 任意で実行間隔を選択(「繰り返し」を「定期的」を選択した場合のみ)
有効期限の設定 「はい」「いいえ」のいずれかを選択
有効期限 任意で有効期限の日時を選択(「有効期限の設定」を「はい」にした場合のみ)

㉗ 作成したスケジュールが選択された状態になるので、「OK」をクリック

スケジュールが正常に登録されると、青背景でメッセージが表示される

㉘ スケジュールが実行されると、ジョブリストに表示される

プロセス オートメーション > ジョブ

まとめ

以上の手順で SQL Database のオートスケールができるようになります。

ちなみに、スケールアウト/インを実現させるためには、同じような Runbook を2つ作ってあげて、プラン(-RequestedServiceObjectiveName)の部分を書き換えてあげるだけでできます。

ただ、時間指定での実行のみが可能であり、肝心の負荷状態を閾値としてオートスケールを実行させることっていうのができないのがちょっと難点です...
もしやり方をご存知な方がいらっしゃいましたら、是非教えていただけると嬉しいです!

また、今回は DTU を使用しましたが、他の購入モデルでも同じようなやり方で実現できると思いますので、ぜひ試してみてください。

以上となります。
今回もありがとうございました。


この記事をかいた人

About the author

長谷竜弥

入社4年目です。
システム部に所属しています。
ずっと大阪で勤務していましたが、2019年の11月から横浜開発室に異動になりました。
趣味は野球で休日は草野球をしていましたが、横浜に来てからはできておらず悶々と日々を過ごしております。