Azure Managed Disk 共享不灵,EventGrid + LogicApp 来搞

世事洞明皆学问,人情练达即文章。这篇文章主要讲述Azure Managed Disk 共享不灵,EventGrid + LogicApp 来搞相关的知识,希望能为你提供帮助。
前言:
        童鞋们估计已经抱怨过n次这个问题,为啥托管磁盘不能被用来制作镜像或者制作快照后在其他订阅或其它区域(Region)来创建虚拟机,说好的 Infrastructure as a code 呢,刚刚激动的做好了镜像,把应用架构描述成 infra code,一键点亮。跨了订阅,跨了区域玩不转啦,XX**。不要慌,这个事儿并非没有解,就是稍微麻烦,你可以把托管磁盘做导出到目标订阅或区域的存储账户,然后在目标订阅内或区域内创建镜像。一两个订阅还好,一大把订阅那不是很坑,本文后面就带大家以玩的心态,边了解 Azure 的新服务 EventGrid,LogicApp,ACI,然后一起来配合使用来实现跨订阅或跨地域的托管磁盘的自动导出拷贝。
架构逻辑:

Azure Managed Disk 共享不灵,EventGrid + LogicApp 来搞

文章图片

        通过 EventGrid 来监听 VM 创建事件,当事件发生后,LogicApp 作为该事件的 Subscriber 消费者,触发自动化流水线,将该虚拟机的磁盘拷贝到目的订阅或目的区域的存储账户中,拷贝过程通过azcopy来完成,选择azcopy的原因速度块。整个架构中采用 Severless 的思路,所以将 azcopy 封装到一个做好的容器镜像中,在调用时通过在 Serverless 的 Azure Container Instance 中进行执行,执行完毕资源回收,可以享受容器启动的敏捷性的同时实现按市场付费计算资源的要求。
