如果这似乎是一个信息不完整的问题,那就是。这是因为它与一个大型项目有关,该项目使用Azure自动提供和缩放和缩减大量虚拟机,这是由第三方移交给我们的,我们无法理解某些问题。但我会尽力解释
我们正在使用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控制台
中的 resources 部分并以某种方式来了解我已经消耗了多少允许的资源。我需要有一个想法,例如:哦你按照你允许的公共ips等45%的比例消耗,这样我知道我是否安全或者我是否需要再次运行purge命令。
想法?
This page详细讨论了可用的限制,例如:
但它没有讨论如何衡量目前正在使用多少这些资源或剩下多少......这就是我想要找到的东西
有人可以解释发生了什么吗?
答案 0 :(得分:3)
答案 1 :(得分:2)
您可以通过编程方式找到它们,但每个提供程序都会调度它:
对于更多基于事件的编程,很可能有一种方法可以自动警告事件网格和/或逻辑应用程序和/或Azure监视器。