NOBTAの気ままにITブログ

Azure全般 / SQL Serverに関する情報を発信していきます。

統合サービス環境 (ISE) + Logic Apps を使用し、プライベート リンク経由で Azure SQL Database の自動スケールアップを実現する方法について


スポンサーリンク

前回、Logic Apps を使用し、Azure SQL Database の CPU使用率に応じて、自動スケールアップ (仮想コア数を増加) する方法についてまとめてみました。 

 

なお、セキュリティ要件によっては、Logic Apps から Azure SQL Database への接続をプライベート通信に限定し、パブリック ネットワーク アクセスからAzure SQL Database への接続を完全に遮断しなければならない場合もあるかと思います。

今回、上記のセキュリティ要件を満たす方法として、統合サービス環境 (ISE) + Logic Apps を使用し、プライベート リンク経由で Azure SQL Database に接続し、自動スケールアップを実現する方法についてまとめてみようと思います。

 

 

 

プライベート リンク作成

1) Azure ポータルに接続し、「Private Link」を選択します。  

f:id:nobtak:20210225173018p:plain

 

2) 「プライベート エンド ポイント」- 「+ 追加」を選択します。   

f:id:nobtak:20210225173352p:plain

 

3) インスタンスの証明 : 「名前」欄にインスタンス名を入力後、「地域」欄でリージョンを選択後、「次: リソース」を選択します。     
f:id:nobtak:20200614000131p:plain 

 

4) 「リソースの種類」欄に「Microsoft.Sql/servers」、「リソース」欄に「Azure SQL Server名」、「対象サブリソース」欄に「sqlServer」を選択後、「次: 構成」を選択します。 

f:id:nobtak:20200614000819p:plain

 

5) 「仮想ネットワーク」欄に「プライベート エンドポイントにリンクさせる仮想ネットワーク」の選択、「サブネット」欄に「該当のサブネット」の選択、「プライベートDNSゾーンと統合」欄に「はい」を選択し、プライベートDNSゾーンを選択 (既存のプライベートDNSゾーンが存在しない場合は新規作成) 後、「確認および作成」を選択し、プライベート エンド ポイントを作成します。

f:id:nobtak:20200614001813p:plain

 

6) 「プライベート エンド ポイント」-「接続の状態」が「承認済み」になっていることを確認します。

f:id:nobtak:20210225174257p:plain

 

パブリック ネットワーク アクセスからAzure SQL Database への接続拒否

※ 本設定後、Azure SQL Database への接続は、プライベート リンク経由の接続のみに制限されます。

 

1) Azure ポータル から「SQL Server」を選択し、外部からのアクセスを拒絶したい Azure SQL Database サーバーを選択します。

2) セキュリティ : 「ファイアウォールと仮想ネットワーク」-「パブリック ネットワーク アクセスの拒否」:「はい」に変更し、「保存」を選択します。

f:id:nobtak:20210226005504p:plain

 

プライベート リンク経由による Azure SQL Database への接続確認

プライベート リンクに紐づく仮想ネットワーク内にデプロイされた Azure 仮想マシン上で SQL Server Management Studio (SSMS) を起動し、プライベート リンク 経由で Azure SQL Database への接続確認を実施します。

 

1) SQL Server がインストールされた Azure 仮想マシンにログインします。

2) コマンド プロンプトを起動し、「nslookup <Azure SQL Server名>.database.windows.net」 コマンドを実行します。

f:id:nobtak:20200614013012p:plain 

 ※ 本例の場合、プライベート DNS ゾーンに登録された「sqlje***.database.windows.net」 のアリアス  「sqlje***.privatelink.database.windows.net」(10.1.0.4) で名前解決されていることが確認できます。

 

3) SQL Server Management Studio (以下 SSMS) を起動し、管理者権限(sysadmin)が付与されたログインで、2) で確認した「sqlje***.privatelink.database.windows.net」で接続できることを確認します。

f:id:nobtak:20200614014322p:plain 

 

統合サービス環境 (ISE) 作成

1) Azure ポータルに接続し、「統合サービス環境」を選択します。   

f:id:nobtak:20210225215839p:plain

 

2) 「+ 追加」を選択します。   

f:id:nobtak:20210225215930p:plain

 

