Η μεταφορά ή η αντιγραφή των Virtual Machines μεταξύ συνδρομών (Subscriptions) ή Storage Accounts είναι εφικτή μέσω της αντιγραφής των VHDs. Η αντιγραφή των VHDs, ή οποιουδήποτε άλλου blob, είναι μία εγγενής δυνατότητα του Windows Azure που γίνεται μέσω του blob copy API. Για λεπτομέρειες σχετικά με το Windows Azure Storage πατήστε εδώ
Στο άρθρο αυτό θα δούμε πως μπορούμε να αντιγράψουμε VHDs με την χρήση του PowerShell. Πριν ξεκινήσουμε, σκόπιμο είναι να αναφέρουμε πως υπάρχει η δυνατότητα αντιγραφής μεταξύ των:
- Containers του ίδιου Storage Account
- Διαφορετικών Storage Accounts της ίδια συνδρομής (Subscription)
- Διαφορετικών συνδρομών στο ίδιο Data Center
- Διαφορετικών Data Centers
Όπως είναι αναμενόμενο, ο χρόνος διάρκειας της αντιγραφής σε κάθε μία από τις παραπάνω περιπτώσεις είναι διαφορετικός πράγμα που οφείλεται στην αρχιτεκτονική του Windows Azure. To Windows Azure κατανέμει τους πόρους του Windows Azure Storage σε storage stamps που στην ουσία είναι συστοιχίες από Servers και δίσκους. Έτσι η αντιγραφή μέσα στο ίδιο storage stamp είναι ταχύτατη ενώ μεταξύ διαφορετικών storage stamps διαρκεί λίγο περισσότερο.
Ας δούμε όμως πως μπορούμε να πραγματοποιήσουμε την αντιγραφή των VHDs με την χρήση του PowerShell.
# Select Default Subscription Select-AzureSubscription -SubscriptionName "MSDN-Kappas" # Define Source VHD: This is the system disk of an ADFS server $SourceFileURI = "https://support22stor.blob.core.windows.net/vhds/vnetadfs-07-10.vhd" # Define Source Storage Account $SourceStorageAccount = "support22stor" $SourceStorageAccountKey = "tDSNGyuDHWkrrA2vF/7pFiA==" # Define Destination Storage Account, in this demo we use the same as the source $DestStorageAccount = "support22stor" $DestStorageAccountKey = "tDSNGyuDfG/dLfPsvFiA==" # Source Storage Context creation $SrcContext = New-AzureStorageContext -StorageAccountName $SourceStorageAccount ` -StorageAccountKey $SourceStorageAccountKey # Destination Storage Context creation $DestContext = New-AzureStorageContext -StorageAccountName $DestStorageAccount ` -StorageAccountKey $DestStorageAccountKey # Create a container in destination storage account $NewContainer = "copiedvhds" New-AzureStorageContainer -Name $NewContainer -Context $DestContext # Starting the blob copy. Copy is asynchronous $cpblob = Start-AzureStorageBlobCopy -SrcUri $SourceFileURI -srcContext $SrcContext ` -DestContainer $NewContainer -DestContext $DestContext ` -DestBlob "vnetadfs-vnetadfs-copied.vhd"
Η αντιγραφή γίνεται με την εντολή Start-AzureStorageBlobCopy αφού όμως έχουμε ορίσει το αρχείο προέλευσης και προορισμού και έχουμε δώσει στοιχεία για την πρόσβαση στα Storage Accounts μέσω των Contexts.
Η διαδικασία της αντιγραφής είναι ασύγχρονη και μπορούμε να ξεκινήσουμε πολλές αντιγραφές παράλληλα.
Για να δούμε την πρόοδο της αντιγραφής χρησιμοποιούμε την εντολή Get-AzureStorageBlobCopyState και εάν προσθέσουμε ένα While Loop μπορούμε να έχουμε συνεχή ενημέρωση για την πρόοδο της αντιγραφής.
# Retrieve the progress of the Copy $status = $cpblob | Get-AzureStorageBlobCopyState # Show the progress $status # If you like you can print the status until the copy is completed while ($status.Status -eq "Pending") { $status = $cpblob | Get-AzureStorageBlobCopyState Start-Sleep 10 $status }