【问题标题】:Powershell script to create a snapshot and store it into a storage account in another location用于创建快照并将其存储到另一个位置的存储帐户的 Powershell 脚本
【发布时间】:2020-12-10 14:37:08
【问题描述】:

使用 powershell 脚本,我需要创建 VM 的快照并将快照保存在不同区域的存储帐户中。快照名称还应包含拍摄日期,以便在 30 天后自动删除。请让我知道如何实现这一目标。 我面临的另一个主要问题是如何在不直接在脚本中使用密钥的情况下将快照存储在存储帐户中。

这是我正在使用的旧脚本,它在快照名称功能中没有日期,并且直接在脚本中使用存储帐户密钥,这不安全。

 #powershell script to create a snapshot

Select-AzSubscription -SubscriptionName 'subs name'

$subscriptionId = 'xxxxxx'

$resourceGroupName = "Rgname"

$vmName="VMname"

$Location = "East US"

#how to get-date in the name of the snap
$snapshotName = "snapname"


$vmOSDisk=(Get-AzVM -ResourceGroupName $resourceGroupName -Name $vmName).StorageProfile.OsDisk.Name

$Disk = Get-AzDisk -ResourceGroupName $resourceGroupName -DiskName $vmOSDisk

$SnapshotConfig = New-AzSnapshotConfig -SourceUri $Disk.Id -CreateOption Copy -Location $Location

$Snapshot=New-AzSnapshot -Snapshot $snapshotConfig -SnapshotName `
      $snapshotName -ResourceGroupName $resourceGroupName






#powershell script to convert snapshot into managed disks
      
$diskName = 'ManagedDiskname'

#Provide the size of the disks in GB. It should be greater than the VHD file size.
$diskSize = '128'


$storageType = 'Premium_LRS'

Select-AzSubscription -SubscriptionId $SubscriptionId

$snapshot = Get-AzSnapshot -ResourceGroupName $resourceGroupName -SnapshotName $snapshotName 

$diskConfig = New-AzDiskConfig -SkuName $storageType -Location $location -CreateOption Copy -SourceResourceId $snapshot.Id

New-AzDisk -Disk $diskConfig -ResourceGroupName $resourceGroupName -DiskName $diskName






#powershell script to save managed disk into a storage account which is in a different location

$sasExpiryDuration = "3600"

$storageAccountName = "storageacctname"

$storageContainerName = "containername"

$storageAccountKey = '(Get-AzStorageAccountKey -ResourceGroupName "Snapshot-Powershell" -AccountName "storageforsnap")'

#Provide the key of the storage account where you want to copy the VHD of the managed disk. 
$storageAccountKey = 'xxxxxx'


$destinationVHDFileName = "vhdfilename"

. 
$useAzCopy = 1 


Select-AzSubscription -SubscriptionId $SubscriptionId


$sas = Grant-AzDiskAccess -ResourceGroupName $ResourceGroupName -DiskName $diskName -DurationInSecond $sasExpiryDuration -Access Read 


$destinationContext = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey

#Copy the VHD of the managed disk to the storage account
if($useAzCopy -eq 1)
{
    $containerSASURI = New-AzStorageContainerSASToken -Context $destinationContext -ExpiryTime(get-date).AddSeconds($sasExpiryDuration) -FullUri -Name $storageContainerName -Permission rw
    azcopy copy $sas.AccessSAS $containerSASURI

}else{

    Start-AzStorageBlobCopy -AbsoluteUri $sas.AccessSAS -DestContainer $storageContainerName -DestContext $destinationContext -DestBlob $destinationVHDFileName
}

【问题讨论】:

  • 能否详细描述您的问题?
  • 是否要实现快照自动删除?
  • 是的,这是其中一项任务。但是我遇到的主要问题是将快照保存在存储帐户中,当存储帐户和快照都位于不同的区域时。由于我不想将存储帐户密钥直接用于我的 powershell 脚本,因为这会产生安全问题。因此,任何其他实现相同目标的方法以及如何通过 powershell 实现它们都会很棒,比如使用 azure key vault 等
  • 使用 powershell,如何将存储帐户密钥存储在 azure key vault 中,然后检索这些密钥并使用它们进行身份验证并将快照/磁盘存储在该存储帐户中?

标签: azure powershell azure-powershell


【解决方案1】:

1. Azure 快照可在 30 天后自动删除

据我所知,Azure 不提供该功能。但是我们可以通过调度任务来实现。

例如

  1. Enable Run As account in Azure automation account

  2. 在自动化帐户中安装模块 Az.Automation Az.AccountsAz.Compute。安装方法请参考here

  3. 在自动化帐户中使用以下脚本创建 Azure Powershell Runbook。更多详情请参考here


#get the snpshots created before 30 days
Get-AzSnapshot| Where-Object{($_.TimeCreated -lt ([datetime]::UtcNow.AddDays(-30)))}
foreach($snp in $snps){
  $snp| Remove-AzSnapshot -Force
}
  1. Create a schedule for the Azure runbook.

2。如何安全地连接 Azure blob

如果您想安全地连接 Azure blob,我们可以使用 Azure AD auth 来实现它。更多详情请参考here

例如

  1. Storage Blob Data Contributor 角色分配给用户或sp
New-AzRoleAssignment -SignInName <email> `
    -RoleDefinitionName "Storage Blob Data Contributor" `
    -Scope  "/subscriptions/<subscription>/resourceGroups/sample-resource-group/providers/Microsoft.Storage/storageAccounts/<storage-account>"
  1. 脚本
Connect-AzAccount
$ResourceGroupName=""
$snapshotName=""
$sasExpiryDuration=3600

$sas =Grant-AzSnapshotAccess  -SnapshotName $snapshotName -ResourceGroupName $ResourceGroupName  -DurationInSecond $sasExpiryDuration -Access Read 

$storageAccountName=""
$destinationContext = New-AzStorageContext -StorageAccountName $storageAccountName -UseConnectedAccount

$storageContainerName="image"
$destinationVHDFileName="test.vhd"
Start-AzStorageBlobCopy -AbsoluteUri $sas.AccessSAS -DestContainer $storageContainerName -DestContext $destinationContext -DestBlob $destinationVHDFileName

#check copy state
Get-AzStorageBlobCopyState -Container $storageContainerName -Blob $destinationVHDFileName -Context $destinationContext

【讨论】:

  • 我在实现此脚本时遇到了身份验证问题,即使我拥有订阅的所有者访问权限。我已经粘贴了错误信息,如何解决?
  • Start-AzStorageBlobCopy:此请求无权使用此权限执行此操作。 HTTP 状态代码:403 - HTTP 错误消息:此请求无权使用此权限执行此操作。 ErrorCode: AuthorizationPermissionMismatch ErrorMessage: 此请求无权使用此权限执行此操作。
  • 我想我无法正确解释。我有一个 VM 和一个存储帐户,它们都位于不同的区域。使用 powershell 脚本,我创建了 VM 的快照,并使用此快照创建了一个托管磁盘。现在我想将此托管磁盘存储到存储帐户中的容器中,但不直接在脚本中提供存储帐户密钥。其他一些间接或通过 azure key vault 检索密钥的方法可能(如果可能的话)。
  • @atindra 请将Storage Blob Data Contributor 分配给您用于登录的帐户。
  • 我已经这样做了,仍然面临同样的错误。
猜你喜欢
  • 2019-07-05
  • 2021-08-25
  • 2017-06-28
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
相关资源
最近更新 更多