3)  必要項目を入力後、「確認および作成」を選択し、統合サービス環境を作成します。   

※ 統合サービス環境のデプロイ完了までに、 2時間以上の時間を要する場合があります。

f:id:nobtak:20210225220234p:plain

場所 : デプロイするリージョンを指定

SKU : 「開発者 (SLA なし)

※ 今回は、テスト目的で統合開発環境をデプロイするため、「開発者 (SLA)」を選択していますが、本番環境では SLA がある「Premium」を選択します。

アクセス エンドポイント : 内部

※ 今回は、統合開発環境 (ISE) への外部アクセスを除外したいため、「外部」ではなく「内部」を選択します。

仮想ネットワーク :  統合開発環境 (ISE) に紐づける仮想ネットワーク および サブネットを選択。

※ 使用されていないサブネットを 4つ 用意する必要があります。

 

統合サービス環境 (ISE) 上にAzure SQL Database 自動スケールアップ用 ロジック アプリ (Logic Apps) 作成

1) Azure ポータル - 「ロジック アプリ」を選択します。 

f:id:nobtak:20210221015127p:plain

  

2) 「+ 追加」-「Consumption」を選択します。

f:id:nobtak:20210221020236p:plain

 

3) 「ロジック アプリ名」,「リージョン」に任意の値を入力後、「統合サービス環境との関連付け」にチェックし、デプロイした統合サービス環境を選択後、「確認および作成」を選択し、ロジック アプリを作成します。  

f:id:nobtak:20210225222913p:plain

 

4) 3)で作成したロジック アプリ - 開発ツール - 「ロジック アプリ デザイナー」を選択します。 

f:id:nobtak:20210221021204p:plain

 

5) スケジュールで定期的にロジック アプリを実行させるため、トリガーに「繰り返し」を選択します。

f:id:nobtak:20210221021511p:plain

 

6) 「間隔」,「頻度」(本例では 5分間隔に設定) および、必要に応じて「タイムゾーン」,「開始時刻」を入力後、「+ 新しいステップ」を選択します。

f:id:nobtak:20210225231213p:plain

 

7) 「SQL Server」-「SQL クエリを実行する (V2) ISE」を選択します。 

f:id:nobtak:20210225231503p:plain

 

8) 「接続名」,「認証の種類」,「SQL サーバー名」,「SQL データベース名」,「ユーザー名」,「パスワード」を入力後、「作成」を選択します。 

f:id:nobtak:20210225231921p:plain

  • 認証の種類 : 「Azure AD Integrated」,「SQL Server 認証」,「Windows 認証」の何れかから選択。
  • SQL サーバー名:Azure SQL Database サーバー名を指定。
  • SQL データベース名 : プライベート リンク経由で接続用の接続文字列「sqlje***.privatelink.database.windows.net」を指定。
  • ユーザー名 :  サーバー レベル プリンシパル ログイン (プロビジョニング プロセスで作成されるログイン), master の dbmanager データベース ロール、該当データベースの db_owerner データベース ロールが付与されたログインを指定。


9) 「Query」欄に 「Azure SQL Database 自動スケールアップ用サンプル クエリ」をペースト後、「保存」を選択します。 

f:id:nobtak:20210225232722p:plain

 

 [サンプル クエリ]

1.「sys.dm_db_resource_stats」の「avg_cpu_percent」列の値を過去30分間分取得後、CPU使用率(%)の平均値を取得。

2. CPU使用率(%)の平均値が 98 より大きい場合、ALTER DATABASE コマンドにより、該当データベースの仮想コア数を変更。

 

※ サンプルクエリでは、Azure SQL Database (仮想コア ベース : 汎用目的) のデータベースを使用していることを前提に作成しています。

※ 仮想コア 2個 (GP_Gen5_2) から 4個 (GP_Gen5_4)、4個 (GP_Gen5_4) から 6個 (GP_Gen5_6)、6個 (GP_Gen5_6) から 8個 (GP_Gen5_8) へのスケール アップのみを実装しており、必要に応じてサンプルクエリを修正します。

 

「Azure SQL Database 自動スケールアップ用サンプル クエリ」 : スケールアップ対象のデータベースの過去30分間のCPU使用率(%)が閾値を超えた場合、 仮想コア数を増やす。

