First, we have create the automation accounts with authorized azure console account.
We need to update the module to achieve this, Create new runbook with powershell and paste the new script
| <# | |
| Copyright (c) Microsoft Corporation. All rights reserved. | |
| Licensed under the MIT License. | |
| #> | |
| <# | |
| .SYNOPSIS | |
| Update Azure PowerShell modules in an Azure Automation account. | |
| .DESCRIPTION | |
| This Azure Automation runbook updates Azure PowerShell modules imported into an | |
| Azure Automation account with the module versions published to the PowerShell Gallery. | |
| Prerequisite: an Azure Automation account with an Azure Run As account credential. | |
| .PARAMETER ResourceGroupName | |
| The Azure resource group name. | |
| .PARAMETER AutomationAccountName | |
| The Azure Automation account name. | |
| .PARAMETER SimultaneousModuleImportJobCount | |
| (Optional) The maximum number of module import jobs allowed to run concurrently. | |
| .PARAMETER AzureModuleClass | |
| (Optional) The class of module that will be updated (AzureRM or Az) | |
| If set to Az, this script will rely on only Az modules to update other modules. | |
| Set this to Az if your runbooks use only Az modules to avoid conflicts. | |
| .PARAMETER AzureEnvironment | |
| (Optional) Azure environment name. | |
| .PARAMETER Login | |
| (Optional) If $false, do not login to Azure. | |
| .PARAMETER ModuleVersionOverrides | |
| (Optional) Module versions to use instead of the latest on the PowerShell Gallery. | |
| If $null, the currently published latest versions will be used. | |
| If not $null, must contain a JSON-serialized dictionary, for example: | |
| '{ "AzureRM.Compute": "5.8.0", "AzureRM.Network": "6.10.0" }' | |
| or | |
| @{ 'AzureRM.Compute'='5.8.0'; 'AzureRM.Network'='6.10.0' } | ConvertTo-Json | |
| .PARAMETER PsGalleryApiUrl | |
| (Optional) PowerShell Gallery API URL. | |
| .LINK | |
| https://docs.microsoft.com/en-us/azure/automation/automation-update-azure-modules | |
| #> | |
| [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseApprovedVerbs", "")] | |
| param( | |
| [Parameter(Mandatory = $true)] | |
| [string] $ResourceGroupName, | |
| [Parameter(Mandatory = $true)] | |
| [string] $AutomationAccountName, | |
| [int] $SimultaneousModuleImportJobCount = 10, | |
| [string] $AzureModuleClass = 'AzureRM', | |
| [string] $AzureEnvironment = 'AzureCloud', | |
| [bool] $Login = $true, | |
| [string] $ModuleVersionOverrides = $null, | |
| [string] $PsGalleryApiUrl = 'https://www.powershellgallery.com/api/v2' | |
| ) | |
| $ErrorActionPreference = "Continue" | |
| #region Constants | |
| $script:AzureRMProfileModuleName = "AzureRM.Profile" | |
| $script:AzureRMAutomationModuleName = "AzureRM.Automation" | |
| $script:GetAzureRmAutomationModule = "Get-AzureRmAutomationModule" | |
| $script:NewAzureRmAutomationModule = "New-AzureRmAutomationModule" | |
| $script:AzAccountsModuleName = "Az.Accounts" | |
| $script:AzAutomationModuleName = "Az.Automation" | |
| $script:GetAzAutomationModule = "Get-AzAutomationModule" | |
| $script:NewAzAutomationModule = "New-AzAutomationModule" | |
| $script:AzureSdkOwnerName = "azure-sdk" | |
| #endregion | |
| #region Functions | |
| function ConvertJsonDictTo-HashTable($JsonString) { | |
| try{ | |
| $JsonObj = ConvertFrom-Json $JsonString -ErrorAction Stop | |
| } catch [System.ArgumentException] { | |
| throw "Unable to deserialize the JSON string for parameter ModuleVersionOverrides: ", $_ | |
| } | |
| $Result = @{} | |
| foreach ($Property in $JsonObj.PSObject.Properties) { | |
| $Result[$Property.Name] = $Property.Value | |
| } | |
| $Result | |
| } | |
| # Use the Run As connection to login to Azure | |
| function Login-AzureAutomation([bool] $AzModuleOnly) { | |
| try { | |
| $RunAsConnection = Get-AutomationConnection -Name "AzureRunAsConnection" | |
| Write-Output "Logging in to Azure ($AzureEnvironment)..." | |
| if ($AzModuleOnly) { | |
| Add-AzAccount ` | |
| -ServicePrincipal ` | |
| -TenantId $RunAsConnection.TenantId ` | |
| -ApplicationId $RunAsConnection.ApplicationId ` | |
| -CertificateThumbprint $RunAsConnection.CertificateThumbprint ` | |
| -Environment $AzureEnvironment | |
| Select-AzSubscription -SubscriptionId $RunAsConnection.SubscriptionID | Write-Verbose | |
| } else { | |
| Add-AzureRmAccount ` | |
| -ServicePrincipal ` | |
| -TenantId $RunAsConnection.TenantId ` | |
| -ApplicationId $RunAsConnection.ApplicationId ` | |
| -CertificateThumbprint $RunAsConnection.CertificateThumbprint ` | |
| -Environment $AzureEnvironment | |
| Select-AzureRmSubscription -SubscriptionId $RunAsConnection.SubscriptionID | Write-Verbose | |
| } | |
| } catch { | |
| if (!$RunAsConnection) { | |
| Write-Output $servicePrincipalConnection | |
| Write-Output $_.Exception | |
| $ErrorMessage = "Connection $connectionName not found." | |
| throw $ErrorMessage | |
| } | |
| throw $_.Exception | |
| } | |
| } | |
| # Checks the PowerShell Gallery for the latest available version for the module | |
| function Get-ModuleDependencyAndLatestVersion([string] $ModuleName) { | |
| $ModuleUrlFormat = "$PsGalleryApiUrl/Search()?`$filter={1}&searchTerm=%27{0}%27&targetFramework=%27%27&includePrerelease=false&`$skip=0&`$top=40" | |
| $ForcedModuleVersion = $ModuleVersionOverridesHashTable[$ModuleName] | |
| $CurrentModuleUrl = | |
| if ($ForcedModuleVersion) { | |
| $ModuleUrlFormat -f $ModuleName, "Version%20eq%20'$ForcedModuleVersion'" | |
| } else { | |
| $ModuleUrlFormat -f $ModuleName, 'IsLatestVersion' | |
| } | |
| $SearchResult = Invoke-RestMethod -Method Get -Uri $CurrentModuleUrl -UseBasicParsing | |
| if (!$SearchResult) { | |
| Write-Verbose "Could not find module $ModuleName on PowerShell Gallery. This may be a module you imported from a different location. Ignoring this module" | |
| } else { | |
| if ($SearchResult.Length -and $SearchResult.Length -gt 1) { | |
| $SearchResult = $SearchResult | Where-Object { $_.title.InnerText -eq $ModuleName } | |
| } | |
| if (!$SearchResult) { | |
| Write-Verbose "Could not find module $ModuleName on PowerShell Gallery. This may be a module you imported from a different location. Ignoring this module" | |
| } else { | |
| $PackageDetails = Invoke-RestMethod -Method Get -UseBasicParsing -Uri $SearchResult.id | |
| # Ignore the modules that are not published as part of the Azure SDK | |
| if ($PackageDetails.entry.properties.Owners -ne $script:AzureSdkOwnerName) { | |
| Write-Warning "Module : $ModuleName is not part of azure sdk. Ignoring this." | |
| } else { | |
| $ModuleVersion = $PackageDetails.entry.properties.version | |
| $Dependencies = $PackageDetails.entry.properties.dependencies | |
| @($ModuleVersion, $Dependencies) | |
| } | |
| } | |
| } | |
| } | |
| function Get-ModuleContentUrl($ModuleName) { | |
| $ModuleContentUrlFormat = "$PsGalleryApiUrl/package/{0}" | |
| $VersionedModuleContentUrlFormat = "$ModuleContentUrlFormat/{1}" | |
| $ForcedModuleVersion = $ModuleVersionOverridesHashTable[$ModuleName] | |
| if ($ForcedModuleVersion) { | |
| $VersionedModuleContentUrlFormat -f $ModuleName, $ForcedModuleVersion | |
| } else { | |
| $ModuleContentUrlFormat -f $ModuleName | |
| } | |
| } | |
| # Imports the module with given version into Azure Automation | |
| function Import-AutomationModule([string] $ModuleName, [bool] $UseAzModule = $false) { | |
| $NewAutomationModule = $null | |
| $GetAutomationModule = $null | |
| if ($UseAzModule) { | |
| $GetAutomationModule = $script:GetAzAutomationModule | |
| $NewAutomationModule = $script:NewAzAutomationModule | |
| } else { | |
| $GetAutomationModule = $script:GetAzureRmAutomationModule | |
| $NewAutomationModule = $script:NewAzureRmAutomationModule | |
| } | |
| $LatestModuleVersionOnGallery = (Get-ModuleDependencyAndLatestVersion $ModuleName)[0] | |
| $ModuleContentUrl = Get-ModuleContentUrl $ModuleName | |
| # Find the actual blob storage location of the module | |
| do { | |
| $ModuleContentUrl = (Invoke-WebRequest -Uri $ModuleContentUrl -MaximumRedirection 0 -UseBasicParsing -ErrorAction Ignore).Headers.Location | |
| } while (!$ModuleContentUrl.Contains(".nupkg")) | |
| $CurrentModule = & $GetAutomationModule ` | |
| -Name $ModuleName ` | |
| -ResourceGroupName $ResourceGroupName ` | |
| -AutomationAccountName $AutomationAccountName | |
| if ($CurrentModule.Version -eq $LatestModuleVersionOnGallery) { | |
| Write-Output "Module : $ModuleName is already present with version $LatestModuleVersionOnGallery. Skipping Import" | |
| } else { | |
| Write-Output "Importing $ModuleName module of version $LatestModuleVersionOnGallery to Automation" | |
| & $NewAutomationModule ` | |
| -ResourceGroupName $ResourceGroupName ` | |
| -AutomationAccountName $AutomationAccountName ` | |
| -Name $ModuleName ` | |
| -ContentLink $ModuleContentUrl > $null | |
| } | |
| } | |
| # Parses the dependency got from PowerShell Gallery and returns name and version | |
| function GetModuleNameAndVersionFromPowershellGalleryDependencyFormat([string] $Dependency) { | |
| if ($null -eq $Dependency) { | |
| throw "Improper dependency format" | |
| } | |
| $Tokens = $Dependency -split":" | |
| if ($Tokens.Count -ne 3) { | |
| throw "Improper dependency format" | |
| } | |
| $ModuleName = $Tokens[0] | |
| $ModuleVersion = $Tokens[1].Trim("[","]") | |
| @($ModuleName, $ModuleVersion) | |
| } | |
| # Validates if the given list of modules has already been added to the module import map | |
| function AreAllModulesAdded([string[]] $ModuleListToAdd) { | |
| $Result = $true | |
| foreach ($ModuleToAdd in $ModuleListToAdd) { | |
| $ModuleAccounted = $false | |
| # $ModuleToAdd is specified in the following format: | |
| # ModuleName:ModuleVersionSpecification: | |
| # where ModuleVersionSpecification follows the specifiation | |
| # at https://docs.microsoft.com/en-us/nuget/reference/package-versioning#version-ranges-and-wildcards | |
| # For example: | |
| # AzureRm.profile:[4.0.0]: | |
| # or | |
| # AzureRm.profile:3.0.0: | |
| # In any case, the dependency version specification is always separated from the module name with | |
| # the ':' character. The explicit intent of this runbook is to always install the latest module versions, | |
| # so we want to completely ignore version specifications here. | |
| $ModuleNameToAdd = $ModuleToAdd -replace '\:.*', '' | |
| foreach($AlreadyIncludedModules in $ModuleImportMapOrder) { | |
| if ($AlreadyIncludedModules -contains $ModuleNameToAdd) { | |
| $ModuleAccounted = $true | |
| break | |
| } | |
| } | |
| if (!$ModuleAccounted) { | |
| $Result = $false | |
| break | |
| } | |
| } | |
| $Result | |
| } | |
| # Creates a module import map. This is a 2D array of strings so that the first | |
| # element in the array consist of modules with no dependencies. | |
| # The second element only depends on the modules in the first element, the | |
| # third element only dependes on modules in the first and second and so on. | |
| function Create-ModuleImportMapOrder([bool] $AzModuleOnly) { | |
| $ModuleImportMapOrder = $null | |
| $ProfileOrAccountsModuleName = $null | |
| $GetAutomationModule = $null | |
| # Use the relevant module class to avoid conflicts | |
| if ($AzModuleOnly) { | |
| $ProfileOrAccountsModuleName = $script:AzAccountsModuleName | |
| $GetAutomationModule = $script:GetAzAutomationModule | |
| } else { | |
| $ProfileOrAccountsModuleName = $script:AzureRmProfileModuleName | |
| $GetAutomationModule = $script:GetAzureRmAutomationModule | |
| } | |
| # Get all the non-conflicting modules in the current automation account | |
| $CurrentAutomationModuleList = & $GetAutomationModule ` | |
| -ResourceGroupName $ResourceGroupName ` | |
| -AutomationAccountName $AutomationAccountName | | |
| ?{ | |
| ($AzModuleOnly -and ($_.Name -eq 'Az' -or $_.Name -like 'Az.*')) -or | |
| (!$AzModuleOnly -and ($_.Name -eq 'AzureRM' -or $_.Name -like 'AzureRM.*' -or | |
| $_.Name -eq 'Azure' -or $_.Name -like 'Azure.*')) | |
| } | |
| # Get the latest version of the AzureRM.Profile OR Az.Accounts module | |
| $VersionAndDependencies = Get-ModuleDependencyAndLatestVersion $ProfileOrAccountsModuleName | |
| $ModuleEntry = $ProfileOrAccountsModuleName | |
| $ModuleEntryArray = ,$ModuleEntry | |
| $ModuleImportMapOrder += ,$ModuleEntryArray | |
| do { | |
| $NextAutomationModuleList = $null | |
| $CurrentChainVersion = $null | |
| # Add it to the list if the modules are not available in the same list | |
| foreach ($Module in $CurrentAutomationModuleList) { | |
| $Name = $Module.Name | |
| Write-Verbose "Checking dependencies for $Name" | |
| $VersionAndDependencies = Get-ModuleDependencyAndLatestVersion $Module.Name | |
| if ($null -eq $VersionAndDependencies) { | |
| continue | |
| } | |
| $Dependencies = $VersionAndDependencies[1].Split("|") | |
| $AzureModuleEntry = $Module.Name | |
| # If the previous list contains all the dependencies then add it to current list | |
| if ((-not $Dependencies) -or (AreAllModulesAdded $Dependencies)) { | |
| Write-Verbose "Adding module $Name to dependency chain" | |
| $CurrentChainVersion += ,$AzureModuleEntry | |
| } else { | |
| # else add it back to the main loop variable list if not already added | |
| if (!(AreAllModulesAdded $AzureModuleEntry)) { | |
| Write-Verbose "Module $Name does not have all dependencies added as yet. Moving module for later import" | |
| $NextAutomationModuleList += ,$Module | |
| } | |
| } | |
| } | |
| $ModuleImportMapOrder += ,$CurrentChainVersion | |
| $CurrentAutomationModuleList = $NextAutomationModuleList | |
| } while ($null -ne $CurrentAutomationModuleList) | |
| $ModuleImportMapOrder | |
| } | |
| # Wait and confirm that all the modules in the list have been imported successfully in Azure Automation | |
| function Wait-AllModulesImported( | |
| [Collections.Generic.List[string]] $ModuleList, | |
| [int] $Count, | |
| [bool] $UseAzModule = $false) { | |
| $GetAutomationModule = if ($UseAzModule) { | |
| $script:GetAzAutomationModule | |
| } else { | |
| $script:GetAzureRmAutomationModule | |
| } | |
| $i = $Count - $SimultaneousModuleImportJobCount | |
| if ($i -lt 0) { $i = 0 } | |
| for ( ; $i -lt $Count; $i++) { | |
| $Module = $ModuleList[$i] | |
| Write-Output ("Checking import Status for module : {0}" -f $Module) | |
| while ($true) { | |
| $AutomationModule = & $GetAutomationModule ` | |
| -Name $Module ` | |
| -ResourceGroupName $ResourceGroupName ` | |
| -AutomationAccountName $AutomationAccountName | |
| $IsTerminalProvisioningState = ($AutomationModule.ProvisioningState -eq "Succeeded") -or | |
| ($AutomationModule.ProvisioningState -eq "Failed") | |
| if ($IsTerminalProvisioningState) { | |
| break | |
| } | |
| Write-Verbose ("Module {0} is getting imported" -f $Module) | |
| Start-Sleep -Seconds 30 | |
| } | |
| if ($AutomationModule.ProvisioningState -ne "Succeeded") { | |
| Write-Error ("Failed to import module : {0}. Status : {1}" -f $Module, $AutomationModule.ProvisioningState) | |
| } else { | |
| Write-Output ("Successfully imported module : {0}" -f $Module) | |
| } | |
| } | |
| } | |
| # Uses the module import map created to import modules. | |
| # It will only import modules from an element in the array if all the modules | |
| # from the previous element have been added. | |
| function Import-ModulesInAutomationAccordingToDependency([string[][]] $ModuleImportMapOrder, [bool] $UseAzModule) { | |
| foreach($ModuleList in $ModuleImportMapOrder) { | |
| $i = 0 | |
| Write-Output "Importing Array of modules : $ModuleList" | |
| foreach ($Module in $ModuleList) { | |
| Write-Verbose ("Importing module : {0}" -f $Module) | |
| Import-AutomationModule -ModuleName $Module -UseAzModule $UseAzModule | |
| $i++ | |
| if ($i % $SimultaneousModuleImportJobCount -eq 0) { | |
| # It takes some time for the modules to start getting imported. | |
| # Sleep for sometime before making a query to see the status | |
| Start-Sleep -Seconds 20 | |
| Wait-AllModulesImported -ModuleList $ModuleList -Count $i -UseAzModule $UseAzModule | |
| } | |
| } | |
| if ($i -lt $SimultaneousModuleImportJobCount) { | |
| Start-Sleep -Seconds 20 | |
| Wait-AllModulesImported -ModuleList $ModuleList -Count $i -UseAzModule $UseAzModule | |
| } | |
| } | |
| } | |
| function Update-ProfileAndAutomationVersionToLatest([string] $AutomationModuleName) { | |
| # Get the latest azure automation module version | |
| $VersionAndDependencies = Get-ModuleDependencyAndLatestVersion $AutomationModuleName | |
| # Automation only has dependency on profile | |
| $ModuleDependencies = GetModuleNameAndVersionFromPowershellGalleryDependencyFormat $VersionAndDependencies[1] | |
| $ProfileModuleName = $ModuleDependencies[0] | |
| # Create web client object for downloading data | |
| $WebClient = New-Object System.Net.WebClient | |
| # Download AzureRM.Profile to temp location | |
| $ModuleContentUrl = Get-ModuleContentUrl $ProfileModuleName | |
| $ProfileURL = (Invoke-WebRequest -Uri $ModuleContentUrl -MaximumRedirection 0 -UseBasicParsing -ErrorAction Ignore).Headers.Location | |
| $ProfilePath = Join-Path $env:TEMP ($ProfileModuleName + ".zip") | |
| $WebClient.DownloadFile($ProfileURL, $ProfilePath) | |
| # Download AzureRM.Automation to temp location | |
| $ModuleContentUrl = Get-ModuleContentUrl $AutomationModuleName | |
| $AutomationURL = (Invoke-WebRequest -Uri $ModuleContentUrl -MaximumRedirection 0 -UseBasicParsing -ErrorAction Ignore).Headers.Location | |
| $AutomationPath = Join-Path $env:TEMP ($AutomationModuleName + ".zip") | |
| $WebClient.DownloadFile($AutomationURL, $AutomationPath) | |
| # Create folder for unzipping the Module files | |
| $PathFolderName = New-Guid | |
| $PathFolder = Join-Path $env:TEMP $PathFolderName | |
| # Unzip files | |
| $ProfileUnzipPath = Join-Path $PathFolder $ProfileModuleName | |
| Expand-Archive -Path $ProfilePath -DestinationPath $ProfileUnzipPath -Force | |
| $AutomationUnzipPath = Join-Path $PathFolder $AutomationModuleName | |
| Expand-Archive -Path $AutomationPath -DestinationPath $AutomationUnzipPath -Force | |
| # Import modules | |
| Import-Module (Join-Path $ProfileUnzipPath ($ProfileModuleName + ".psd1")) -Force -Verbose | |
| Import-Module (Join-Path $AutomationUnzipPath ($AutomationModuleName + ".psd1")) -Force -Verbose | |
| } | |
| #endregion | |
| #region Main body | |
| if ($ModuleVersionOverrides) { | |
| $ModuleVersionOverridesHashTable = ConvertJsonDictTo-HashTable $ModuleVersionOverrides | |
| } else { | |
| $ModuleVersionOverridesHashTable = @{} | |
| } | |
| $UseAzModule = $null | |
| $AutomationModuleName = $null | |
| # We want to support updating Az modules. This means this runbook should support upgrading using only Az modules | |
| if ($AzureModuleClass -eq "Az") { | |
| $UseAzModule = $true | |
| $AutomationModuleName = $script:AzAutomationModuleName | |
| } elseif ( $AzureModuleClass -eq "AzureRM") { | |
| $UseAzModule = $false | |
| $AutomationModuleName = $script:AzureRMAutomationModuleName | |
| } else { | |
| Write-Error "Invalid AzureModuleClass: '$AzureModuleClass'. Must be either Az or AzureRM" -ErrorAction Stop | |
| } | |
| # Import the latest version of the Az automation and accounts version to the local sandbox | |
| Update-ProfileAndAutomationVersionToLatest $AutomationModuleName | |
| if ($Login) { | |
| Login-AzureAutomation $UseAzModule | |
| } | |
| $ModuleImportMapOrder = Create-ModuleImportMapOrder $UseAzModule | |
| Import-ModulesInAutomationAccordingToDependency $ModuleImportMapOrder $UseAzModule | |
| #endregion then publish it. Then go to browser gallery in runbook column and search az.accounts & az.sql and imported it Wait for sometimes once imported successfully then we have to go for next steps. |
Then Create a runbook with Powershell workflow for scale down and paste this script
workflow AutoScaleElasticPool
{
param
(
# Name of Resource Group
[parameter(Mandatory=$true)]
[string] $ResourceGroupName,
# Name of the Azure SQL Database server (Ex: bzb98er9bp)
[parameter(Mandatory=$true)]
[string] $SqlServerName,
# Target Azure SQL Elastic Pool Name
[parameter(Mandatory=$true)]
[string] $ElasticPoolName,
# Desired Azure SQL Elastic Pool edition
[parameter(Mandatory=$true)]
[string] $Edition,
# Desired DTU
[parameter(Mandatory=$true)]
[string] $DTU,
# Desired Min DTU
[parameter(Mandatory=$true)]
[string] $DtuMin,
# Desired Max DTU
[parameter(Mandatory=$true)]
[string] $DtuMax
)
inlinescript
{
$connectionName = "AzureRunAsConnection"
try
{
# Get the connection "AzureRunAsConnection "
$servicePrincipalConnection=Get-AutomationConnection -Name $connectionName
"Logging in to Azure..."
Add-AzureRmAccount `
-ServicePrincipal `
-TenantId $servicePrincipalConnection.TenantId `
-ApplicationId $servicePrincipalConnection.ApplicationId `
-CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
}
catch {
if (!$servicePrincipalConnection)
{
$ErrorMessage = "Connection $connectionName not found."
throw $ErrorMessage
} else{
Write-Error -Message $_.Exception
throw $_.Exception
}
}
## Set-AzureRmContext -SubscriptionId $subscriptionId
## Set-AzureRmSqlDatabase -DatabaseName $DatabaseName -ServerName $SqlServerName -ResourceGroupName $ResourceGroupName -Edition $Edition -RequestedServiceObjectiveName $NewPricingTier
Write-Output "Begin vertical scaling ..."
Set-AzSqlElasticPool `
-ResourceGroupName $Using:ResourceGroupName `
-ServerName $Using:SqlServerName `
-ElasticPoolName $Using:ElasticPoolName `
-Edition $Using:Edition `
-Dtu $Using:DTU `
-DatabaseDtuMin $Using:DtuMin `
-DatabaseDtuMax $Using:DtuMax
# Output final status message
Write-Output "Scaled the pricing tier of $Using:DatabaseName to $Using:Edition - $Using:DTU"
Write-Output "Completed vertical scale"
}
}
and publish it.
Then Create another runbook with Powershell workflow for scale down and paste this script
workflow AutoScaleElasticPool
{
param
(
# Name of Resource Group
[parameter(Mandatory=$true)]
[string] $ResourceGroupName,
# Name of the Azure SQL Database server (Ex: bzb98er9bp)
[parameter(Mandatory=$true)]
[string] $SqlServerName,
# Target Azure SQL Elastic Pool Name
[parameter(Mandatory=$true)]
[string] $ElasticPoolName,
# Desired Azure SQL Elastic Pool edition
[parameter(Mandatory=$true)]
[string] $Edition,
# Desired DTU
[parameter(Mandatory=$true)]
[string] $DTU,
# Desired Min DTU
[parameter(Mandatory=$true)]
[string] $DtuMin,
# Desired Max DTU
[parameter(Mandatory=$true)]
[string] $DtuMax
)
inlinescript
{
$connectionName = "AzureRunAsConnection"
try
{
# Get the connection "AzureRunAsConnection "
$servicePrincipalConnection=Get-AutomationConnection -Name $connectionName
"Logging in to Azure..."
Add-AzureRmAccount `
-ServicePrincipal `
-TenantId $servicePrincipalConnection.TenantId `
-ApplicationId $servicePrincipalConnection.ApplicationId `
-CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
}
catch {
if (!$servicePrincipalConnection)
{
$ErrorMessage = "Connection $connectionName not found."
throw $ErrorMessage
} else{
Write-Error -Message $_.Exception
throw $_.Exception
}
}
## Set-AzureRmContext -SubscriptionId $subscriptionId
## Set-AzureRmSqlDatabase -DatabaseName $DatabaseName -ServerName $SqlServerName -ResourceGroupName $ResourceGroupName -Edition $Edition -RequestedServiceObjectiveName $NewPricingTier
Write-Output "Begin vertical scaling ..."
Set-AzSqlElasticPool `
-ResourceGroupName $Using:ResourceGroupName `
-ServerName $Using:SqlServerName `
-ElasticPoolName $Using:ElasticPoolName `
-Edition $Using:Edition `
-Dtu $Using:DTU `
-DatabaseDtuMin $Using:DtuMin `
-DatabaseDtuMax $Using:DtuMax
# Output final status message
Write-Output "Scaled the pricing tier of $Using:DatabaseName to $Using:Edition - $Using:DTU"
Write-Output "Completed vertical scale"
}
}
and publish it.
Then tab in to link in to Schedule option and set the parameter scales down size and other things.