次の方法で共有


自動チューニングの電子メール通知

適用対象:Azure SQL DatabaseAzure SQL Managed Instance

Azure SQL Database のチューニング推奨情報は、Azure SQL Database の自動チューニングによって生成されます。 このソリューションは、データベースのワークロードを継続的に監視して分析し、個別のデータベースそれぞれについて、インデックスの作成や削除、クエリ実行プランの最適化に関するカスタマイズされたチューニング推奨情報を提供します。

Azure SQL Database 自動チューニングの推奨情報は、REST API 呼び出しで取得するか、T-SQLPowerShell のコマンドを使用して、Azure portal で確認できます。 この記事は、PowerShell スクリプトを使用して自動チューニングに関する推奨情報を取得する方法に基づいています。

注意

この記事では、Azure と対話するために推奨される PowerShell モジュールである Azure Az PowerShell モジュールを使用します。 Az PowerShell モジュールの使用を開始するには、「Azure PowerShell をインストールする」を参照してください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。

重要

PowerShell Azure Resource Manager (AzureRM) モジュールは、2024 年 2 月 29 日に非推奨になりました。 今後のすべての開発では、Az.Sql モジュールを使用する必要があります。 ユーザーは、引き続きサポートと更新を行うために、AzureRM から Az PowerShell モジュールに移行することをお勧めします。 AzureRM モジュールは維持またはサポートされなくなりました。 Az PowerShell モジュールと AzureRM モジュールのコマンドの引数は、ほぼ同じです。 互換性の詳細については、「新しい Az PowerShell モジュールの概要」を参照してください。

自動チューニング推奨情報の電子メール通知を自動化する

この後のソリューションにより、自動チューニング推奨情報の電子メール通知の送信を自動化します。 説明するソリューションには、チューニング レコメンデーション情報を取得するための PowerShell スクリプトの実行の自動化 (Azure Automation を使用) と、電子メール配信ジョブの自動化 (Microsoft Power Automate を使用) が含まれます。

Azure Automation アカウントを作成する

Azure Automation を使用するには、まず Automation アカウントを作成し、PowerShell スクリプトの実行に使用する Azure リソースに対して構成します。 Azure Automation とその機能の詳細については、「 Azure Automation の概要」を参照してください。

次の手順に従い、Azure Marketplace で Automation アプリを選択して構成する方法により、Azure Automation アカウントを作成します。

  1. Azure portal にサインインします。

  2. [リソース] メニュー で [+ リソースの作成 ] を選択します。

  3. Automation」を検索します。

  4. 検索結果で Automation アプリを選択します。

    Automation を検索している Azure portal のスクリーンショット。

  5. [Automation アカウントの作成] ウィンドウ内で、[ 作成] を選択します。

  6. PowerShell スクリプトの実行に使用するサブスクリプションとリソース グループを選択します。 オートメーションアカウントの名前を入力してください。

  7. [Advanced] \(詳細設定) を選択します。 システム割り当てにチェックが入っていることを確認し、システム割り当てマネージド ID (SAMI) が作成されて Azure リソースへの認証が可能になるようにします。

  8. [タグ] を選択します。 Azure タグの使用を検討します。 たとえば、リソースを作成したユーザーを識別する "Owner" または "CreatedBy" タグ、このリソースが運用や開発などの環境にあるかどうかを識別する "Environment" タグなどです。詳細については、「Azure リソースの名前付けおよびタグ付けの戦略を作成する」を参照してください。

  9. [確認して作成] を選択します。

  10. [作成] を選択して、Automation アカウントの 作成を完了します。

システム割り当てマネージド ID アカウントに Azure ロールを割り当てる

Automation アカウントでは、システム割り当てマネージド ID を使用して、Microsoft Entra ID で保護されている他のリソース (Azure SQL Database など) にアクセスするためのトークンを取得できます。 これらのトークンは、アプリケーションの特定のユーザーを表すものではありません。 代わりに、それらは、リソースにアクセスしているアプリケーションを表します。 たとえば、今回の場合、トークンは Automation アカウントを表します。

Azure Automation Runbook を作成する前に、最小限の特権の原則に従って、Automation アカウントに適切なレベルのアクセス許可を付与することが重要です。 システム割り当てマネージド ID を使用する場合は、 SQL DB 共同作成者 ロールと SQL Server 共同作成者 ロールを SAMI に追加するだけで、Azure SQL Database タスクを自動化できます。 ほとんどのシナリオで、オートメーションが特定のデータベースのみを対象とする場合は、リソース グループ レベルのスコープを使用します。 サブスクリプション全体で動作する必要がある場合は、サブスクリプション レベルのスコープを使用します。

