使用 Azure Function 查找空闲虚拟机并解除分配它们
Finding idle Virtual Machines and deallocating them using Azure Function
我正在创建一个 Azure 函数,它将找到空闲或未使用的虚拟机以解除分配它们。 Azure Functions 现在能够找到 所有 的虚拟机 运行 并且能够解除分配它们。
现在,如果 VM 处于空闲状态或没有进程 运行 或者没有用户登录,我该如何查找?或任何其他参数。
- 我尝试使用 运行 命令查找 CPU 用法,但不知何故未能执行(可能是由于权限问题);
- 我尝试从 Azure Monitor > 指标获取数据 - 失败。
- 尝试在文档中查找,没有得到任何相关结果。
[FunctionName("DeallocateVM")]
public static void DeallocateVM([TimerTrigger("0 0 * * * *")]TimerInfo myTimer, ILogger log)
{
var credentials = SdkContext.AzureCredentialsFactory.FromServicePrincipal(ClientId, ClientSecret, TenantId, AzureEnvironment.AzureGlobalCloud);
var azure = Azure.Configure().WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic).Authenticate(credentials).WithDefaultSubscription();
var VirtualMachinesList = azure.VirtualMachines.List();
foreach (var Vm in VirtualMachinesList)
{
log.LogInformation($"{Vm.Name}\t{Vm.ProvisioningState}\t{Vm.PowerState}\t{Vm.ResourceGroupName}\t{Vm.OSType}\t{Vm.OSDiskSize}");
if (Vm.PowerState == PowerState.Running)
{
if (Vm.IsIdle())
Vm.DeallocateAsync(); //Deallocate the VM
}
}
}
static bool IsIdle(this IVirtualMachine virtualMachine)
{
return true; //How to find a VM is idle or not?
}
我希望只有空闲 VM 被释放,但目前,所有 Vms 都被释放。
您可以使用 Monitor SDK
获得 metrics
。示例:
var serviceCreds = ApplicationTokenProvider.LoginSilentAsync(azureTenantId, azureAppId, azureSecretKey).Result;
MonitorClient monitorClient = new MonitorClient(serviceCreds) { SubscriptionId = subscriptionId };
var resourceUrl = $"subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/virtualMachines/{machineName}";
var metricNames = "(name.value eq 'Disk Write Operations/Sec' or name.value eq 'Percentage CPU' or name.value eq 'Network In' or name.value eq 'Network Out' or name.value eq 'Disk Read Operations/Sec' or name.value eq 'Disk Read Bytes' or name.value eq 'Disk Write Bytes')";
string timeGrain = " and timeGrain eq duration'PT5M'";
string startDate = " and startTime eq 2017-10-26T05:28:34.919Z";
string endDate = " and endTime eq 2017-10-26T05:33:34.919Z";
var odataFilterMetrics = new ODataQuery<MetricInner>(
$"{metricNames}{timeGrain}{startDate}{endDate}");
var metrics = monitorClient.Metrics.ListWithHttpMessagesAsync(resourceUrl, odataFilterMetrics).Result;
我正在创建一个 Azure 函数,它将找到空闲或未使用的虚拟机以解除分配它们。 Azure Functions 现在能够找到 所有 的虚拟机 运行 并且能够解除分配它们。
现在,如果 VM 处于空闲状态或没有进程 运行 或者没有用户登录,我该如何查找?或任何其他参数。
- 我尝试使用 运行 命令查找 CPU 用法,但不知何故未能执行(可能是由于权限问题);
- 我尝试从 Azure Monitor > 指标获取数据 - 失败。
- 尝试在文档中查找,没有得到任何相关结果。
[FunctionName("DeallocateVM")]
public static void DeallocateVM([TimerTrigger("0 0 * * * *")]TimerInfo myTimer, ILogger log)
{
var credentials = SdkContext.AzureCredentialsFactory.FromServicePrincipal(ClientId, ClientSecret, TenantId, AzureEnvironment.AzureGlobalCloud);
var azure = Azure.Configure().WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic).Authenticate(credentials).WithDefaultSubscription();
var VirtualMachinesList = azure.VirtualMachines.List();
foreach (var Vm in VirtualMachinesList)
{
log.LogInformation($"{Vm.Name}\t{Vm.ProvisioningState}\t{Vm.PowerState}\t{Vm.ResourceGroupName}\t{Vm.OSType}\t{Vm.OSDiskSize}");
if (Vm.PowerState == PowerState.Running)
{
if (Vm.IsIdle())
Vm.DeallocateAsync(); //Deallocate the VM
}
}
}
static bool IsIdle(this IVirtualMachine virtualMachine)
{
return true; //How to find a VM is idle or not?
}
我希望只有空闲 VM 被释放,但目前,所有 Vms 都被释放。
您可以使用 Monitor SDK
获得 metrics
。示例:
var serviceCreds = ApplicationTokenProvider.LoginSilentAsync(azureTenantId, azureAppId, azureSecretKey).Result;
MonitorClient monitorClient = new MonitorClient(serviceCreds) { SubscriptionId = subscriptionId };
var resourceUrl = $"subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/virtualMachines/{machineName}";
var metricNames = "(name.value eq 'Disk Write Operations/Sec' or name.value eq 'Percentage CPU' or name.value eq 'Network In' or name.value eq 'Network Out' or name.value eq 'Disk Read Operations/Sec' or name.value eq 'Disk Read Bytes' or name.value eq 'Disk Write Bytes')";
string timeGrain = " and timeGrain eq duration'PT5M'";
string startDate = " and startTime eq 2017-10-26T05:28:34.919Z";
string endDate = " and endTime eq 2017-10-26T05:33:34.919Z";
var odataFilterMetrics = new ODataQuery<MetricInner>(
$"{metricNames}{timeGrain}{startDate}{endDate}");
var metrics = monitorClient.Metrics.ListWithHttpMessagesAsync(resourceUrl, odataFilterMetrics).Result;