다음을 통해 공유


자동 튜닝 이메일 알림 활성화

적용 대상:Azure SQL 데이터베이스Azure SQL Managed Instance

Azure SQL 데이터베이스 조정 권장 사항은 Azure SQL 데이터베이스 자동 조정에서 생성됩니다. 이 솔루션은 인덱스 생성, 인덱스 삭제 및 쿼리 실행 계획의 최적화와 관련된 각 개별 데이터베이스에 대해 사용자 지정된 튜닝 권장 사항을 제공하는 데이터베이스 워크로드를 지속적으로 모니터링하고 분석합니다.

Azure SQL 데이터베이스 자동 튜닝 권장 사항은 Azure Portal에서 확인하거나 REST API 호출을 사용하여 검색하거나 T-SQLPowerShell 명령을 사용하여 확인할 수 있습니다. 이 문서는 PowerShell 스크립트를 사용하여 자동 튜닝 권장 사항을 검색하는 방법을 기반으로 합니다.

참고 항목

이 문서에서는 Azure와 상호 작용하는 데 권장되는 PowerShell 모듈인 Azure Az PowerShell 모듈을 사용합니다. Az PowerShell 모듈을 시작하려면 Azure PowerShell 설치를 참조하세요. Az PowerShell 모듈로 마이그레이션하는 방법에 대한 자세한 내용은 Azure PowerShell을 AzureRM에서 Azure로 마이그레이션을 참조하세요.

중요

PowerShell Azure Resource Manager(AzureRM) 모듈은 2024년 2월 29일에 사용되지 않습니다. 향후 모든 개발에서는 Az.Sql 모듈을 사용해야 합니다. 사용자는 지속적인 지원 및 업데이트를 보장하기 위해 AzureRM에서 Az PowerShell 모듈로 마이그레이션하는 것이 좋습니다. AzureRM 모듈은 더 이상 유지 관리되거나 지원되지 않습니다. Az PowerShell 모듈 및 AzureRM 모듈의 명령에 대한 인수는 상당히 동일합니다. 호환성에 대한 자세한 내용은 새 Az PowerShell 모듈소개를 참조하세요.

자동 튜닝 권장 사항에 대한 전자 메일 알림 자동화

다음 솔루션은 자동 튜닝 권장 사항을 포함하는 메일 알림 전송을 자동화합니다. 설명된 솔루션은 Azure Automation을 사용하여 튜닝 권장 사항을 검색하기 위한 PowerShell 스크립트 실행을 자동화하고 Microsoft Power Automate를 사용하여 전자 메일 배달 작업을 예약하는 자동화로 구성됩니다.

Azure Automation 계정 만들기

Azure 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. 고급을 선택합니다. Azure 리소스에 인증하기 위해 SAMI(시스템 할당 관리 ID)가 생성되도록 시스템 할당 이 선택되어 있는지 확인합니다.

  8. 태그를 선택합니다. Azure 태그 사용을 고려하세요. 예를 들어 "Owner" 또는 "CreatedBy" 태그는 리소스를 만든 사람을 식별하고 "Environment" 태그는 이 리소스가 프로덕션, 개발 등에 있는지 여부를 식별합니다. 자세한 내용은 Azure 리소스에 대한 명명 및 태그 지정 전략 개발을 참조하세요.

  9. 검토+만들기를 선택합니다.

  10. 만들기를 선택하여 자동화 계정 만들기를 완료합니다.

시스템이 할당한 관리 ID 계정에 Azure 역할 할당

Automation 계정은 시스템이 할당한 관리 ID를 사용하여 Azure SQL Database와 같은 Microsoft Entra ID로 보호되는 다른 리소스에 액세스하기 위한 토큰을 가져올 수 있습니다. 이러한 토큰은 애플리케이션의 특정 사용자를 나타내지 않고 리소스에 액세스하는 애플리케이션을 나타냅니다. 예를 들어 이 경우 토큰은 Automation 계정을 나타냅니다.

Azure Automation Runbook을 만들기 전에 최소 권한 원칙에 따라 자동화 계정에 적절한 수준의 권한을 부여하는 것이 중요합니다. 시스템 할당 관리 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. 범위 드롭다운 목록에서 역할 할당이 적용되는 리소스 집합(Subscription, Resource group, Role 및 Scope)을 선택합니다.
  7. 역할 드롭다운 목록에서 SQL DB 참가자로 역할을 선택합니다.
  8. 저장을 선택합니다.

SQL Server 기여자 역할을 추가하려면 역할 할당 추가 단계의 단계를 반복합니다.

Azure Automation 계정 이름, 구독 ID 및 리소스를 Automation 앱을 만들 때 입력한 대로 정확히 적어 둡니다(예: 메모장에 복사하여 붙여넣기). 이 정보는 이후 단계에서 필요합니다.

동일한 Automation을 구축하려는 Azure 구독이 여러 개 있는 경우 다른 구독에 대해서도 이 프로세스를 반복해야 합니다.

