1

背景

如果这似乎是一个信息不完整的问题,那就是。这是因为它与一个大型项目有关,该项目使用 Azure 自动预配、扩展和缩减大量 VM,这是由第三方交给我们的,我们无法理解一些问题。但我会尽力解释

我们正在使用 python 的 Azure SDK来启动 Azure VM,杀死它们等。请参阅启动 azure vms 的方法中使用的此代码:

    #Get VMs info. do it via minimum calls to speed up things
    started_on = time.time()
    while True:
        try:
            time.sleep(5)
            vm = compute_client.virtual_machines.get(self.resource_group, vm_name)
            break

问题

有时当我们运行这个命令时,我们会得到这个错误:

aioc.logic.connectors.azure:2017-08-17 08:39:45,709 | ERROR | Stop waiting for VM auto-acfinH-25 to finish
Traceback (most recent call last):
  File "/home/aioc/aioc/aioc/logic/connectors/azure.py", line 126, in start
    vm = compute_client.virtual_machines.get(self.resource_group, vm_name)
  File "/home/aioc/venv/lib/python3.4/site-packages/azure/mgmt/compute/compute/v2016_04_30_preview/operations/virtual_machines_operations.py", line 369, in get
    raise exp
msrestazure.azure_exceptions.CloudError: Azure Error: ResourceNotFound
Message: The Resource 'Microsoft.Compute/virtualMachines/auto-acfinH-25' under resource group 'AIOCBot' was not found.
aioc.logic.main_controller_logic:2017-08-17 08:39:45,978 | ERROR | An error occurred while checking Vm with id '599553cdc1462e3a828c66da' machine id '328'
Traceback (most recent call last):
  File "/home/aioc/aioc/aioc/logic/main_controller_logic.py", line 41, in run_vm_controller
    started_vms = vmc.start(vm.machine_type, 1)
  File "/home/aioc/aioc/aioc/logic/connectors/azure.py", line 135, in start
    vm_net_interface = network_client.network_interfaces.get(self.resource_group, vm_name)
  File "/home/aioc/venv/lib/python3.4/site-packages/azure/mgmt/network/v2017_03_01/operations/network_interfaces_operations.py", line 171, in get
    raise exp
msrestazure.azure_exceptions.CloudError: Azure Error: ResourceNotFound

经过调查,事实证明这是发生在 b/c 我们在 azure 的资源已经用尽(?)。解决此问题的方法是使用以下方法清除所述资源:

def cleanup_all(self):
    """
    Clean up all auto-created resources
    """
    compute_client = ComputeManagementClient(self.credentials, self.subscription_id)
    network_client = NetworkManagementClient(self.credentials, self.subscription_id)
    resource_client = ResourceManagementClient(self.credentials, self.subscription_id)

    l = resource_client.resources.list()
    for r in [r for r in l if r.name.startswith('auto-')]:
        try:
            if 'publicIPAddresses' in r.type:
                rs = network_client.public_ip_addresses.delete(self.resource_group, r.name)
                rs.wait()
            elif 'Microsoft.Network' in r.type: 
                rs = network_client.network_interfaces.delete(self.resource_group, r.name)
                rs.wait()
            elif 'Microsoft.Compute/virtualMachines' in r.type:
                rs = compute_client.virtual_machines.delete(self.resource_group, r.name)
                rs.wait()
        except:
            log.warn("Failed to stop resource: %s with type: %s", r.name, r.type, exc_info=1)

这太棒了。但是,出于业务原因,我们不能简单地 - 创建一个定期运行此命令的 cron 作业 - 不能以任何自动方式运行它 b/c 它会同时影响许多不同的环境(即 prod/demo/stage/dev)副作用太大,难以理解。

这意味着我们必须定期运行此命令,每隔一段时间,一旦我们同意所有环境都清晰且准备就绪。

问题

我想看看我的 Azure 控制台中的资源部分

在此处输入图像描述

并有办法找出我消耗了多少允许的资源。例如,我需要有一个想法:哦,顺便说一下,你已经消耗了 45% 的允许公共 ip 等,这样我就知道我是否安全,或者我是否需要再次运行 purge 命令。

想法?

更新

此页面详细讨论了可用的限制,例如:

在此处输入图像描述

但它并没有谈论如何衡量这些资源当前正在使用多少或剩余多少......这就是我想要找出的

有人可以解释发生了什么吗?

4

2 回答 2

3

部分回答你的问题。对于手册,您可以在 Azure 门户本身上找到此信息。点击“订阅”,然后从订阅列表中选择您的订阅,然后选择“使用+配额”。

在此处输入图像描述

于 2017-08-18T11:52:30.940 回答
2

您可以通过编程方式找到它们,但这是按提供者分派的:

对于更多基于事件的编程,很可能有一种方法可以插入事件网格和/或逻辑应用程序和/或 Azure Monitor 以自动发出警告。

于 2017-08-18T16:19:34.510 回答