參考資料:
- Manage anonymous read access to containers and blobs
- 使用 Azure CLI 搭配 Azure 儲存體
- Transfer data with the AzCopy Command-Line Utility
- 建立新的 Resource:US,歸屬定 West US
- 建立 Virtual Network、Subnet
- 建立 Storage account,此乃資料儲存帳號
- 將原本所在的 Image (vhd) 複製到新的 Storage account
- 建立 Network Interface Controller
- 將原本的 template.json 修改,把storage account更新至新的區域
- 即可建置新機器
建立位於 West US 的 Resource Group: US
$ azure group create US westus --subscription MySubscription
info: Executing command group create
+ Getting resource group US
+ Creating resource group US
info: Created resource group US
data: Id: /subscriptions/MySubscription/resourceGroups/US
data: Name: US
data: Location: westus
data: Provisioning State: Succeeded
data: Tags: null
data:
info: group create command OK建立 Virtual Network (也可多用 -a 10.1.0.0/16 來限制 address prefix)
$ azure network vnet create US USVirtualNetwork westus --subscription MySubscription
info: Executing command network vnet create
warn: Using default address prefix: 10.0.0.0/8
+ Looking up the virtual network "USVirtualNetwork"
+ Creating virtual network "USVirtualNetwork"
data: Id : /subscriptions/MySubscription/resourceGroups/US/providers/Microsoft.Network/virtualNetworks/USVirtualNetwork
data: Name : USVirtualNetwork
data: Type : Microsoft.Network/virtualNetworks
data: Location : westus
data: Provisioning state : Succeeded
data: Address prefixes:
data: 10.0.0.0/8
info: network vnet create command OK建立 Subnet
$ azure network vnet subnet create US USVirtualNetwork default -a 10.1.0.0/16 --subscription MySubscription
info: Executing command network vnet subnet create
+ Looking up the virtual network "USVirtualNetwork"
+ Looking up the subnet "default"
+ Creating subnet "default"
data: Id : /subscriptions/MySubscription/resourceGroups/US/providers/Microsoft.Network/virtualNetworks/USVirtualNetwork/subnets/default
data: Name : default
data: Provisioning state : Succeeded
data: Address prefix : 10.1.0.0/16
info: network vnet subnet create command OK接著建議從 Azure Portal Web UI 建立 storage account ,大多採預設即可,需留意區域位置以及採用的 resource group,此例帳號名稱為 myusstorageaccount,而使用 azure 操作 storage 行為時,必須使用 storage access key,於是就 azure cli 先列出一下(也可以在 Azure Portal 找到)
$ azure storage account keys list myusstorageaccount --resource-group US --subscription MySubscription
info: Executing command storage account keys list
+ Getting storage account keys
data: Name Key Permissions
data: ---- -------------- -----------
data: key1 111111111111== Full
data: key2 222222222222== Full
info: storage account keys list command OK建立 system container(後續 AZURE_STORAGE_ACCOUNT 跟 AZURE_STORAGE_ACCESS_KEY 都會接在指令前面,方便 debug 用途)
$ AZURE_STORAGE_ACCOUNT=myusstorageaccount AZURE_STORAGE_ACCESS_KEY=111111111111== azure storage container create system
info: Executing command storage container create
+ Creating storage container system
+ Getting storage container information
data: {
data: name: 'system',
data: metadata: {},
data: etag: '"################"',
data: lastModified: 'Thu, 04 Aug 2016 12:01:14 GMT',
data: lease: { status: 'unlocked', state: 'available' },
data: requestId: '############################',
data: publicAccessLevel: 'Off'
data: }
info: storage container create command OK接著,要把 Image copy 過來,這邊有些小細節要留意的,第一存取權限,第二這是非同步複製的。對於存取權限部分,請先將來源的 storage account 裡的 system container 的存取權限更新為 Blob 模式(此模式是必須知道完整的 URL 才能下載),預設是 private 模式(需搭配AZURE_STORAGE_ACCOUNT/AZURE_STORAGE_ACCESS_KEY才能),還有另一個是 Container 模式(這也是公開的,比 Blob 模式多了 listing 功能)。由於 azure storage blob 指令操作,對於 source 是 private 權限一直沒有成功 orz 且範例都是 Blob 的,只好忍痛跟著用了 Orz
以下是 source 為 private 權限,但 copy 一直沒成功(狀態會顯示success),但找不到資料的:
$ AZURE_STORAGE_ACCOUNT=myusstorageaccount AZURE_STORAGE_ACCESS_KEY=111111111111== azure storage blob copy start https://sourceaccount.blob.core.windows.net/system/Microsoft.Compute/Images/vhds/my-vm-osDisk.12345-23456-34567-45678.vhd system -a sourceaccount -k sourceaccount_KEY
info: Executing command storage blob copy start
- Start copying blob https://sourceaccount.blob.core.windows.net/system/Microsoft.Compute/Images/vhds/my-vm-osDisk.12345-23456-34567-45678.vhd
data: Copy ID Status
data: ------------------------------------ -------
data: #################################### success
info: storage blob copy start command OK而將 source 更新為 Blob 存取權限後,就可以看到 Status 會顯示 pending 且約2~3分鐘,連 Azure Portal Web UI / Azure cli 都會找到!
$ AZURE_STORAGE_ACCOUNT=myusstorageaccount AZURE_STORAGE_ACCESS_KEY=111111111111== azure storage blob copy start https://sourceaccount.blob.core.windows.net/system/Microsoft.Compute/Images/vhds/my-vm-osDisk.12345-23456-34567-45678.vhd system
info: Executing command storage blob copy start
- Start copying blob https://sourceaccount.blob.core.windows.net/system/Microsoft.Compute/Images/vhds/my-vm-osDisk.12345-23456-34567-45678.vhd
data: Copy ID Status
data: ------------------------------------ -------
data: #################################### pending
info: storage blob copy start command OK
$ AZURE_STORAGE_ACCOUNT=myusstorageaccount AZURE_STORAGE_ACCESS_KEY=111111111111== azure storage blob show
info: Executing command storage blob show
Container name: system
Blob name: Microsoft.Compute/Images/vhds/my-vm-osDisk.12345-23456-34567-45678.vhd
+ Getting storage blob information
data: Property Value
data: ------------- ----------------------------------------------------------------------------------------------------
data: container system
data: name Microsoft.Compute/Images/vhds/my-vm-osDisk.12345-23456-34567-45678.vhd
data: blobType PageBlob
data: contentLength 1234567890
data: contentType application/octet-stream
data: contentMD5 ############==
info: storage blob show command OK當複製完畢後(其實我也看不懂 azure storage blob show 的回報,也沒寫複製進度...),剩下就是建構一台機器的流程,包含建立 public ip、網路卡(NIC)、使用 template.json 發布。
如果你沒有把 Image 搬過來,直接用原本 template.json 開機器,會看到以下訊息(若同一個 storage account 則沒有問題):
error: Deployment provisioning state was not successful
error: Source and destination storage accounts for disk my-vm-osDisk.12345-23456-34567-45678.vhd are different.若資料還沒搬完,會看到:
error: Deployment provisioning state was not successful
error: The resource operation completed with terminal provisioning state 'Failed'.
error: Disk image https://myusstorageaccount.blob.core.windows.net/system/Microsoft.Compute/Images/vhds/my-vm-osDisk.12345-23456-34567-45678.vhd is in Pending state. Please retry when image is ready.建立 IP:
$ azure network public-ip create US ip-my-server -l westus --subscription MySubscription建立網卡:
$ azure network nic create US nic-my-server -k default -m USVirtualNetwork -l westus --subscription MySubscription或給予 public ip:
$ azure network nic create US nic-my-server -k default -m USVirtualNetwork -l westus --subscription MySubscription -p ip-my-server建立機器:
$ azure group deployment create US -f my-servier-template.json --subscription MySubscription -p '{"vmName":{"value":"my-server"},"networkInterfaceId":{"value":"/subscriptions/MySubscription/resourceGroups/US/providers/Microsoft.Network/networkInterfaces/nic-my-server"}}'