public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { try { log.LogInformation("Getting request body params"); string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); dynamic data = JsonConvert.DeserializeObject(requestBody); string subscriptionId = data?.subscriptionId; string resourceGroupName = data?.resourceGroupName; bool? useVmStartAwait = data?.wait; string vmName = data?.vmName; if (subscriptionId == null || resourceGroupName == null || vmName == null) { return(new BadRequestObjectResult("Please pass all 3 required parameters in the request body")); } if (useVmStartAwait == null) { useVmStartAwait = false; } log.LogInformation("Setting authentication to use MSI"); AzureCredentialsFactory f = new AzureCredentialsFactory(); var msi = new MSILoginInformation(MSIResourceType.AppService); var msiCred = f.FromMSI(msi, AzureEnvironment.AzureGlobalCloud); var azureAuth = Azure.Configure() .WithLogLevel(HttpLoggingDelegatingHandler.Level.BodyAndHeaders) .Authenticate(msiCred); log.LogInformation("Authenticating with Azure using MSI"); var azure = azureAuth.WithSubscription(subscriptionId); log.LogInformation("Acquiring VM from Azure"); var vm = azure.VirtualMachines.GetByResourceGroup(resourceGroupName, vmName); log.LogInformation("Checking VM Id"); log.LogInformation(vm.Id.ToString()); log.LogInformation("Checking VM Powerstate"); log.LogInformation("VM Powerstate : " + vm.PowerState.ToString()); bool vmStarting = false; if (vm.PowerState.ToString() == "PowerState/running") { log.LogInformation("VM is already running"); } else { if (useVmStartAwait.Value) { log.LogInformation("Async Starting vm " + vmName); await vm.StartAsync(); } else { log.LogInformation("Sync Starting vm " + vmName); vm.Start(); } vmStarting = true; } return(vmStarting == false ? (ActionResult) new OkObjectResult("VM was already started") : (ActionResult) new OkObjectResult("VM started")); } catch (System.Exception ex) { log.LogError(ex.Message); throw; } }
public static async Task Run([TimerTrigger("0 0 9 * * *")] TimerInfo myTimer, ILogger log) { log.LogInformation("Running Resource Tagger..."); string ownerTagName = Environment.GetEnvironmentVariable("OwnerTag"); if (String.IsNullOrEmpty(ownerTagName)) { log.LogCritical("Please set the OwnerTag environment variables"); return; } string subscriptionIds = Environment.GetEnvironmentVariable("SubscriptionIds"); if (String.IsNullOrEmpty(subscriptionIds)) { log.LogCritical("Please set the SubscriptionIds environment variables"); return; } Azure.IAuthenticated azure; AzureCredentials azureCreds; if (Environment.GetEnvironmentVariable("UseManagedIdendity") == "true") { log.LogInformation("Using Managed Identity"); AzureCredentialsFactory factory = new AzureCredentialsFactory(); MSILoginInformation msi = new MSILoginInformation(MSIResourceType.AppService); azureCreds = factory.FromMSI(msi, AzureEnvironment.AzureGlobalCloud); } else { log.LogInformation("Using Service Principal"); string clientId = Environment.GetEnvironmentVariable("ClientId"); string clientSecret = Environment.GetEnvironmentVariable("ClientSecret"); string tenantId = Environment.GetEnvironmentVariable("TenantId"); AzureCredentialsFactory factory = new AzureCredentialsFactory(); azureCreds = factory.FromServicePrincipal(clientId, clientSecret, tenantId, AzureEnvironment.AzureGlobalCloud); } azure = Azure.Configure().Authenticate(azureCreds); foreach (var subscriptionId in subscriptionIds.Split(",", StringSplitOptions.RemoveEmptyEntries)) { log.LogInformation($"Looking for new resources without an owner tag in subscription {subscriptionId}"); var azureSub = azure.WithSubscription(subscriptionId); var insightsClient = new Microsoft.Azure.Insights.InsightsClient(azureCreds); insightsClient.SubscriptionId = subscriptionId; var resourceGroups = azureSub.ResourceGroups.List(); foreach (var group in resourceGroups) { log.LogTrace($"Looking at resource group {group.Name}"); try { var defaultKeyValuePair = default(KeyValuePair <String, String>); var ownerTag = defaultKeyValuePair; if (group.Tags != null) { ownerTag = group.Tags.Where(tag => tag.Key.Equals(ownerTagName, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); } if (ownerTag.Equals(defaultKeyValuePair)) { String startTime = DateTime.Now.ToUniversalTime().AddHours(-25).ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); String endTime = DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); String resourceId = group.Id; string unknownOwner = "unknown"; string newOwner = unknownOwner; var resourceGroupCreateLogs = await GetCreationLogs(startTime, endTime, resourceId, OPERATION_RESOURCEGROUP_WRITE, insightsClient); if (resourceGroupCreateLogs.Length == 0) { log.LogInformation($"Resource group {group.Name}: did not find create operation - trying again"); startTime = DateTime.Now.ToUniversalTime().AddDays(-90).ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); resourceGroupCreateLogs = await GetCreationLogs(startTime, endTime, resourceId, OPERATION_RESOURCEGROUP_WRITE, insightsClient); } if (resourceGroupCreateLogs.Length != 0) { newOwner = resourceGroupCreateLogs[0].Caller; } if (!unknownOwner.Equals(newOwner)) { await group.Update().WithTag(ownerTagName, newOwner).ApplyAsync(); log.LogInformation($"Resource group {group.Name} tagged with owner {newOwner}"); } else { log.LogInformation($"Resource group {group.Name}: did not find create operation, please tag manually"); } } else { log.LogTrace($"Resource group {group.Name} is already owned by {ownerTag.Value}"); } } catch (Exception ex) { log.LogError("Exception: " + ex); } } } }