Azure Managed Disk 共享不灵,EventGrid + LogicApp 来搞
Posted wekang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Azure Managed Disk 共享不灵,EventGrid + LogicApp 来搞相关的知识,希望对你有一定的参考价值。
前言:
童鞋们估计已经抱怨过n次这个问题,为啥托管磁盘不能被用来制作镜像或者制作快照后在其他订阅或其它区域(Region)来创建虚拟机,说好的 Infrastructure as a code 呢,刚刚激动的做好了镜像,把应用架构描述成 infra code,一键点亮。跨了订阅,跨了区域玩不转啦,XX**。不要慌,这个事儿并非没有解,就是稍微麻烦,你可以把托管磁盘做导出到目标订阅或区域的存储账户,然后在目标订阅内或区域内创建镜像。一两个订阅还好,一大把订阅那不是很坑,本文后面就带大家以玩的心态,边了解 Azure 的新服务 EventGrid,LogicApp,ACI,然后一起来配合使用来实现跨订阅或跨地域的托管磁盘的自动导出拷贝。
架构逻辑:
通过 EventGrid 来监听 VM 创建事件,当事件发生后,LogicApp 作为该事件的 Subscriber 消费者,触发自动化流水线,将该虚拟机的磁盘拷贝到目的订阅或目的区域的存储账户中,拷贝过程通过azcopy来完成,选择azcopy的原因速度块。整个架构中采用 Severless 的思路,所以将 azcopy 封装到一个做好的容器镜像中,在调用时通过在 Serverless 的 Azure Container Instance 中进行执行,执行完毕资源回收,可以享受容器启动的敏捷性的同时实现按市场付费计算资源的要求。
逻辑实现细节:
整个逻辑实现的重点在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 } 以上是关于Azure Managed Disk 共享不灵,EventGrid + LogicApp 来搞的主要内容,如果未能解决你的问题,请参考以下文章VMSS上用Managed Disk和Data Disk进行自动扩展
VMSS上用Managed Disk和Data Disk进行自动扩展
通过Azure File Service搭建基于iscsi的共享盘
如何从用于 vm 的 Azure Python SDK 获取 OS 磁盘相关的详细信息
把ASM下的HDD VM转换成ARM下Managed Disk的SSD VM
如何在 Azure Function 中使用 Azure Managed Identity 通过触发器访问 Service Bus?