次の例では、Azure PowerShell を使用して、現在のサブスクリプションの SQL DB 共同作成者 ロールをシステム割り当てマネージド ID アカウントに割り当てます。

$roleAssignmentParams = @{
     ObjectId = "<automation-Identity-object-id>"
     Scope = "/subscriptions/<subscription-id>"
     RoleDefinitionName = "SQL DB Contributor"
}

New-AzRoleAssignment @roleAssignmentParams

Azure portal 内からシステム割り当てマネージド ID にこれらのロールを追加するには、次の手順に従います。

  1. Azure portal にサインインします。
  2. 新しく作成した Azure Automation アカウントを見つけます。
  3. [アカウント設定] で、[ ID] を選択します。
  4. [アクセス許可] で、[ Azure ロールの割り当て ] ボックスを選択します。
  5. [ロールの割り当ての追加 (プレビュー)] を選択します。
  6. [スコープ] ドロップダウン リストで、ロールの割り当てが適用されるリソースのセット (サブスクリプション、リソース グループ、ロール、スコープ) を選択します。
  7. [ロール] ドロップダウン リストで、 SQL DB 共同作成者としてロールを選択します。
  8. 保存 を選択します。

SQL Server 共同作成者ロールを追加するには、[ロールの割り当ての追加] 手順の手順を繰り返します。

ヒント

Automation アプリを作成するときに入力したとおりに、Azure Automation アカウント名、サブスクリプション ID、リソースを正確に記録してください (コピーしてメモ帳に貼り付けるなど)。 この情報は後で必要になります。

同じように自動化を設定する Azure サブスクリプションが複数ある場合は、他のサブスクリプションについてもこのプロセスを繰り返す必要があります。

Azure Automation モジュールを更新する

自動チューニング推奨情報を取得する PowerShell スクリプトでは、Azure モジュール バージョン 4 以降が必要な Get-AzResource および Get-AzSqlDatabaseRecommendedAction コマンドが使用されます。

Azure Automation Runbook を作成する

次の手順では、チューニング推奨情報を取得する PowerShell スクリプトを配置する Runbook を Azure Automation に作成します。

次の手順に従って、新しい Azure Automation Runbook を作成します。

  1. 前の手順で作成した Azure Automation アカウントにアクセスします。
  2. Automation アカウント ウィンドウで、左側にある Runbook メニュー項目を選択して、PowerShell スクリプトを使用して新しい Azure Automation Runbook を作成します。 Automation Runbook の作成の詳細については、新しい Runbook の作成に関するページを参照してください。
  3. 新しい Runbook を追加するには、[ +Runbook の追加] メニュー オプションを選択し、[ 簡易作成 - 新しい Runbook の作成] を選択します。
  4. [Runbook] ウィンドウで、Runbook の名前を入力し (この例では AutomaticTuningEmailAutomation が使用されます)、 PowerShell として Runbook の種類を選択し、この Runbook の説明を記述して目的を説明します。
  5. [ 作成] を選択して、新しい Runbook の作成を完了します。

次の手順に従って、作成した Runbook 内に PowerShell スクリプトを読み込みます。

  1. [PowerShell Runbook の編集] ウィンドウで、メニュー ツリーで RUNBOOK を選択し、Runbook の名前が表示されるまでビューを展開します (この例では AutomaticTuningEmailAutomation)。 この Runbook を選択します。
  2. "PowerShell Runbook の編集" の最初の行 (番号 1 以降) に、次の PowerShell スクリプト コードをコピーして貼り付けます。 この PowerShell スクリプトは作業を開始できるように提供しています。 ニーズに合わせてスクリプトを変更してください。

提供された PowerShell スクリプトのヘッダーで、<SUBSCRIPTION_ID_WITH_DATABASES> を自分の Azure サブスクリプション ID で置き換える必要があります。 自分の Azure サブスクリプション ID を取得する方法については、「Getting your Azure Subscription GUID」(Azure サブスクリプション GUID の取得) をご覧ください。

複数のサブスクリプションがある場合は、スクリプトのヘッダーにある "$subscriptions" プロパティにコンマで区切って追加できます。

# PowerShell script to retrieve Azure SQL Database automatic tuning recommendations.
#
# Provided "as-is" with no implied warranties or support.
# The script is released to the public ___domain.
#
# Replace <SUBSCRIPTION_ID_WITH_DATABASES> in the header with your Azure subscription ID.
#
# Microsoft Azure SQL Database team, 2018-01-22.

# Set subscriptions : IMPORTANT – REPLACE <SUBSCRIPTION_ID_WITH_DATABASES> WITH YOUR SUBSCRIPTION ID
$subscriptions = ("<SUBSCRIPTION_ID_WITH_DATABASES>", "<SECOND_SUBSCRIPTION_ID_WITH_DATABASES>", "<THIRD_SUBSCRIPTION_ID_WITH_DATABASES>")