DECLARE @dbslo TABLE (DBName nvarchar(50), Edition nvarchar(50), Service_Obj nvarchar(50));
DECLARE @Service_Obj nvarchar(50)
DECLARE @NextEdition nvarchar(50)
DECLARE @NextService_Obj nvarchar(50)
DECLARE @avgcpu int
DECLARE @DBNAME nvarchar(50)
DECLARE @QueryForAlter nvarchar(100)

SELECT @avgcpu = ROUND(AVG(avg_cpu_percent),0)
FROM sys.dm_db_resource_stats
WHERE end_time > dateadd(minute,-30,getdate())

IF @avgcpu > 98
   BEGIN
      INSERT INTO @dbslo
      SELECT db_name(), edition, service_objective from sys.database_service_objectives

      SELECT
         @DBNAME = DBName,
         @Service_Obj = Service_Obj,
         @NextEdition = Edition,
         @NextService_Obj =
            CASE
               WHEN Service_Obj = 'GP_Gen5_2' THEN 'GP_Gen5_4'
               WHEN Service_Obj = 'GP_Gen5_4' THEN 'GP_Gen5_6'
               WHEN Service_Obj = 'GP_Gen5_6' THEN 'GP_Gen5_8'
            ELSE
               Service_Obj
            END
      FROM @dbslo
      IF @Service_Obj <> @NextService_Obj
         BEGIN
            SET @QueryForAlter = N'alter database ' + @DBNAME + N' modify (edition = ''' + @NextEdition + N''', SERVICE_OBJECTIVE = ''' + @NextService_Obj + N''')'
            exec(@QueryForAlter)
         END
   END

 

10) 「実行」を選択し、正常に ロジック アプリが動作することを確認します。 

f:id:nobtak:20210225233118p:plain

 

Azure SQL Database 自動スケールアップ 動作確認方法

1) Azure ポータル - 「SQL データベース」を選択し、スケールアップ対象のデータベースの価格レベルが「汎用目的: Gen5、2 仮想コア」になっていることを確認します。

f:id:nobtak:20210221034559p:plain

 

2) SQL Server Management Studio (SSMS) から Azure SQL Database サーバーの該当データベースにログインします。

3) 「新しいクエリ」で以下のクエリを実行し、CPU負荷テスト用ストアドプロシージャ「sp_cpuload」を作成します。

CREATE PROCEDURE [dbo].[sp_cpuload]
AS                            
BEGIN
    SET NOCOUNT ON;
    DECLARE @iCnt bigint;

    WHILE (1=1)
    BEGIN
        SET @iCnt = (SELECT count(*) FROM sys.dm_exec_requests)
    END
END;
GO

 

4) 3) で作成した CPU負荷テスト用ストアドプロシージャ「sp_cpuload」を実行します。 

exec sp_cpuload

 

5) Azure ポータル - 「ロジック アプリ」 - 作成したロジック アプリ -「概要」を選択し、右ペインの「実行の履歴」を確認し、該当のロジック アプリが正常に動作したことを確認します。

f:id:nobtak:20210221034325p:plain

 

6) Azure ポータル - 「SQL データベース」を選択し、スケールアップ対象のデータベースの価格レベルが「汎用目的: Gen5、4 仮想コア」になっていることを確認します。

f:id:nobtak:20210221034749p:plain

※ 検証を実施する場合、一時的に ロジック アプリに登録した サンプル クエリ内容の変更 (CPU使用率の閾値など) 、および 「繰り返し」(Recurrence) の間隔を短くすることで、簡易に検証することが可能になります。

 

まとめ

今回、統合サービス環境 (ISE) + Logic Apps を使用し、プライベート リンク経由で Azure SQL Database に接続し、自動スケールアップを実現する方法についてまとめてみました。 本構成は パブリック ネットワーク からのアクセスを完全に遮断することが可能となりますが、統合サービス環境で SLA が定義されている SKU「Premium」を選択した場合、「¥840 / 時間 」とコストが掛かる点に注意が必要です。

 

f:id:nobtak:20210225233725p:plain

[引用]  価格 - Logic Apps | Microsoft Azure