背景
如果这似乎是一个信息不完整的问题,那就是。这是因为它与一个大型项目有关,该项目使用 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 命令。
想法?
更新
此页面详细讨论了可用的限制,例如:
但它并没有谈论如何衡量这些资源当前正在使用多少或剩余多少......这就是我想要找出的
有人可以解释发生了什么吗?