Azure 모듈 업데이트

Automation 조정 권장 사항을 검색하는 PowerShell 스크립트는 Azure 모듈 버전 4 이상이 필요한 Get-AzResourceGet-AzSqlDatabaseRecommendedAction 명령을 사용합니다.

Azure Automation Runbook 만들기

다음 단계는 Azure Automation에서 조정 권장 사항의 검색하기 위한 PowerShell 스크립트가 있는 Runbook을 만드는 것입니다.

다음 단계에 따라 새 Azure Automation Runbook을 만듭니다.

  1. 이전 단계에서 만든 Azure Automation 계정에 액세스합니다.
  2. Automation 계정 창에서 왼쪽의 Runbook 메뉴 항목을 선택하여 PowerShell 스크립트를 사용하여 새 Azure Automation Runbook을 만듭니다. 자동화 Runbook을 만드는 방법에 대한 자세한 내용은 새 Runbook 만들기를 참조하세요.
  3. 새 Runbook을 추가하려면 +Runbook 추가 메뉴 옵션을 선택한 다음, 빠른 만들기 – 새 Runbook 만들기를 선택합니다.
  4. Runbook 창에서 Runbook의 이름을 입력하고(이 예제에서는 AutomaticTuningEmailAutomation 이 사용됨), Runbook 유형을 PowerShell 로 선택하고, 이 Runbook에 대한 설명을 작성하여 용도를 설명합니다.
  5. 만들기를 선택하여 새 Runbook 만들기를 완료합니다.

다음 단계에 따라 만든 Runbook 내에 PowerShell 스크립트를 로드합니다.

  1. PowerShell Runbook 편집 창의 메뉴 트리에서 RUNBOOKS를 선택하고 Runbook의 이름(이 예제에서는 AutomaticTuningEmailAutomation)이 표시될 때까지 보기를 확장합니다. 해당 Runbook을 선택합니다.
  2. "PowerShell Runbook 편집"의 첫 번째 줄(숫자 1부터 시작)에서 다음 PowerShell 스크립트 코드를 복사하여 붙여넣습니다. 이 PowerShell 스크립트는 시작하기 위해 있는 그대로 제공됩니다. 요구 사항을 충족하도록 스크립트를 수정합니다.

제공된 PowerShell 스크립트의 헤더에서 <SUBSCRIPTION_ID_WITH_DATABASES>를 Azure 구독 ID로 바꾸어야 합니다. Azure 구독 ID를 검색하는 방법을 알아보려면 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을 게시합니다.

기본 Runbook 창에서 시작을 선택하여 스크립트를 테스트할 수 있습니다. 출력을 선택하여 실행된 스크립트의 결과를 봅니다. 이 출력은 전자 메일의 내용이 될 것입니다.

PowerShell 스크립트를 필요에 맞게 사용자 지정하여 콘텐츠를 조정해야 합니다.

위의 단계를 사용하면 자동 튜닝 권장 사항을 검색하는 PowerShell 스크립트가 Azure Automation에 로드됩니다. 다음 단계는 전자 메일 배달 작업을 자동화하고 예약하는 것입니다.

Microsoft Power Automate로 이메일 작업 자동화하기

솔루션을 완료하려면 최종 단계로, Microsoft Power Automate에서 다음 세 가지 작업으로 구성되는 자동화 흐름을 만듭니다.

  • Azure Automation - 작업 만들기 – PowerShell 스크립트를 실행하여 Azure Automation Runbook 내에서 자동 조정 권장 사항을 검색하는 데 사용됩니다.
  • Azure Automation - 작업 출력 가져오기 – 실행된 PowerShell 스크립트에서 출력을 검색하는 데 사용됩니다.
  • Office 365 Outlook – 이메일 보내기 – 이메일을 보내는 데 사용됩니다. 전자 메일은 플로우를 만드는 개인의 업무 또는 학교 계정을 사용하여 전송됩니다.

Power Automate의 기능에 대해 자세히 알아보려면 Microsoft Power Automate 시작하기를 참조하세요.

이 단계의 전제 조건은 Microsoft Power Automate 계정에 등록하고 로그인하는 것입니다. 솔루션 내부로 들어가면 다음 단계에 따라 새 플로우를 설정합니다.

  1. My flows(내 흐름) 메뉴 항목에 액세스합니다.
  2. 내 흐름 내에서 페이지 맨 위에 있는 빈 창에서 +만들기 링크를 선택합니다.
  3. Search for hundreds of connectors and triggers(수백 개의 커넥터 및 트리거 검색) 링크를 선택합니다.
  4. 검색 필드에 recurrence를 입력하고 검색 결과에서 Schedule - Recurrence 를 선택하여 이메일 배달 작업을 실행하도록 예약합니다.
  5. 빈도 필드의 되풀이 창에서 각 분, 시간, 일, 주 등 자동화된 전자 메일을 보내는 등 이 Flow가 실행될 예약 빈도를 선택합니다.