逻辑实现细节:
【Azure Managed Disk 共享不灵,EventGrid + LogicApp 来搞】        整个逻辑实现的重点在LogicApp,也就是自动化流水线的实现,流水线的规程可以参阅如下 LogicApp 的 Code,大家可以导入自己的环境在里面进行学习和修改。犯懒的童鞋也别难过,借此安利一把,Image 共享这个服务 Azure 平台马上会当作功能给到大家 Preview,点我了解更多
1 { 2"$connections": { 3"value": { 4"aci": { 5"connectionId": "/subscriptions/c04b3c63-8dfe-4f98-be18-e71ff67a1f4e/resourceGroups/eventgrid/providers/Microsoft.Web/connections/aci", 6"connectionName": "aci", 7"id": "/subscriptions/c04b3c63-8dfe-4f98-be18-e71ff67a1f4e/providers/Microsoft.Web/locations/southeastasia/managedApis/aci" 8}, 9"arm": { 10"connectionId": "/subscriptions/c04b3c63-8dfe-4f98-be18-e71ff67a1f4e/resourceGroups/eventgrid/providers/Microsoft.Web/connections/arm", 11"connectionName": "arm", 12"id": "/subscriptions/c04b3c63-8dfe-4f98-be18-e71ff67a1f4e/providers/Microsoft.Web/locations/southeastasia/managedApis/arm" 13}, 14"azureeventgrid": { 15"connectionId": "/subscriptions/c04b3c63-8dfe-4f98-be18-e71ff67a1f4e/resourceGroups/eventgrid/providers/Microsoft.Web/connections/azureeventgrid", 16"connectionName": "azureeventgrid", 17"id": "/subscriptions/c04b3c63-8dfe-4f98-be18-e71ff67a1f4e/providers/Microsoft.Web/locations/southeastasia/managedApis/azureeventgrid" 18} 19} 20}, 21"definition": { 22"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#", 23"actions": { 24"Compose": { 25"inputs": { 26"vmname": "@substring(body(\'Parse_JSON\')?[\'subject\'],add(16,lastIndexOf(body(\'Parse_JSON\')?[\'subject\'],\'virtualMachines/\')),sub(length(body(\'Parse_JSON\')?[\'subject\']),add(16,lastIndexOf(body(\'Parse_JSON\')?[\'subject\'],\'virtualMachines/\'))))" 27}, 28"runAfter": { 29"Parse_JSON": [ 30"Succeeded" 31] 32}, 33"type": "Compose" 34}, 35"Compose_2": { 36"inputs": "@triggerBody()", 37"runAfter": {}, 38"type": "Compose" 39}, 40"Compose_3": { 41"inputs": "@body(\'Parse_JSON_3\')?[\'storageProfile\'][\'osDisk\']", 42"runAfter": { 43"Parse_JSON_3": [ 44"Succeeded" 45] 46}, 47"type": "Compose" 48}, 49"Create_container_group": { 50"inputs": { 51"body": { 52"location": "southeastasia", 53"properties": { 54"containers": [ 55{ 56"name": "@{concat(\'azcp\',rand(1,100))}", 57"properties": { 58"command": [ 59"/bin/bash", 60"-c", 61"azcopy --destination $destination --source $source --dest-key $destkey" 62], 63"environmentVariables": [ 64{ 65"name": "destination", 66"value": "@{concat(\'https://diskclone.blob.core.windows.net/diskclone/\',outputs(\'Compose_3\')?[\'name\'])}" 67}, 68{ 69"name": "source", 70"value": "@body(\'mdsasurl\')?[\'accessSAS\']" 71}, 72{ 73"name": "destkey", 74"value": "yrbf9VRMOFN70+tAmoianfx1TGwJPAp+26aQ2g7EdB+4UqNBSoa3bJP9uEwJy2eGUz5y1NPnZx8XuKJP0W3p8w==" 75} 76], 77"image": "acrbuildpilot.azurecr.io/azcopy:v1", 78"resources": { 79"requests": { 80"cpu": 1, 81"memoryInGB": 1 82} 83} 84} 85} 86], 87"imageRegistryCredentials": [ 88{ 89"password": "iKccXllxyrn8aoSfPtQdUZTzDLIh/VRv", 90"server": "acrbuildpilot.azurecr.io", 91"username": "acrbuildpilot" 92} 93], 94"osType": "Linux", 95"restartPolicy": "Never" 96} 97}, 98"host": { 99"connection": { 100"name": "@parameters(\'$connections\')[\'aci\'][\'connectionId\']" 101} 102}, 103"method": "put", 104"path": "/subscriptions/@{encodeURIComponent(\'4507938f-a0ac-4571-978e-7cc741a60af8\')}/resourceGroups/@{encodeURIComponent(\'aci\')}/providers/Microsoft.ContainerInstance/containerGroups/@{encodeURIComponent(concat(\'azcp\', rand(1, 100)))}", 105"queries": { 106"x-ms-api-version": "2017-10-01-preview" 107} 108}, 109"runAfter": { 110"mdsasurl": [ 111"Succeeded" 112] 113}, 114"type": "ApiConnection" 115}, 116"Parse_JSON": { 117"inputs": { 118"content": "@outputs(\'Compose_2\')", 119"schema": { 120"properties": { 121"data": { 122"properties": { 123"authorization": { 124"properties": { 125"action": { 126"type": "string" 127}, 128"evidence": { 129"properties": { 130"role": { 131"type": "string" 132} 133}, 134"type": "object" 135}, 136"scope": { 137"type": "string" 138} 139}, 140"type": "object" 141}, 142"claims": { 143"properties": { 144"aio": { 145"type": "string" 146}, 147"appid": { 148"type": "string" 149}, 150"appidacr": { 151"type": "string" 152}, 153"aud": { 154"type": "string" 155}, 156"e_exp": { 157"type": "string" 158}, 159"exp": { 160"type": "string" 161}, 162"groups": { 163"type": "string" 164}, 165"http://schemas.microsoft.com/2012/01/devicecontext/claims/identifier": { 166"type": "string" 167}, 168"http://schemas.microsoft.com/claims/authnclassreference": { 169"type": "string" 170}, 171"http://schemas.microsoft.com/claims/authnmethodsreferences": { 172"type": "string" 173}, 174"http://schemas.microsoft.com/identity/claims/objectidentifier": { 175"type": "string" 176}, 177"http://schemas.microsoft.com/identity/claims/scope": { 178"type": "string" 179}, 180"http://schemas.microsoft.com/identity/claims/tenantid": { 181"type": "string" 182}, 183"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname": { 184"type": "string" 185}, 186"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name": { 187"type": "string" 188}, 189"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier": { 190"type": "string" 191}, 192"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname": { 193"type": "string" 194}, 195"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn": { 196"type": "string" 197}, 198"iat": { 199"type": "string" 200}, 201"in_corp": { 202"type": "string" 203}, 204"ipaddr": { 205"type": "string" 206}, 207"iss": { 208"type": "string" 209}, 210"name": { 211"type": "string" 212}, 213"nbf": { 214"type": "string" 215}, 216"onprem_sid": { 217"type": "string" 218}, 219"puid": { 220"type": "string" 221}, 222"uti": { 223"type": "string" 224}, 225"ver": { 226"type": "string" 227} 228}, 229"type": "object" 230}, 231"correlationId": { 232"type": "string" 233}, 234"operationName": { 235"type": "string" 236}, 237"resourceProvider": { 238"type": "string" 239}, 240"resourceUri": { 241"type": "string" 242}, 243"status": { 244"type": "string" 245}, 246"subscriptionId": { 247"type": "string" 248}, 249"tenantId": { 250"type": "string" 251} 252}, 253"type": "object" 254}, 255"dataVersion": { 256"type": "string" 257}, 258"eventTime": { 259"type": "string" 260}, 261"eventType": { 262"type": "string" 263}, 264"id": { 265"type": "string" 266}, 267"metadataVersion": { 268"type": "string" 269}, 270"subject": { 271"type": "string" 272}, 273"topic": { 274"type": "string" 275} 276}, 277"type": "object" 278} 279}, 280"runAfter": { 281"Compose_2": [ 282"Succeeded" 283] 284}, 285"type": "ParseJson" 286}, 287"Parse_JSON_2": { 288"inputs": { 289"content": "@outputs(\'Compose\')", 290"schema": { 291"properties": { 292"vmname": { 293"type": "string" 294} 295}, 296"type": "object" 297} 298}, 299"runAfter": { 300"Compose": [ 301"Succeeded" 302] 303}, 304"type": "ParseJson" 305}, 306"Parse_JSON_3": { 307"inputs": { 308"content": "@body(\'Read_a_resource\')?[\'properties\']", 309"schema": { 310"properties": { 311"hardwareProfile": { 312"properties": { 313"vmSize": { 314"type": "string" 315} 316}, 317"type": "object" 318}, 319"networkProfile": { 320"properties": { 321"networkInterfaces": { 322"items": { 323"properties": { 324"id": { 325"type": "string" 326} 327}, 328"required": [ 329"id" 330], 331"type": "object" 332}, 333"type": "array" 334} 335}, 336"type": "object" 337}, 338"osProfile": { 339"properties": { 340"adminUsername": { 341"type": "string" 342}, 343"computerName": { 344"type": "string" 345}, 346"linuxConfiguration": { 347"properties": { 348"disablePasswordAuthentication": { 349"type": "boolean" 350} 351}, 352"type": "object" 353}, 354"secrets": { 355"type": "array" 356} 357}, 358"type": "object" 359}, 360"provisioningState": { 361"type": "string" 362}, 363"storageProfile": { 364"properties": { 365"dataDisks": { 366"type": "array" 367}, 368"imageReference": { 369"properties": { 370"offer": { 371"type": "string" 372}, 373"publisher": { 374"type": "string" 375}, 376"sku": { 377"type": "string" 378}, 379"version": { 380"type": "string" 381} 382}, 383"type": "object" 384}, 385"osDisk": { 386"properties": { 387"caching": { 388"type": "string" 389}, 390"createOption": { 391"type": "string" 392}, 393"diskSizeGB": { 394"type": "number" 395}, 396"managedDisk": { 397"properties": { 398"id": { 399"type": "string" 400}, 401"storageAccountType": { 402"type": "string" 403} 404}, 405"type": "object" 406}, 407"name": { 408"type": "string" 409}, 410"osType": { 411"type": "string" 412} 413}, 414"type": "object" 415} 416}, 417"type": "object" 418}, 419"vmId": { 420"type": "string" 421} 422}, 423"type": "object" 424}

    推荐阅读