tools/scripts/UpdateBlobStorage.ps1 (193 lines of code) (raw):
<#
.Description
UpdateBlobStorage.ps1 updates the given blob container name.
.PARAMETER SubscriptionId
The Azure subscription ID.
.PARAMETER FunctionAppName
The name of the function app.
.PARAMETER StorageAccountName
The name of the storage accountName.
.EXAMPLE
PS> .\UpdateBlobStorage.ps1 -SubscriptionId "60edc399-b9af-4991-95ec-0e16573f1622" -FunctionAppName "myFunctionApp1235" -BlobContainerName "MyBlobContainer"
.EXAMPLE
PS> .\UpdateBlobStorage.ps1 -SubscriptionId "60edc399-b9af-4991-95ec-0e16573f1622" -StorageAccountName "storage9a925dc5" -BlobContainerName "MyBlobContainer"
#>
[CmdletBinding(DefaultParametersetname="ByFunctionAppName")]
param (
[Parameter(Mandatory=$true, ParameterSetName="ByFunctionAppName")]
[Parameter(Mandatory=$true, ParameterSetName="ByStorageAccountName")]
[ValidateNotNullOrEmpty()]
[String]
$SubscriptionId,
[Parameter(Mandatory=$true, ParameterSetName="ByFunctionAppName")]
[ValidateNotNullOrEmpty()]
[String]
$FunctionAppName,
[Parameter(Mandatory=$true, ParameterSetName="ByStorageAccountName")]
[ValidateNotNullOrEmpty()]
[String]
$StorageAccountName,
[Parameter(Mandatory=$true, ParameterSetName="ByFunctionAppName")]
[Parameter(Mandatory=$true, ParameterSetName="ByStorageAccountName")]
[ValidateNotNullOrEmpty()]
[String]
$BlobContainerName
)
$ErrorActionPreference = 'Stop'
function WriteLog
{
param (
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]
$Message,
[Switch]
$Throw
)
$Message = (Get-Date -Format G) + " -- $Message"
if ($Throw)
{
throw $Message
}
Write-Host $Message
}
function ValidatePrerequisites
{
WriteLog "Validating Prerequisites..."
$command = @'
iex "& { $(irm 'https://aka.ms/install-powershell.ps1') } -UseMSI"
'@
# Make sure we are running on PowerShell Core 7 or higher
if ($PSVersionTable.PSVersion.Major -lt 7)
{
$message = "This script only runs on PowerShell 7 or higher. To install the latest PowerShell, run the following command from an elevated PowerShell window: $command"
WriteLog -Message $message -Throw
}
# Make sure the Az module version 5.5 or higher is installed
$AzModule = Get-Module -ListAvailable Az -ErrorAction SilentlyContinue
if ((-not $AzModule) -or ($AzModule.Version.Major -ne 5 -and $AzModule.Version.Minor -lt 5))
{
$helpUrl = "https://docs.microsoft.com/en-us/powershell/azure/uninstall-az-ps?view=azps-5.5.0"
$message = "This script requires Az version 5.5 or higher. Please remove any existing intallation(s). After that run 'Install-Module Az'."
$message += " For more information on uninstalling Az or AzureRM, please see '$helpUrl'"
WriteLog -Message $message -Throw
}
}
function GetStorageAccountKey
{
param
(
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]
$StorageAccountName
)
$storageAccount = Get-AzStorageAccount | Where-Object { $_.StorageAccountName -eq $StorageAccountName }
if (-not $storageAccount)
{
$message = "Failed to find storage account '$StorageAccountName' in this subscription."
WriteLog $message -Throw
}
$keys = Get-AzStorageAccountKey -Name $storageAccount.StorageAccountName -ResourceGroupName $storageAccount.ResourceGroupName
return $keys[0].Value
}
function GetFunctionApp
{
param
(
[Parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]
[string]
$Name
)
# Find the function app in this subscription
$functionApp = Get-AzFunctionApp | Where-Object { $_.Name -eq $Name }
if (-not $functionApp)
{
WriteLog "Function app name '$Name' does not exist in this subscription." -Throw
}
return $functionApp
}
# Script constants
$WEBSITERUNFROMPACKAGENAME = "WEBSITE_RUN_FROM_PACKAGE"
function UpdateJavaFunctionAppBlobStorage
{
[CmdletBinding(DefaultParametersetname="ByFunctionAppName")]
param (
[Parameter(Mandatory=$true, ParameterSetName="ByFunctionAppName")]
[ValidateNotNullOrEmpty()]
[String]
$FunctionAppName,
[Parameter(Mandatory=$true, ParameterSetName="ByStorageAccountName")]
[ValidateNotNullOrEmpty()]
[String]
$StorageAccountName,
[Parameter(Mandatory=$true, ParameterSetName="ByFunctionAppName")]
[Parameter(Mandatory=$true, ParameterSetName="ByStorageAccountName")]
[ValidateNotNullOrEmpty()]
[String]
$BlobContainerName
)
if ($PsCmdlet.ParameterSetName -eq "ByFunctionAppName")
{
WriteLog "Getting function app name '$FunctionAppName'."
$app = GetFunctionApp -Name $FunctionAppName
if (-not $app.ApplicationSettings.ContainsKey($WEBSITERUNFROMPACKAGENAME))
{
WriteLog "Function app name '$FunctionAppName' does not have a '$WEBSITERUNFROMPACKAGENAME' app setting." -Throw
}
WriteLog "Inspecting $WEBSITERUNFROMPACKAGENAME app setting."
$value = $app.ApplicationSettings[$WEBSITERUNFROMPACKAGENAME]
if ([string]::IsNullOrEmpty($value))
{
WriteLog "$WEBSITERUNFROMPACKAGENAME is null or empty." -Throw
}
elseif ($value -eq 1)
{
WriteLog "$WEBSITERUNFROMPACKAGENAME is set to 1: no further action required."
return
}
elseif ($value -like "*Microsoft.KeyVault*")
{
$message = "$WEBSITERUNFROMPACKAGENAME contains the following Key Vault reference: $value"
$message += [System.Environment]::NewLine
$message += "Please retrieve the storage account name from the Key Vault and restart this script with the following parameters:"
$message += [System.Environment]::NewLine
$message += ".\UpdateBlobStorage.ps1 -SubscriptionId <SubscriptionId> -StorageAccountName <StorageAccountName> -BlobContainerName <BlobContainerName>"
WriteLog -Message $message -Throw
}
WriteLog -Message "Parse storage account name from the '$WEBSITERUNFROMPACKAGENAME' app setting."
$urlObject = New-Object System.Uri $value
$storageAccountName = $urlObject.Host.ToString().Split(".")[0]
}
WriteLog "Get key for storage account '$storageAccountName'."
$storageAccountKey = GetStorageAccountKey -StorageAccountName $storageAccountName
WriteLog "Connecting to storage account..."
$context = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey
WriteLog -Message "Set blob container ACL."
Set-AzStorageContainerAcl -Name $BlobContainerName `
-Permission 'Off' `
-Context $context
if ($PsCmdlet.ParameterSetName -eq "ByFunctionAppName")
{
$message = "Blob container '$BlobContainerName' for function app '$($app.Name)' successfully updated."
}
elseif ($PsCmdlet.ParameterSetName -eq "ByStorageAccountName")
{
$message = "Blob container '$BlobContainerName' on storage account '$StorageAccountName' successfully updated."
}
WriteLog -Message $message
}
WriteLog -Message "Script started."
ValidatePrerequisites
WriteLog "Setting current session context to SubscriptionId '$SubscriptionId'."
Set-AzContext -Subscription $SubscriptionId | Out-Null
if ($PsCmdlet.ParameterSetName -eq "ByFunctionAppName")
{
UpdateJavaFunctionAppBlobStorage -FunctionAppName $FunctionAppName -BlobContainerName $BlobContainerName
}
elseif ($PsCmdlet.ParameterSetName -eq "ByStorageAccountName")
{
UpdateJavaFunctionAppBlobStorage -StorageAccountName $StorageAccountName -BlobContainerName $BlobContainerName
}
WriteLog -Message "Script completed."