# Get credentials
$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Connect-AzAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint

# Define the resource types
$resourceTypes = ("Microsoft.Sql/servers/databases")
$advisors = ("CreateIndex", "DropIndex");
$results = @()

# Loop through all subscriptions
foreach ($subscriptionId in $subscriptions) {
    Select-AzSubscription -SubscriptionId $subscriptionId
    $rgs = Get-AzResourceGroup

    # Loop through all resource groups
    foreach ($rg in $rgs) {
        $rgname = $rg.ResourceGroupName;

        # Loop through all resource types
        foreach ($resourceType in $resourceTypes) {
            $resources = Get-AzResource -ResourceGroupName $rgname -ResourceType $resourceType

            # Loop through all databases
            # Extract resource groups, servers and databases
            foreach ($resource in $resources) {
                $resourceId = $resource.ResourceId
                if ($resourceId -match ".*RESOURCEGROUPS/(?<content>.*)/PROVIDERS.*") {
                    $ResourceGroupName = $matches['content']
                }
                else {
                    continue
                }
                if ($resourceId -match ".*SERVERS/(?<content>.*)/DATABASES.*") {
                    $ServerName = $matches['content']
                }
                else {
                    continue
                }
                if ($resourceId -match ".*/DATABASES/(?<content>.*)") {
                    $DatabaseName = $matches['content']
                }
                else {
                    continue
                }

                # Skip if master
                if ($DatabaseName -eq "master") {
                    continue
                }

                # Loop through all automatic tuning recommendation types
                foreach ($advisor in $advisors) {
                    $recs = Get-AzSqlDatabaseRecommendedAction -ResourceGroupName $ResourceGroupName -ServerName $ServerName  -DatabaseName $DatabaseName -AdvisorName $advisor
                    foreach ($r in $recs) {
                        if ($r.State.CurrentValue -eq "Active") {
                            $object = New-Object -TypeName PSObject
                            $object | Add-Member -Name 'SubscriptionId' -MemberType Noteproperty -Value $subscriptionId
                            $object | Add-Member -Name 'ResourceGroupName' -MemberType Noteproperty -Value $r.ResourceGroupName
                            $object | Add-Member -Name 'ServerName' -MemberType Noteproperty -Value $r.ServerName
                            $object | Add-Member -Name 'DatabaseName' -MemberType Noteproperty -Value $r.DatabaseName
                            $object | Add-Member -Name 'Script' -MemberType Noteproperty -Value $r.ImplementationDetails.Script
                            $results += $object
                        }
                    }
                }
            }
        }
    }
}

# Format and output results for the email
$table = $results | Format-List
Write-Output $table

[ 保存] を 選択してスクリプトを保存します。 スクリプトに満足したら、[ 発行 ] を選択してこのランブックを発行します。

Runbook のメイン ウィンドウで、[ 開始 ] を選択してスクリプトを テスト できます。 [ 出力] を選択して、実行されたスクリプトの結果を表示します。 この出力が電子メールの内容になります。

PowerShell スクリプトをニーズに合わせてカスタマイズして、内容を調整してください。

上記の手順では、自動チューニング推奨情報を取得する PowerShell スクリプトが Azure Automation に読み込まれます。 次の手順では、電子メール配信ジョブを自動化してスケジュール設定します。

Microsoft Power Automate で電子メール・ジョブを自動化する

ソリューションを完成させるには、最後の手順として、3 つのアクション (ジョブ) で構成される自動フローを Microsoft Power Automate で作成します。

  • Azure Automation - ジョブの作成 - PowerShell スクリプトを実行して、Azure Automation Runbook 内で自動チューニングの推奨事項を取得するために使用されます。
  • Azure Automation - ジョブ出力の取得 - 実行された PowerShell スクリプトから出力を取得するために使用されます。
  • Office 365 Outlook – メールの送信 – メール の送信に使用されます。 電子メールは、フロー作成者の職場または学校アカウントを使用して送信されます。

Microsoft Power Automate の機能について詳しくは、「Microsoft Power Automate を使ってみる」をご覧ください。

この手順の前提条件は、 Microsoft Power Automate アカウントにサインアップしてサインインすることです。 ソリューションにログインしたら、次の手順に従って新しいフローを設定します。

  1. [ マイ フロー ] メニュー項目にアクセスします。
  2. マイ フロー内で、ページの上部にある [+Create from blank]\(空から作成 \) リンクを選択します。
  3. 数百のコネクタとトリガーを検索するためのリンクを選択します
  4. 検索フィールドに「 繰り返し」と入力し、検索結果から [スケジュール - 繰り返 し] を選択して、電子メール配信ジョブを実行するようにスケジュールします。
  5. [繰り返し] ウィンドウの [頻度] フィールドで、このフロー (自動電子メールの送信) を実行するスケジュール頻度として、分、時、日、週などを選択します。

