Deploy IIS Website with CloudFormation template

后端 未结 2 1429
梦如初夏
梦如初夏 2021-01-06 06:43

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 o

相关标签:
2条回答
  • 2021-01-06 06:53

    I havent tried it myself, but this post, on the AWS site, Using Amazon CloudFront with ASP.NET Apps maybe somewhere to start.

    0 讨论(0)
  • 2021-01-06 06:59

    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": {}
    }
    
    0 讨论(0)
提交回复
热议问题