Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deploy IIS Website with CloudFormation template

I have a Visual Studio (C#) deployment package (.zip) that I have pushed up to my S3 storage.

I want to run my CloudFormation script and have it create an instance of an IIS server (I have the script for this) and then deploy the Visual Studio web site to it from the S3 storage.

I'm looking for an example of the temple json that would do that

like image 626
Jiminy Avatar asked Jan 12 '23 04:01

Jiminy


1 Answers

I have a template that does something similar to what you are looking for. Below is a template that I use. It may be more than you need, because it has an auto scaling group, but it will get you started. Basically, you need the IAM user to interact with cloud formation. The script in the UserData starts cf-init, which does the stuff in the metadata section.

{
    "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": {}
}
like image 98
Edwin Avatar answered Jan 18 '23 08:01

Edwin