次の手順では、新しく作成された定期的なフローに 3 つのジョブ (作成、出力の取得、電子メールの送信) を追加します。 必要なジョブをフローに追加するには次の手順に従います。

  1. チューニング推奨情報を取得する PowerShell スクリプトを実行するアクションを作成します。

    1. [+新しいステップ] を選択し、[繰り返しフロー] ウィンドウ内でアクションを追加します。
    2. 検索フィールドに「 Automation 」と入力し、検索結果から [Azure Automation – ジョブの作成 ] を選択します。
    3. [ジョブの作成] ウィンドウで、ジョブのプロパティを構成します。 この構成では、以前に Automation アカウント ペイン記録した Azure サブスクリプション ID、リソース グループ、Automation アカウントの詳細が必要です。 このセクションで指定できるオプションについて詳しくは、Azure Automation でのジョブの作成に関する記事をご覧ください。
    4. [フローを保存] を選択します。
  2. 実行された PowerShell スクリプトから出力を取得するアクションを作成します。

    1. [+新しいステップ] を選択し、[繰り返しフロー] ウィンドウ内にアクションを追加する
    2. 検索フィールドに「 Automation 」と入力し、[ Azure Automation - 検索結果からジョブの出力を取得 する] を選択します。 このセクションで指定できるオプションについて詳しくは、「Azure Automation – Get job output」(Azure Automation - ジョブ出力の取得) をご覧ください。
    3. 必須フィールドを設定します (前のジョブの作成と同様)。([Automation アカウント] ペインに入力したように) Azure サブスクリプション ID、リソース グループ、Automation アカウントを入力します。
    4. ジョブIDフィールドを選択すると、動的コンテンツメニューが表示されます。 このメニュー内から、ジョブIDのオプションを選択します。
    5. [フローを保存] を選択します。
  3. Office 365 統合を使用して電子メールを送信するアクションを作成します。

    1. [+新しいステップ] を選択し、[繰り返しフロー] ウィンドウ内でアクションを追加します。
    2. 検索フィールドに「 メールの送信 」と入力し、[ Office 365 Outlook - 検索結果からメールを送信 する] を選択します。
    3. [ 宛先 ] フィールドに、通知メールを送信する必要があるメール アドレスを入力します。
    4. [ 件名 ] フィールドに、電子メールの件名を入力します (例: 自動チューニングの推奨事項の電子メール通知)。
    5. [本文] フィールドの内側を選択して、[動的なコンテンツ] メニューを表示します。 このメニューの [ ジョブ出力の取得] で、[ コンテンツ] を選択します。
    6. [フローを保存] を選択します。

ヒント

さまざまな宛先に自動電子メールを送信するには、個別のフローを作成します。 これらの追加フローでは、[ 宛先 ] フィールドの受信者のメール アドレスと、[ 件名 ] フィールドのメールの件名行を変更します。 カスタマイズされた PowerShell スクリプト (Azure サブスクリプション ID の変更など) を使用して Azure Automation で新しい Runbook を作成すると、自動化されたシナリオをさらにカスタマイズできます。たとえば、個別のサブスクリプションに対する自動チューニングの推奨事項に関する個別の受信者に電子メールを送信するなどです。

前の手順では、電子メール配信ジョブ ワークフローを構成します。 作成した 3 つのアクションを含むフロー全体を次の図に示します。

フローをテストするには、[ 今すぐ実行] を選択します。 電子メール通知が正常に送信されたかどうかを示す自動ジョブの実行統計は、[フローの分析] ウィンドウに表示されます。

[Flow Analytics]\(フロー分析\) ペインは、ジョブの実行の成功を監視し、トラブルシューティングに必要な場合に役立ちます。 トラブルシューティングでは、PowerShell スクリプトの実行ログを調べることも必要になりますが、これには Azure Automation アプリからアクセスできます。

自動電子メールの最終的な出力は、このソリューションを作成して実行した後に受け取る次の電子メールのようになります。

自動チューニングの電子メール通知による、Microsoft Outlook でのサンプル メール出力のスクリーンショット。

PowerShell スクリプトを調整することにより、自動電子メールの出力や書式設定をニーズに合わせて調整できます。

カスタム シナリオによって異なりますが、さらにソリューションをカスタマイズして、特定のチューニング イベントに基づいた電子メールや、複数のサブスクリプションまたはデータベースに関して複数の受信者への電子メールを作成できます。