在 powersell 中启动-AzStorageBlobCopy

问题描述 投票:0回答:1

使用 powershell,我尝试获取 azure webapp 日志文件并将它们复制到 azure 存储帐户容器,然后删除

$webAppName  = "WA01"
$resourceGroupName = "RG01"
$storageAccountName = "SA01"
$containerName = "container01"
$numberOfDays = 90


# Generate Kudu API URL for log files
$kuduApiUrl = "https://${webAppName}.scm.azurewebsites.net/api/vfs/LogFiles/"

# Retrieve publishing profile for the Azure Web App
Write-Host "Retrieving publishing profile for $webAppName..."
$publishingProfile = Get-AzWebAppPublishingProfile -ResourceGroupName $resourceGroupName -Name $webAppName

# Parse publishing profile XML to get credentials
[xml]$publishingProfileXml = $publishingProfile
$publishingUserName = $publishingProfileXml.publishData.publishProfile[0].userName
$publishingPassword = $publishingProfileXml.publishData.publishProfile[0].userPWD

# Convert credentials to base64
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("${publishingUserName}:${publishingPassword}"))
Write-Host "Retrieving log files from $webAppName..."
    $logFilesToBackup = (Invoke-RestMethod -Uri $kuduApiUrl -Headers @{Authorization=("Basic $base64AuthInfo")} -Method GET).Where({ 
            $mtimeValue = $_.mtime.Split('.')[0]  # Remove milliseconds
            $mtimeValue = $mtimeValue.Substring(0, 19)  # Remove time zone offset
            [DateTime]::ParseExact($mtimeValue, "yyyy-MM-dd'T'HH:mm:ss", [System.Globalization.CultureInfo]::InvariantCulture) -lt      $cutoffDate 
        })

    # Perform backup actions...
    Write-Host "Performing backup actions for $webAppName..."
    foreach ($logFile in $logFilesToBackup) {
        $logFileName = $logFile.name
        $logFileUrl = $logFile.href
        Write-Host "Backing up log file: $logFileName"
        $blobName = "$webAppName/$($logFileUrl.Substring($logFileUrl.LastIndexOf("/") + 1))"
        Start-AzStorageBlobCopy -SrcUri $logFileUrl -DestContainer $containerName -DestBlob $blobName -Context $storageAccountContext
    }
    
    # Perform deletion actions...
    Write-Host "Deleting log files older than $numberOfDays days from $webAppName..."
    foreach ($logFile in $logFilesToBackup) {
        $logFileName = $logFile.name
        Write-Host "Deleting log file: $logFileName"
        Invoke-RestMethod -Uri $logFileUrl -Headers @{Authorization=("Basic $base64AuthInfo")} -Method DELETE
    } 
  1. 这是复制到 blob 时的警告消息(没有复制任何内容)

警告:忽略不匹配的源存储上下文。源 uri 为 https://wa01.scm.azurewebsites.net/api/vfs/LogFiles/kudu/,终点为 https://sa01.blob。 core.windows.net/.

  1. 这是删除操作的错误(需要强制删除活动)

Invoke-RestMethod : {"Message":"无法删除目录。它要么不为空,要么不允许访问。"}

目的是将文件和目录复制到存储帐户容器,并在复制后从 webapp 中删除

azure powershell azure-blob-storage azure-powershell azure-webapps
1个回答
0
投票

要将文件和目录复制到存储帐户容器,并在复制后使用 PowerShell 从 Web 应用程序中删除:

为了防止从 Kudu 应用日志文件复制日志文件时出现 URI 不匹配警告,最好将所有日志文件复制到本地路径以便于访问。下载后,您可以将其上传到blob存储容器。

详细脚本如下:

$webAppName  = "appsjl"
$resourceGroupName = "xxx"
$storageAccountName = "newaccs"
$containerName = "latest"
$numberOfDays = 90
$kuduApiUrl = "https://${webAppName}.scm.azurewebsites.net/api/vfs/LogFiles/"
Write-Host "Retrieving publishing profile for $webAppName..."
$publishingProfile = Get-AzWebAppPublishingProfile -ResourceGroupName $resourceGroupName -Name $webAppName
[xml]$publishingProfileXml = $publishingProfile
$publishingUserName = $publishingProfileXml.publishData.publishProfile[0].userName
$publishingPassword = $publishingProfileXml.publishData.publishProfile[0].userPWD
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("${publishingUserName}:${publishingPassword}"))
Write-Host "Retrieving log files from $webAppName..."
$response = Invoke-RestMethod -Uri $uri -Headers $headers -Method GET
$dateTimeValues = $response | Where-Object { $_.mtime -ne $null } | ForEach-Object {
    $mtimeValue = $_.mtime.Split('.')[0]  # Remove milliseconds
    [DateTime]::ParseExact($mtimeValue, "yyyy-MM-dd'T'HH:mm:ss", [System.Globalization.CultureInfo]::InvariantCulture)
}

下载到本地路径的脚本:

foreach ($logFile in $response) {
$logFileName = $logFile.name
$logFileUrl = $logFile.href
$localpath = "<localfilepath to download the logfiles>"
Invoke-WebRequest -Uri $logFileUrl -Headers $headers -OutFile $localpath
$blobName = "$webAppName/$logFileName"
$key = "xxxxSe6Q=="
$context = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $key
Set-AzStorageBlobContent -File $localpath -Container $containerName -Blob $blobName -Context $context

输出:

下载到本地文件夹路径:

enter image description here

enter image description here

存储块:

enter image description here

enter image description here

要删除它们,您使用的命令是合适的。确保所有参数都已正确给出并尝试执行相同的命令。

参考

Set-AzStorageBlobContent

© www.soinside.com 2019 - 2024. All rights reserved.