示例#1
0
        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);
                    }
                }
            }
        }