Ostatnio pisałem jak przenosić usługi między grupami zasobów, alternatywą do tej operacji jest skopiowanie blobów np. dysków twardych maszyn wirtualnych między różnymi kontami magazynu. Co najważniejsze konta nie muszą nawet znajdować się w tej samej subskrypcji.
Należałoby zacząć od zaopatrzenia się w narzędzie AzCopy – jest ono częścią pakietu Azure Storage Tools. Po instalacji można działać. Odpalamy linię komend, przechodzimy do folderu gdzie znajduje się narzędzie – domyślnie jest to C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy. Wszelkie komendy inicjujemy poleceniem azcopy.
1 |
C:\Program Files (x86)\Microsoft SDKs\Azure\AzCopy>azcopy |
Aby przekopiować bloby między kontami potrzebne będą:
- klucze dostępowe źródłowego i docelowego konta magazynu
- bezpośredni link do kontenera zawierającego kopiowane bloby
- bezpośredni link do kontenera docelowego
Klucze dostępowe dla konta magazynu znajdują się w portalu Azure w ustawieniach konta magazynu, po kliknięciu Access Keys:
Kopiujemy wartość pola key1 i wklejamy najlepiej do notatnika. Czynność powtarzamy dla docelowego konta magazynu.
Link do kontenera zawierającego kopiowane bloby sprawdzimy wchodząc w konto magazynu, klikając Blobs, następnie prawym przyciskiem na nazwie kontenera i wybierając Properties. Link znajduje się w polu URL.
Tak samo jak w przypadku klucza, link kopiujemy najlepiej do notatnika i czynności powtarzamy dla konta docelowego.
Uzbrojeni w te informacje możemy przystąpić do kopiowania blobów. UWAGA – do kopiowania blobów między kontami magazynu najlepiej użyć maszyny wirtualnej (szczególnie jeśli będziemy kopiować duże bloby np. dyski twarde vhd). Znacznie przyśpieszy to czas kopiowania niż w przypadku gdybyśmy użyli w tym celu naszego komputera. No chyba że Twój komputer tak jak i magazyn Azure znajduje się w jednym z centrów danych Microsoft 🙂
Aby skopiować wszystko co znajduje się w danym kontenerze należy w komendzie azcopy użyć przełącznika /s, dodatkowo aby przyśpieszyć kopiowanie można użyć /synccopy.
1 |
azcopy /source:https://chmuroman.blob.core.windows.net/vhds /Dest:https://testblobstor.blob.core.windows.net/vhds /sourcekey:<klucz_konta_zrodlowego> /destkey:<klucz_konta_docelowego> /s /synccopy |
Dodatkowo możemy zawęzić ilość kopiowanych blobów podając ich prefix za pomocą opcji /Pattern np. wszystkie bloby zaczynające się od „OS”
1 |
azcopy /source:https://chmuroman.blob.core.windows.net/vhds /Dest:https://testblobstor.blob.core.windows.net/vhds /sourcekey:<klucz_konta_zrodlowego> /destkey:<klucz_konta_docelowego> /s /synccopy /Pattern: os |
Z pomocą AzCopy możemy ściągnąć wszystkie bloby z konta magazynu na komputer
1 |
azcopy /source:https://chmuroman.blob.core.windows.net/vhds /Dest:C:\folder /SourceKey:<klucz_konta_zrodlowego> /s |
lub w drugą stronę, wgrać coś z komputera do konta magazynu
1 |
azcopy /source:C:\folder /Dest:https://chmuroman.blob.core.windows.net/vhds /DestKey:<klucz_konta_docelowego> /Pattern:disk1.vhd |
Update: wykorzystanie Powershell do operacji na blobach
Możemy również wykorzystać Powershell aby zarządzać blobami. Należy zacząć od utworzenia kontekstu konta magazynu na którym będziemy wykonywać operacje.
1 |
$ctx = New-AzureStorageContext -StorageAccountName "nazwa_konta_magazynu" -StorageAccountKey "klucz_konta_magazynu" |
Wgranie wszystkich plików z danego folderu do kontenera konta magazynu, którego kontekst podamy:
1 |
Get-ChildItem –Path C:\folder\* | Set-AzureStorageBlobContent -Container "nazwa_kontenera" -Context $ctx |
Ściągnięcie bloba lokalnie na komputer:
1 2 |
$blob = Get-AzureStorageBlob -Container "nazwa_kontenera" -Context $ctx -Blob "nazwa_bloba" $blob | Get-AzureStorageBlobContent -Destination "C:\folder" -Context $ctx |
Ewentualnie aby ściągnąć wszystkie bloby z kontenera trzeba usunąć parametr -Blob w cmdlet Get-AzureStorageBlob.
Kopiowanie blobów między kontami magazynu wymaga trochę więcej kodu:
1 2 3 4 5 6 7 8 9 10 11 12 |
$srcUri = "URI_do_kopiowanego_bloba" $srcstorageacc = "nazwa_konta_źródłowego" $srcstoragekey = "klucz_konta_źródłowego" $deststorageacc = "nazwa_konta_docelowego" $destsoragekey = "klucz_konta_docelowego" $srcContext = New-AzureStorageContext -StorageAccountName $srcstorageacc -StorageAccountKey $srcstoragekey $destContext = New-AzureStorageContext -StorageAccountName $deststorageacc -StorageAccountKey $destsoragekey $destcontainername = "nazwa_kontenera_docelowego" #Stop-AzureRmVM #ewentualnie wyłączamy maszynę wirtualną jeśli kopiujemy dysk vhd do niej podłączony $blob = Start-AzureStorageBlobCopy -srcuri $srcUri -SrcContext $srcContext -DestContainer $destcontainername -DestContext $destContext |