使用 Azure Function 查找空闲虚拟机并解除分配它们

Finding idle Virtual Machines and deallocating them using Azure Function

我正在创建一个 Azure 函数,它将找到空闲或未使用的虚拟机以解除分配它们。 Azure Functions 现在能够找到 所有 的虚拟机 运行 并且能够解除分配它们。

现在,如果 VM 处于空闲状态或没有进程 运行 或者没有用户登录,我该如何查找?或任何其他参数。

[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;