2014-02-21 4 views
3

У меня есть пакет развертывания Visual Studio (C#), который я подтолкнул к моему хранилищу S3.Развертывание веб-сайта IIS с шаблоном CloudFormation

Я хочу запустить сценарий CloudFormation и создать экземпляр сервера IIS (у меня есть сценарий для этого), а затем развернуть на нем веб-сайт Visual Studio из хранилища S3.

Я ищу пример храма, который будет JSON сделать это

ответ

6

У меня есть шаблон, который делает что-то похожее на то, что вы ищете. Ниже приведен шаблон, который я использую. Это может быть больше, чем вам нужно, потому что у него есть группа автомасштабирования, но она заставит вас начать. В принципе, пользователю IAM необходимо взаимодействовать с формированием облаков. Скрипт в UserData запускает cf-init, что делает материал в разделе метаданных.

{ 
    "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

Спасибо Эдвину, что выглядит очень обширно. – Jiminy

+0

Это не так сложно, когда вы входите в него, но это немного сложно объяснить словами. Настоящая проблема заключается в правильном использовании синтаксиса JSON. – Edwin

+0

Забыл упомянуть, что я использую экземпляр, который уже установил IIS и включен https. Экземпляр удаляет привязку http специально, чтобы добавить сценарий формирования облаков. Это было так, что проверка работоспособности балансировки нагрузки не увидела экземпляр до тех пор, пока cfn-init не завершит свою работу. – Edwin

Смежные вопросы