다음 단계는 새로 생성된 반복 흐름에 세 가지 작업(만들기, 출력 가져오기 및 이메일 보내기)을 추가하는 것입니다. 필요한 작업을 흐름에 추가하려면 다음 단계를 따릅니다.

  1. 조정 권장 사항을 검색하는 PowerShell 스크립트를 실행하는 작업을 만듭니다.

    1. +새 단계를 선택한 다음, 되풀이 흐름 창 내에서 작업 추가를 선택합니다.
    2. 검색 필드에 automation 을 입력하고 검색 결과에서 Azure Automation – 작업 만들기를 선택합니다.
    3. 작업 만들기 창에서 작업 속성을 구성합니다. 이 구성의 경우 이전에 Automation 계정 창에기록된 Azure 구독 ID, 리소스 그룹 및 Automation 계정에 대한 세부 정보가 필요합니다. 이 섹션에서 사용할 수 있는 옵션에 대한 자세한 내용은 Azure Automation - 작업 만들기를 참조하세요.
    4. 흐름 저장을 선택합니다.
  2. 실행된 PowerShell 스크립트에서 출력을 검색하는 작업을 만듭니다.

    1. +새 단계를 선택한 다음, 되풀이 흐름 창 내에서 작업 추가를 선택합니다
    2. 검색 필드에 automation 을 입력하고 Azure Automation – 검색 결과에서 작업 출력 가져오기 를 선택합니다. 이 섹션에서 사용할 수 있는 옵션에 대한 자세한 내용은 Azure Automation - 작업 출력 가져오기를 참조하세요.
    3. 필수 필드를 채웁니다(이전 작업을 만들 때와 유사) - Azure 구독 ID, 리소스 그룹 및 Automation 계정을 채웁니다(Automation 계정 창에 입력한 것과 같음).
    4. 필드 Job ID( 작업 ID ) 내부를 선택하여 Dynamic content 메뉴를 표시합니다. 이 메뉴에서 작업 ID 옵션을 선택합니다.
    5. 흐름 저장을 선택합니다.
  3. Office 365 통합을 사용하여 메일을 전송하기 위한 작업을 만듭니다.

    1. +새 단계를 선택한 다음, 되풀이 흐름 창 내에서 작업 추가를 선택합니다.
    2. 검색 필드에 전자 메일 보내기를 입력하고 검색 결과에서 Office 365 Outlook – 전자 메일 보내기 를 선택합니다.
    3. 받는 사람 필드에 알림 이메일을 보내야 하는 이메일 주소를 입력합니다.
    4. 제목 필드에 이메일 제목(예: "자동 조정 권장 사항 이메일 알림")을 입력합니다.
    5. 필드 내부를 선택하여 Dynamic content 메뉴가 표시됩니다. 이 메뉴의 Get job output(작업 출력 가져오기)에서 Content(콘텐츠)를 선택합니다.
    6. 흐름 저장을 선택합니다.

자동화된 전자 메일을 다른 받는 사람에게 보내려면 별도의 플로우를 만듭니다. 이러한 추가 흐름에서 받는 사람 필드에서 수신자 이메일 주소를 변경하고 제목 필드에서 이메일 제목 줄을 변경합니다. 사용자 지정된 PowerShell 스크립트(예: Azure 구독 ID 변경)를 사용하여 Azure Automation에서 새 Runbook을 만들면 자동화된 시나리오를 추가로 사용자 지정할 수 있습니다(예: 별도의 구독에 대한 자동화된 조정 권장 사항에 대해 별도의 수신자에게 이메일을 보내는 경우).

이전 단계에서는 이메일 게재 작업 워크플로우를 구성합니다. 빌드된 세 가지 작업으로 구성된 전체 Flow가 다음 이미지에 나와 있습니다.

흐름을 테스트하려면 지금 실행을 선택합니다. 전송된 메일 알림 성공을 보여 주는 자동화된 작업 실행 통계는 Flow 분석 창에서 확인할 수 있습니다.

흐름 분석 창은 작업 실행의 성공을 모니터링하고 필요한 경우 문제 해결에 유용합니다. 문제 해결의 경우 Azure Automation 앱을 통해 액세스할 수 있는 PowerShell 스크립트 실행 로그를 검사할 수도 있습니다.

자동화된 전자 메일의 최종 출력은 이 솔루션을 빌드하고 실행한 후 받은 다음 전자 메일과 유사합니다.

자동 튜닝 이메일 알림의 샘플 이메일 출력에 대한 Microsoft Outlook의 스크린샷.

PowerShell 스크립트를 조정하여 자동화된 전자 메일의 출력 및 서식을 사용자 필요에 맞게 조정할 수 있습니다.

사용자 지정 시나리오에 따라 특정 튜닝 이벤트에 따라 메일 알림 빌드하고 여러 구독 또는 데이터베이스의 경우 여러 받는 사람에게 솔루션을 추가로 사용자 지정할 수 있습니다.