Last active
September 5, 2018 04:55
-
-
Save glenngillen/39e673a7f86e1256f8dac21085720140 to your computer and use it in GitHub Desktop.
Windows Server 2012 IIS HA, based on https://github.com/rhossi/cloud-formation-templates/blob/master/windows_2012_iis_ha.template
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"AWSTemplateFormatVersion": "2010-09-09", | |
"Description": "HA IIS Web Server with Windows 2012", | |
"Mappings": { | |
"AWSInstanceType2Arch": { | |
"c1.medium": { | |
"Arch": "64" | |
}, | |
"c1.xlarge": { | |
"Arch": "64" | |
}, | |
"m1.large": { | |
"Arch": "64" | |
}, | |
"m1.medium": { | |
"Arch": "64" | |
}, | |
"m1.small": { | |
"Arch": "64" | |
}, | |
"m1.xlarge": { | |
"Arch": "64" | |
}, | |
"m2.2xlarge": { | |
"Arch": "64" | |
}, | |
"m2.4xlarge": { | |
"Arch": "64" | |
}, | |
"m2.xlarge": { | |
"Arch": "64" | |
} | |
}, | |
"AWSRegionArch2AMI": { | |
"ap-northeast-1": { | |
"64": "ami-cfcdb3ce" | |
}, | |
"ap-southeast-1": { | |
"64": "ami-1a1b4848" | |
}, | |
"ap-southeast-2": { | |
"64": "ami-dfa73fe5" | |
}, | |
"eu-west-1": { | |
"64": "ami-a1867dd6" | |
}, | |
"sa-east-1": { | |
"64": "ami-234eec3e" | |
}, | |
"us-east-1": { | |
"64": "ami-5f938e36" | |
}, | |
"us-west-1": { | |
"64": "ami-e0e0d9a5" | |
}, | |
"us-west-2": { | |
"64": "ami-c8ed86f8" | |
} | |
} | |
}, | |
"Parameters": { | |
"Build": { | |
"Description": "Build number that is going to be deployed", | |
"Type": "Number" | |
}, | |
"HealthCheckTarget": { | |
"Default": "", | |
"Description": "Target used by the ELB to perform the Health Checks", | |
"Type": "String" | |
}, | |
"InstanceType": { | |
"AllowedValues": [ | |
"m1.small", | |
"m1.medium", | |
"m1.large", | |
"m1.xlarge", | |
"m2.xlarge", | |
"m2.2xlarge", | |
"m2.4xlarge", | |
"c1.medium", | |
"c1.xlarge" | |
], | |
"Default": "m1.large", | |
"Description": "Auto Scaling EC2 instance type", | |
"Type": "String" | |
}, | |
"KeyPairName": { | |
"Description": "Name of the keypair to launch the instances", | |
"Type": "String" | |
}, | |
"MaxAutoScalingSize": { | |
"Default": 4, | |
"Description": "Maximum size of the Auto Scaling Group", | |
"MinValue": 2, | |
"Type": "Number" | |
}, | |
"MinAutoScalingSize": { | |
"Default": 2, | |
"Description": "Minimum size of the Auto Scaling Group", | |
"MinValue": 2, | |
"Type": "Number" | |
}, | |
"S3Bucket": { | |
"Description": "Bucket to download deployment from", | |
"Type": "String" | |
}, | |
"VPC": { | |
"Description": "ID of an existing VPC", | |
"Type": "String" | |
} | |
}, | |
"Resources": { | |
"CPUAlarmHigh": { | |
"Properties": { | |
"AlarmActions": [ | |
{ | |
"Ref": "ScaleUpPolicy" | |
} | |
], | |
"AlarmDescription": "Alarm if CPU too high or metric disappears indicating instance is down", | |
"ComparisonOperator": "GreaterThanThreshold", | |
"Dimensions": [ | |
{ | |
"Name": "AutoScalingGroupName", | |
"Value": { | |
"Ref": "WebServerASG" | |
} | |
} | |
], | |
"EvaluationPeriods": "1", | |
"MetricName": "CPUUtilization", | |
"Namespace": "AWS/EC2", | |
"Period": "60", | |
"Statistic": "Average", | |
"Threshold": "60" | |
}, | |
"Type": "AWS::CloudWatch::Alarm" | |
}, | |
"CPUAlarmLow": { | |
"Properties": { | |
"AlarmActions": [ | |
{ | |
"Ref": "ScaleDownPolicy" | |
} | |
], | |
"AlarmDescription": "Alarm if CPU too low", | |
"ComparisonOperator": "LessThanThreshold", | |
"Dimensions": [ | |
{ | |
"Name": "AutoScalingGroupName", | |
"Value": { | |
"Ref": "WebServerASG" | |
} | |
} | |
], | |
"EvaluationPeriods": "1", | |
"MetricName": "CPUUtilization", | |
"Namespace": "AWS/EC2", | |
"Period": "60", | |
"Statistic": "Average", | |
"Threshold": "30" | |
}, | |
"Type": "AWS::CloudWatch::Alarm" | |
}, | |
"InstanceProfile": { | |
"Properties": { | |
"Path": "/", | |
"Roles": [ | |
{ | |
"Ref": "InstanceRole" | |
} | |
] | |
}, | |
"Type": "AWS::IAM::InstanceProfile" | |
}, | |
"InstanceRole": { | |
"Properties": { | |
"AssumeRolePolicyDocument": { | |
"Statement": [ | |
{ | |
"Action": [ | |
"sts:AssumeRole" | |
], | |
"Effect": "Allow", | |
"Principal": { | |
"Service": [ | |
"ec2.amazonaws.com" | |
] | |
} | |
} | |
] | |
}, | |
"Path": "/" | |
}, | |
"Type": "AWS::IAM::Role" | |
}, | |
"RolePolicies": { | |
"Properties": { | |
"PolicyDocument": { | |
"Statement": [ | |
{ | |
"Action": [ | |
"s3:GetObject" | |
], | |
"Effect": "Allow", | |
"Resource": [ | |
{ | |
"Fn::Join": [ | |
"", | |
[ | |
"arn:aws:s3:::", | |
{ | |
"Ref": "S3Bucket" | |
}, | |
"/*" | |
] | |
] | |
} | |
] | |
} | |
] | |
}, | |
"PolicyName": "S3Download", | |
"Roles": [ | |
{ | |
"Ref": "InstanceRole" | |
} | |
] | |
}, | |
"Type": "AWS::IAM::Policy" | |
}, | |
"ScaleDownPolicy": { | |
"Properties": { | |
"AdjustmentType": "ChangeInCapacity", | |
"AutoScalingGroupName": { | |
"Ref": "WebServerASG" | |
}, | |
"Cooldown": "300", | |
"ScalingAdjustment": "-1" | |
}, | |
"Type": "AWS::AutoScaling::ScalingPolicy" | |
}, | |
"ScaleUpPolicy": { | |
"Properties": { | |
"AdjustmentType": "ChangeInCapacity", | |
"AutoScalingGroupName": { | |
"Ref": "WebServerASG" | |
}, | |
"Cooldown": "300", | |
"ScalingAdjustment": "2" | |
}, | |
"Type": "AWS::AutoScaling::ScalingPolicy" | |
}, | |
"SecurityGroupRDP": { | |
"Properties": { | |
"GroupDescription": "Allow RDP to client host", | |
"SecurityGroupIngress": [ | |
{ | |
"CidrIp": "0.0.0.0/0", | |
"FromPort": "3389", | |
"IpProtocol": "tcp", | |
"ToPort": "3389" | |
} | |
] | |
}, | |
"Type": "AWS::EC2::SecurityGroup" | |
}, | |
"SecurityGroupWeb": { | |
"Properties": { | |
"GroupDescription": "Allow http to client host", | |
"SecurityGroupIngress": [ | |
{ | |
"CidrIp": "0.0.0.0/0", | |
"FromPort": "80", | |
"IpProtocol": "tcp", | |
"ToPort": "80" | |
} | |
] | |
}, | |
"Type": "AWS::EC2::SecurityGroup" | |
}, | |
"WebServerASG": { | |
"Properties": { | |
"AvailabilityZones": { | |
"Fn::GetAZs": "" | |
}, | |
"LaunchConfigurationName": { | |
"Ref": "WebServerLC" | |
}, | |
"LoadBalancerNames": [ | |
{ | |
"Ref": "WebServerELB" | |
} | |
], | |
"MaxSize": { | |
"Ref": "MaxAutoScalingSize" | |
}, | |
"MinSize": { | |
"Ref": "MinAutoScalingSize" | |
} | |
}, | |
"Type": "AWS::AutoScaling::AutoScalingGroup" | |
}, | |
"WebServerELB": { | |
"Properties": { | |
"AvailabilityZones": { | |
"Fn::GetAZs": "" | |
}, | |
"HealthCheck": { | |
"HealthyThreshold": "3", | |
"Interval": "30", | |
"Target": { | |
"Fn::Join": [ | |
"", | |
[ | |
"HTTP:80/", | |
{ | |
"Ref": "HealthCheckTarget" | |
} | |
] | |
] | |
}, | |
"Timeout": "5", | |
"UnhealthyThreshold": "5" | |
}, | |
"Listeners": [ | |
{ | |
"InstancePort": "80", | |
"LoadBalancerPort": "80", | |
"Protocol": "HTTP" | |
} | |
] | |
}, | |
"Type": "AWS::ElasticLoadBalancing::LoadBalancer" | |
}, | |
"WebServerLC": { | |
"Metadata": { | |
"AWS::CloudFormation::Authentication": { | |
"default": { | |
"buckets": [ | |
{ | |
"Ref": "S3Bucket" | |
} | |
], | |
"roleName": { | |
"Ref": "InstanceRole" | |
}, | |
"type": "s3" | |
} | |
}, | |
"AWS::CloudFormation::Init": { | |
"configSets" : { | |
"setup" : ["setupCfn", "deploySite"], | |
"deploy" : ["stopSite", "deploySite", "startSite"] | |
}, | |
"setupCfn": { | |
"files": { | |
"c:\\cfn\\cfn-hup.conf": { | |
"content": { | |
"Fn::Join": [ | |
"", | |
[ | |
"[main]\n", | |
"stack=", | |
{ | |
"Ref": "AWS::StackId" | |
}, | |
"\n", | |
"region=", | |
{ | |
"Ref": "AWS::Region" | |
}, | |
"\n", | |
"interval=1" | |
] | |
] | |
} | |
}, | |
"c:\\cfn\\hooks.d\\cfn-auto-reloader.conf": { | |
"content": { | |
"Fn::Join": [ | |
"", | |
[ | |
"[cfn-auto-reloader-hook]\n", | |
"triggers=post.update\n", | |
"path=Resources.WebServerLC.Metadata.AWS::CloudFormation::Init\n", | |
"action=cfn-init.exe -v -c deploy -s ", | |
{ | |
"Ref": "AWS::StackId" | |
}, | |
" -r WebServerLC", | |
" --region ", | |
{ | |
"Ref": "AWS::Region" | |
}, | |
"\n" | |
] | |
] | |
} | |
} | |
}, | |
"services": { | |
"windows": { | |
"cfn-hup": { | |
"enabled": "true", | |
"ensureRunning": "true", | |
"files": [ | |
"c:\\cfn\\cfn-hup.conf", | |
"c:\\cfn\\hooks.d\\cfn-auto-reloader.conf" | |
] | |
} | |
} | |
} | |
}, | |
"stopSite": { | |
"commands" : { | |
"1_stop_site" : { | |
"command" : "iisreset /stop" | |
} | |
} | |
}, | |
"startSite": { | |
"commands" : { | |
"1_start_site" : { | |
"command" : "iisreset /start" | |
} | |
} | |
}, | |
"deploySite": { | |
"sources": { | |
"c:\\inetpub\\site": { | |
"Fn::Join": [ | |
"", | |
[ | |
"http://", | |
{ | |
"Ref": "S3Bucket" | |
}, | |
".s3.amazonaws.com/", | |
{ | |
"Ref": "Build" | |
}, | |
".zip" | |
] | |
] | |
} | |
} | |
} | |
}, | |
"Build": { | |
"Ref": "Build" | |
} | |
}, | |
"Properties": { | |
"IamInstanceProfile": { | |
"Ref": "InstanceProfile" | |
}, | |
"ImageId": { | |
"Fn::FindInMap": [ | |
"AWSRegionArch2AMI", | |
{ | |
"Ref": "AWS::Region" | |
}, | |
{ | |
"Fn::FindInMap": [ | |
"AWSInstanceType2Arch", | |
{ | |
"Ref": "InstanceType" | |
}, | |
"Arch" | |
] | |
} | |
] | |
}, | |
"InstanceType": { | |
"Ref": "InstanceType" | |
}, | |
"KeyName": { | |
"Ref": "KeyPairName" | |
}, | |
"SecurityGroups": [ | |
{ | |
"Ref": "SecurityGroupWeb" | |
}, | |
{ | |
"Ref": "SecurityGroupRDP" | |
} | |
], | |
"UserData": { | |
"Fn::Base64": { | |
"Fn::Join": [ | |
"", | |
[ | |
"<powershell>\n", | |
"Add-WindowsFeature Web-WebServer -includeAllSubFeature -logpath $env:temp\\Web-WebServer_feature.log \n", | |
"Add-WindowsFeature Web-Mgmt-Tools -includeAllSubFeature -logpath $env:temp\\Web-Mgmt-Tools_feature.log \n", | |
"remove-website -name \"Default Web Site\" \n", | |
"new-website -name site -port 80 -physicalpath c:\\inetpub\\site -ApplicationPool \".NET v4.5\" -force \n", | |
"</powershell>\n", | |
"<script>\n", | |
"cfn-init.exe -v -c setup -s ", | |
{ | |
"Ref": "AWS::StackId" | |
}, | |
" -r WebServerLC", | |
" --region ", | |
{ | |
"Ref": "AWS::Region" | |
}, | |
"\n", | |
"cfn-signal.exe -e %ERRORLEVEL% \"", | |
{ "Fn::Base64" : { "Ref" : "WebServerLCWaitHandle" }}, | |
"\"", | |
"</script>\n" | |
] | |
] | |
} | |
} | |
}, | |
"Type": "AWS::AutoScaling::LaunchConfiguration" | |
}, | |
"WebServerLCWaitHandle" : { | |
"Type" : "AWS::CloudFormation::WaitConditionHandle" | |
}, | |
"WebServerLCWaitCondition" : { | |
"Type" : "AWS::CloudFormation::WaitCondition", | |
"DependsOn" : "WebServerLC", | |
"Properties" : { | |
"Handle" : { "Ref" : "WebServerLCWaitHandle" }, | |
"Timeout" : "1800" | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment