Created
January 4, 2019 14:26
-
-
Save lazarofl/adc3a482ddedad928118e6ee8fa7bbf3 to your computer and use it in GitHub Desktop.
This file contains hidden or 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": "Autoscaling for .net Web application.", | |
| "Parameters": { | |
| "InstanceType": { | |
| "Description": "WebServer EC2 instance type", | |
| "Type": "String", | |
| "Default": "m1.small", | |
| "AllowedValues": [ | |
| "t1.micro", | |
| "m1.small", | |
| "m1.medium", | |
| "m1.large", | |
| "m1.xlarge", | |
| "m2.xlarge", | |
| "m2.2xlarge", | |
| "m2.4xlarge", | |
| "c1.medium", | |
| "c1.xlarge", | |
| "cc1.4xlarge", | |
| "cc2.8xlarge", | |
| "cg1.4xlarge" | |
| ], | |
| "ConstraintDescription": "Must be a valid EC2 instance type." | |
| }, | |
| "IamInstanceProfile": { | |
| "Description": "Name of IAM Profile that will be used by instances to access AWS Services", | |
| "Type": "String", | |
| "Default": "YourProfileName" | |
| }, | |
| "KeyName": { | |
| "Description": "The EC2 Key Pair to allow access to the instances", | |
| "Default": "yourkeypair", | |
| "Type": "String" | |
| }, | |
| "SpotPriceBid": { | |
| "Description": "Max bid price of spot instances", | |
| "Type": "String", | |
| "Default": ".06" | |
| }, | |
| "DeployS3Bucket": { | |
| "Description": "The S3 Bucket where deploy files are stored", | |
| "Type": "String", | |
| "Default": "ApplicationBucket" | |
| }, | |
| "DeployWebS3Key": { | |
| "Description": "The zip file that holds the website", | |
| "Type": "String", | |
| "Default": "Application.zip" | |
| }, | |
| "DNSHostedZone": { | |
| "Type": "String", | |
| "Default": "example.com.", | |
| "AllowedPattern": "^[\\w\\.]*\\.$", | |
| "ConstraintDescription": "DNSDomain must end with '.'" | |
| }, | |
| "DNSSubDomain": { | |
| "Type": "String", | |
| "Default": "yoursubdomain" | |
| } | |
| }, | |
| "Mappings": { | |
| "RegionToAMIMap": { | |
| "us-east-1": { | |
| "AMI": "ami-1234567" | |
| } | |
| } | |
| }, | |
| "Resources": { | |
| "IAMUser": { | |
| "Type": "AWS::IAM::User", | |
| "Properties": { | |
| "Path": "/", | |
| "Policies": [{ | |
| "PolicyName": "webuser", | |
| "PolicyDocument": { | |
| "Statement": [{ | |
| "Sid": "Stmt1353842250430", | |
| "Action": [ | |
| "s3:GetObject" | |
| ], | |
| "Effect": "Allow", | |
| "Resource": [ | |
| "arn:aws:s3:::HelgaDogWeb*/*" | |
| ] | |
| }, { | |
| "Sid": "Stmt1353842327065", | |
| "Action": [ | |
| "cloudformation:DescribeStackResource" | |
| ], | |
| "Effect": "Allow", | |
| "Resource": [ | |
| "*" | |
| ] | |
| } | |
| ] | |
| } | |
| } | |
| ] | |
| } | |
| }, | |
| "IAMUserAccessKey": { | |
| "Type": "AWS::IAM::AccessKey", | |
| "Properties": { | |
| "UserName": { | |
| "Ref": "IAMUser" | |
| } | |
| } | |
| }, | |
| "WebSecurityGroup": { | |
| "Type": "AWS::EC2::SecurityGroup", | |
| "Properties": { | |
| "GroupDescription": "Enable Access From Elastic Load Balancer.", | |
| "SecurityGroupIngress": [{ | |
| "IpProtocol": "tcp", | |
| "FromPort": "443", | |
| "ToPort": "443", | |
| "SourceSecurityGroupOwnerId": { | |
| "Fn::GetAtt": [ | |
| "WebLoadBalancer", | |
| "SourceSecurityGroup.OwnerAlias" | |
| ] | |
| }, | |
| "SourceSecurityGroupName": { | |
| "Fn::GetAtt": [ | |
| "WebLoadBalancer", | |
| "SourceSecurityGroup.GroupName" | |
| ] | |
| } | |
| }, { | |
| "IpProtocol": "tcp", | |
| "FromPort": "80", | |
| "ToPort": "80", | |
| "SourceSecurityGroupOwnerId": { | |
| "Fn::GetAtt": [ | |
| "WebLoadBalancer", | |
| "SourceSecurityGroup.OwnerAlias" | |
| ] | |
| }, | |
| "SourceSecurityGroupName": { | |
| "Fn::GetAtt": [ | |
| "WebLoadBalancer", | |
| "SourceSecurityGroup.GroupName" | |
| ] | |
| } | |
| } | |
| ] | |
| } | |
| }, | |
| "WebLoadBalancer": { | |
| "Type": "AWS::ElasticLoadBalancing::LoadBalancer", | |
| "Properties": { | |
| "Listeners": [{ | |
| "InstancePort": "443", | |
| "InstanceProtocol": "HTTPS", | |
| "LoadBalancerPort": "443", | |
| "Protocol": "HTTPS", | |
| "SSLCertificateId": "arn:aws:iam::123456789101:server-certificate/example" | |
| } | |
| ], | |
| "AvailabilityZones": { | |
| "Fn::GetAZs": "" | |
| }, | |
| "HealthCheck": { | |
| "HealthyThreshold": "3", | |
| "Interval": "30", | |
| "Target": "HTTP:80/healthcheck.aspx", | |
| "Timeout": 8, | |
| "UnhealthyThreshold": "2" | |
| } | |
| } | |
| }, | |
| "WebAsSpotLaunchConfiguration": { | |
| "Type": "AWS::AutoScaling::LaunchConfiguration", | |
| "Metadata": { | |
| "AWS::CloudFormation::Init": { | |
| "config": { | |
| "sources": { | |
| "C:\\inetpub\\wwwroot": { | |
| "Fn::Join": [ | |
| "/", | |
| [ | |
| "http://s3.amazonaws.com", { | |
| "Ref": "DeployS3Bucket" | |
| }, { | |
| "Ref": "DeployWebS3Key" | |
| } | |
| ] | |
| ] | |
| } | |
| }, | |
| "commands": { | |
| "1-set-appPool-identity": { | |
| "command": "C:\\Windows\\System32\\inetsrv\\appcmd set config /section:applicationPools /[name='DefaultAppPool'].processModel.identityType:LocalSystem", | |
| "waitAfterCompletion": "0" | |
| }, | |
| "2-add-http-binding": { | |
| "command": "C:\\Windows\\System32\\inetsrv\\appcmd set site /site.name:\"Default Web Site\" /+bindings.[protocol='http',bindingInformation='*:80:']", | |
| "waitAfterCompletion": "0" | |
| } | |
| } | |
| } | |
| }, | |
| "AWS::CloudFormation::Authentication": { | |
| "S3AccessCreds": { | |
| "type": "S3", | |
| "accessKeyId": { | |
| "Ref": "IAMUserAccessKey" | |
| }, | |
| "secretKey": { | |
| "Fn::GetAtt": [ | |
| "IAMUserAccessKey", | |
| "SecretAccessKey" | |
| ] | |
| }, | |
| "buckets": [{ | |
| "Ref": "DeployS3Bucket" | |
| } | |
| ] | |
| } | |
| } | |
| }, | |
| "Properties": { | |
| "KeyName": { | |
| "Ref": "KeyName" | |
| }, | |
| "ImageId": { | |
| "Fn::FindInMap": [ | |
| "RegionToAMIMap", { | |
| "Ref": "AWS::Region" | |
| }, | |
| "AMI" | |
| ] | |
| }, | |
| "IamInstanceProfile": { | |
| "Ref": "IamInstanceProfile" | |
| }, | |
| "SecurityGroups": [{ | |
| "Ref": "WebSecurityGroup" | |
| } | |
| ], | |
| "InstanceType": { | |
| "Ref": "InstanceType" | |
| }, | |
| "SpotPrice": { | |
| "Ref": "SpotPriceBid" | |
| }, | |
| "UserData": { | |
| "Fn::Base64": { | |
| "Fn::Join": [ | |
| "", | |
| [ | |
| "<script>\n", | |
| "\"C:\\Program Files (x86)\\Amazon\\cfn-bootstrap\\cfn-init.exe\" -v -s ", { | |
| "Ref": "AWS::StackName" | |
| }, | |
| " -r WebAsSpotLaunchConfiguration ", | |
| " --access-key ", { | |
| "Ref": "IAMUserAccessKey" | |
| }, | |
| " --secret-key ", { | |
| "Fn::GetAtt": [ | |
| "IAMUserAccessKey", | |
| "SecretAccessKey" | |
| ] | |
| }, | |
| "\n", | |
| "</script>" | |
| ] | |
| ] | |
| } | |
| } | |
| } | |
| }, | |
| "WebAsSpotGroup": { | |
| "Type": "AWS::AutoScaling::AutoScalingGroup", | |
| "Properties": { | |
| "AvailabilityZones": { | |
| "Fn::GetAZs": "" | |
| }, | |
| "HealthCheckGracePeriod": "120", | |
| "HealthCheckType": "EC2", | |
| "LaunchConfigurationName": { | |
| "Ref": "WebAsSpotLaunchConfiguration" | |
| }, | |
| "LoadBalancerNames": [{ | |
| "Ref": "WebLoadBalancer" | |
| } | |
| ], | |
| "MaxSize": "20", | |
| "MinSize": "1", | |
| "DesiredCapacity": "1" | |
| } | |
| }, | |
| "WebAsSpotScaleUpPolicy": { | |
| "Type": "AWS::AutoScaling::ScalingPolicy", | |
| "Properties": { | |
| "AdjustmentType": "PercentChangeInCapacity", | |
| "AutoScalingGroupName": { | |
| "Ref": "WebAsSpotGroup" | |
| }, | |
| "Cooldown": "420", | |
| "ScalingAdjustment": "200" | |
| } | |
| }, | |
| "WebAsSpotScaleDownPolicy": { | |
| "Type": "AWS::AutoScaling::ScalingPolicy", | |
| "Properties": { | |
| "AdjustmentType": "ChangeInCapacity", | |
| "AutoScalingGroupName": { | |
| "Ref": "WebAsSpotGroup" | |
| }, | |
| "Cooldown": "60", | |
| "ScalingAdjustment": "-1" | |
| } | |
| }, | |
| "WebAsSpotScaleUpAlarm": { | |
| "Type": "AWS::CloudWatch::Alarm", | |
| "Properties": { | |
| "MetricName": "CPUUtilization", | |
| "Namespace": "AWS/EC2", | |
| "Statistic": "Average", | |
| "Period": "60", | |
| "EvaluationPeriods": "1", | |
| "Threshold": "75", | |
| "AlarmActions": [{ | |
| "Ref": "WebAsSpotScaleUpPolicy" | |
| } | |
| ], | |
| "Dimensions": [{ | |
| "Name": "AutoScalingGroupName", | |
| "Value": { | |
| "Ref": "WebAsSpotGroup" | |
| } | |
| } | |
| ], | |
| "ComparisonOperator": "GreaterThanThreshold" | |
| } | |
| }, | |
| "WebAsSpotScaleDownAlarm": { | |
| "Type": "AWS::CloudWatch::Alarm", | |
| "Properties": { | |
| "MetricName": "CPUUtilization", | |
| "Namespace": "AWS/EC2", | |
| "Statistic": "Average", | |
| "Period": "60", | |
| "EvaluationPeriods": "2", | |
| "Threshold": "50", | |
| "AlarmActions": [{ | |
| "Ref": "WebAsSpotScaleDownPolicy" | |
| } | |
| ], | |
| "Dimensions": [{ | |
| "Name": "AutoScalingGroupName", | |
| "Value": { | |
| "Ref": "WebAsSpotGroup" | |
| } | |
| } | |
| ], | |
| "ComparisonOperator": "LessThanThreshold" | |
| } | |
| }, | |
| "DNSRecord": { | |
| "Type": "AWS::Route53::RecordSet", | |
| "Properties": { | |
| "HostedZoneName": { | |
| "Ref": "DNSHostedZone" | |
| }, | |
| "Comment": "VPN Host. Created by Cloud Formation.", | |
| "Name": { | |
| "Fn::Join": [ | |
| ".", | |
| [{ | |
| "Ref": "DNSSubDomain" | |
| }, { | |
| "Ref": "DNSHostedZone" | |
| } | |
| ] | |
| ] | |
| }, | |
| "Type": "CNAME", | |
| "TTL": "150", | |
| "ResourceRecords": [{ | |
| "Fn::GetAtt": [ | |
| "WebLoadBalancer", | |
| "CanonicalHostedZoneName" | |
| ] | |
| } | |
| ] | |
| }, | |
| "DependsOn": "WebLoadBalancer" | |
| } | |
| }, | |
| "Outputs": {} | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment