public VmScalesetStack() { var applicationPort = 80; var resourceGroup = new ResourceGroup("vmss-rg"); var network = new VirtualNetwork("vnet", new VirtualNetworkArgs { ResourceGroupName = resourceGroup.Name, AddressSpaces = { "10.0.0.0/16" } } ); var subnet = new Subnet("subnet", new SubnetArgs { ResourceGroupName = resourceGroup.Name, Name = "default", AddressPrefixes = "10.0.1.0/24", VirtualNetworkName = network.Name }); var publicIp = new PublicIp("public-ip", new PublicIpArgs { ResourceGroupName = resourceGroup.Name, AllocationMethod = "Dynamic" }); var lb = new LoadBalancer("lb", new LoadBalancerArgs { ResourceGroupName = resourceGroup.Name, FrontendIpConfigurations = new List <LoadBalancerFrontendIpConfigurationArgs> { new LoadBalancerFrontendIpConfigurationArgs { Name = "PublicIPAddress", PublicIpAddressId = publicIp.Id } } }); var bpePool = new BackendAddressPool("bpepool", new BackendAddressPoolArgs { ResourceGroupName = resourceGroup.Name, LoadbalancerId = lb.Id, }); var sshProbe = new Probe("ssh-probe", new ProbeArgs { ResourceGroupName = resourceGroup.Name, LoadbalancerId = lb.Id, Port = applicationPort, }); var natRule = new Rule("lbnatrule-http", new RuleArgs { ResourceGroupName = resourceGroup.Name, BackendAddressPoolId = bpePool.Id, BackendPort = applicationPort, FrontendIpConfigurationName = "PublicIPAddress", FrontendPort = applicationPort, LoadbalancerId = lb.Id, ProbeId = sshProbe.Id, Protocol = "Tcp", }); var scaleSet = new ScaleSet("vmscaleset", new ScaleSetArgs { ResourceGroupName = resourceGroup.Name, NetworkProfiles = new ScaleSetNetworkProfileArgs { IpConfigurations = new ScaleSetNetworkProfileIpConfigurationArgs[] { new ScaleSetNetworkProfileIpConfigurationArgs { LoadBalancerBackendAddressPoolIds = bpePool.Id, Name = "IPConfiguration", Primary = true, SubnetId = subnet.Id, } }, Name = "networkprofile", Primary = true }, OsProfile = new ScaleSetOsProfileArgs { ComputerNamePrefix = "vmlab", AdminUsername = "******", AdminPassword = "******", CustomData = @"#!/bin/bash echo ""Hello, World by $HOSTNAME!"" > index.html nohup python -m SimpleHTTPServer 80 &" }, OsProfileLinuxConfig = new ScaleSetOsProfileLinuxConfigArgs { DisablePasswordAuthentication = false }, Sku = new ScaleSetSkuArgs { Capacity = 1, Name = "Standard_DS1_v2", Tier = "Standard", }, StorageProfileOsDisk = new ScaleSetStorageProfileOsDiskArgs { Caching = "ReadWrite", CreateOption = "FromImage", ManagedDiskType = "Standard_LRS", Name = "" }, StorageProfileDataDisks = new ScaleSetStorageProfileDataDiskArgs { Caching = "ReadWrite", CreateOption = "Empty", DiskSizeGb = 10, Lun = 0 }, StorageProfileImageReference = new ScaleSetStorageProfileImageReferenceArgs { Offer = "UbuntuServer", Publisher = "Canonical", Sku = "16.04-LTS", Version = "latest", }, UpgradePolicyMode = "Manual" }, new CustomResourceOptions { DeleteBeforeReplace = true, DependsOn = bpePool }); var autoscale = new AutoscaleSetting("vmss-autoscale", new AutoscaleSettingArgs { ResourceGroupName = resourceGroup.Name, Notification = new AutoscaleSettingNotificationArgs { Email = new AutoscaleSettingNotificationEmailArgs { CustomEmails = new string[] { "*****@*****.**" }, SendToSubscriptionAdministrator = true, SendToSubscriptionCoAdministrator = true, }, }, Profiles = new AutoscaleSettingProfileArgs[] { new AutoscaleSettingProfileArgs { Capacity = new AutoscaleSettingProfileCapacityArgs { Default = 2, Maximum = 10, Minimum = 2, }, Name = "defaultProfile", Rules = new AutoscaleSettingProfileRuleArgs[] { new AutoscaleSettingProfileRuleArgs { MetricTrigger = new AutoscaleSettingProfileRuleMetricTriggerArgs { MetricName = "Percentage CPU", MetricResourceId = scaleSet.Id, Operator = "GreaterThan", Statistic = "Average", Threshold = 75, TimeAggregation = "Average", TimeGrain = "PT1M", TimeWindow = "PT5M", }, ScaleAction = new AutoscaleSettingProfileRuleScaleActionArgs { Cooldown = "PT1M", Direction = "Increase", Type = "ChangeCount", Value = 1, }, }, new AutoscaleSettingProfileRuleArgs { MetricTrigger = new AutoscaleSettingProfileRuleMetricTriggerArgs { MetricName = "Percentage CPU", MetricResourceId = scaleSet.Id, Operator = "LessThan", Statistic = "Average", Threshold = 25, TimeAggregation = "Average", TimeGrain = "PT1M", TimeWindow = "PT5M", }, ScaleAction = new AutoscaleSettingProfileRuleScaleActionArgs { Cooldown = "PT1M", Direction = "Decrease", Type = "ChangeCount", Value = 1, }, } } } }, TargetResourceId = scaleSet.Id }); // The public IP address is not allocated until the VM is running, so wait for that // resource to create, and then lookup the IP address again to report its public IP. this.IpAddress = Output .Tuple <string, string, string>(scaleSet.Id, publicIp.Name, resourceGroup.Name) .Apply <string>(async t => { (_, string name, string resourceGroupName) = t; var ip = await GetPublicIP.InvokeAsync(new GetPublicIPArgs { Name = name, ResourceGroupName = resourceGroupName }); return(ip.IpAddress); }); }
public WebServerStack() { var resourceGroup = new ResourceGroup("server-rg"); var network = new VirtualNetwork("server-network", new VirtualNetworkArgs { ResourceGroupName = resourceGroup.Name, AddressSpaces = { "10.0.0.0/16" }, Subnets = { new VirtualNetworkSubnetArgs { Name = "default", AddressPrefix = "10.0.1.0/24" } } } ); var publicIp = new PublicIp("server-ip", new PublicIpArgs { ResourceGroupName = resourceGroup.Name, AllocationMethod = "Dynamic" }); var networkInterface = new NetworkInterface("server-nic", new NetworkInterfaceArgs { ResourceGroupName = resourceGroup.Name, IpConfigurations = { new NetworkInterfaceIpConfigurationArgs { Name = "webserveripcfg", SubnetId = network.Subnets.Apply(subnets => subnets[0].Id), PrivateIpAddressAllocation = "Dynamic", PublicIpAddressId = publicIp.Id } } }); var vm = new VirtualMachine("server-vm", new VirtualMachineArgs { ResourceGroupName = resourceGroup.Name, NetworkInterfaceIds = { networkInterface.Id }, VmSize = "Standard_A0", DeleteDataDisksOnTermination = true, DeleteOsDiskOnTermination = true, OsProfile = new VirtualMachineOsProfileArgs { ComputerName = "hostname", AdminUsername = "******", AdminPassword = "******", CustomData = @"#!/bin/bash echo ""Hello, World!"" > index.html nohup python -m SimpleHTTPServer 80 &" }, OsProfileLinuxConfig = new VirtualMachineOsProfileLinuxConfigArgs { DisablePasswordAuthentication = false }, StorageOsDisk = new VirtualMachineStorageOsDiskArgs { CreateOption = "FromImage", Name = "myosdisk1" }, StorageImageReference = new VirtualMachineStorageImageReferenceArgs { Publisher = "canonical", Offer = "UbuntuServer", Sku = "16.04-LTS", Version = "latest" } }, new CustomResourceOptions { DeleteBeforeReplace = true }); // The public IP address is not allocated until the VM is running, so wait for that // resource to create, and then lookup the IP address again to report its public IP. this.IpAddress = Output .Tuple <string, string, string>(vm.Id, publicIp.Name, resourceGroup.Name) .Apply <string>(async t => { (_, string name, string resourceGroupName) = t; var ip = await GetPublicIP.InvokeAsync(new GetPublicIPArgs { Name = name, ResourceGroupName = resourceGroupName }); return(ip.IpAddress); }); }