UNPKG

7.71 kBtext/coffeescriptView Raw
1# from https://s3.amazonaws.com/cloudformation-templates-us-east-1/WordPress-1.0.0.template
2result = require('../lib/coffin') ->
3 @Description '''
4WordPress is web software you can use to create a beautiful website or blog. This template creates a scalable WordPress installation using an Auto Scaling group behind an Elastic Load Balancer along with an Amazon Relational Database Service database instance to store the content. **WARNING** This template creates one or more Amazon EC2 instances and an Amazon Relational Database Service database instance. You will be billed for the AWS resources used if you create a stack from this template.
5'''
6 #forward declaration, kinda cheesy for the moment
7 @DeclareResource 'WebServerGroup'
8 @DeclareResource 'ElasticLoadBalancer'
9 @DeclareResource 'LaunchConfig'
10
11 #vars
12 maxPort = '65535'
13 allZones = @GetAZs @Region
14 loadBalancerDns = @GetAtt('ElasticLoadBalancer', 'DNSName') #todo: want -> @Resources.ElasticLoadBalancer.DNSName
15 openPort = (port) ->
16 FromPort: port
17 CidrIp: '0.0.0.0/0'
18 ToPort: port
19 IpProtocol: 'tcp'
20
21 #params
22 @Param.String 'KeyName', 'Name of an existing EC2 KeyPair to enable SSH access into the WordPress web server'
23 @Param.String 'WordPressDBName', 'The WordPress database name',
24 Default: 'wordpress'
25 MinLength: '1'
26 MaxLength: '64'
27 AllowedPattern: "[^\\x00\\\\/.]*[^\\x00\\\\/. ]"
28 @Param.String 'WordPressUser', 'The WordPress database admin account username',
29 Default: 'admin'
30 NoEcho: 'true'
31 MinLength: '1'
32 MaxLength: '16'
33 AllowedPattern : '[a-zA-Z][a-zA-Z0-9]*'
34 @Param.String 'WordPressPwd', 'The WordPress database admin account password',
35 Default: 'admin'
36 NoEcho: 'true'
37 MinLength: '1'
38 MaxLength: '41'
39 AllowedPattern : '[a-zA-Z0-9]*'
40 @Param.Number 'GroupSize', 'The initial number of EC2 instances for the WordPress web server',
41 Default: '1'
42 MinValue: '0'
43 @Param.String 'InstanceType', 'The type of EC2 instances used for the WordPress web server',
44 Default: 'm1.small'
45 AllowedPattern : '[a-zA-Z0-9\\.]+'
46 @Param.String 'OperatorEmail', 'Email address to notify if there are any operational issues',
47 Default: 'nobody@amazon.com'
48 @Param.Number 'WordPressDBPort', 'TCP/IP port for the WordPress database',
49 Default: '3306'
50 MinValue: '1150'
51 MaxValue: maxPort
52 @Param.Number 'WebServerPort', 'TCP/IP port for the WordPress web server',
53 Default: '8888'
54 MinValue: '1'
55 MaxValue: maxPort
56
57 @Mapping 'AWSInstanceType2Arch',
58 't1.micro' :
59 Arch: '64'
60 'm1.small' :
61 Arch: '32'
62 'm1.large' :
63 Arch: '64'
64 'm1.xlarge' :
65 Arch: '64'
66 'm2.xlarge' :
67 Arch: '64'
68 'm2.2xlarge' :
69 Arch: '64'
70 'm2.4xlarge' :
71 Arch: '64'
72 'c1.medium' :
73 Arch: '32'
74 'c1.xlarge' :
75 Arch: '64'
76 'cc1.4xlarge':
77 Arch: '64'
78 @Mapping 'AWSRegionArch2AMI',
79 'us-east-1':
80 32: 'ami-f417e49d'
81 64: 'ami-f617e49f'
82 'us-west-1':
83 32: 'ami-bdc797f8'
84 64: 'ami-bfc797fa'
85 'eu-west-1':
86 32: 'ami-a1c2f6d5'
87 64: 'ami-a3c2f6d7'
88 'ap-southeast-1':
89 32: 'ami-2cf28c7e'
90 64: 'ami-2ef28c7c'
91 'ap-northeast-1':
92 32: 'ami-cc03a8cd'
93 64: 'ami-d203a8d3'
94 rdsMultiAz = RDSMultiAZ: 'true'
95 @Mapping 'AWSRegionCapabilities',
96 'us-east-1' : rdsMultiAz
97 'us-west-1' : rdsMultiAz
98 'eu-west-1' : rdsMultiAz
99 'ap-southeast-1' : rdsMultiAz
100 'ap-northeast-1' : rdsMultiAz
101
102 #resources
103 @AWS.SNS.Topic 'AlarmTopic',
104 Subscription: [
105 Endpoint: @Params.OperatorEmail,
106 Protocol: 'email'
107 ]
108 @AWS.CloudWatch.Alarm 'CPUAlarmHigh',
109 AlarmDescription: 'Alarm if CPU too high or metric disappears indicating instance is down'
110 EvaluationPeriods: '1'
111 Statistic: 'Average'
112 Threshold: '10'
113 Period: '60'
114 AlarmActions: [ @Resources.AlarmTopic ]
115 Namespace: 'AWS/EC2'
116 InsufficientDataActions: [ @Resources.AlarmTopic ]
117 Dimensions: [
118 Name: 'AutoScalingGroupName'
119 Value: @Resources.WebServerGroup
120 ]
121 ComparisonOperator: 'GreaterThanThreshold',
122 MetricName: 'CPUUtilization'
123 @AWS.CloudWatch.Alarm 'TooManyUnhealthyHostsAlarm',
124 AlarmDescription: 'Alarm if there are too many unhealthy hosts.'
125 EvaluationPeriods: '1'
126 Statistic: 'Average'
127 Threshold: '0'
128 Period: '60'
129 AlarmActions: [ @Resources.AlarmTopic ]
130 Namespace: 'AWS/ELB'
131 InsufficientDataActions: [ @Resources.AlarmTopic ]
132 Dimensions: [ Name: 'LoadBalancerName', Value: @Resources.ElasticLoadBalancer ]
133 ComparisonOperator: 'GreaterThanThreshold'
134 MetricName: 'UnHealthyHostCount'
135 @AWS.CloudWatch.Alarm 'RequestLatencyAlarmHigh',
136 AlarmDescription: "Alarm if there aren't any requests coming through"
137 EvaluationPeriods: '1'
138 Statistic: 'Average'
139 Threshold: '1'
140 Period: '60'
141 AlarmActions: [ @Resources.AlarmTopic ]
142 Namespace: 'AWS/ELB'
143 InsufficientDataActions: [ @Resources.AlarmTopic ]
144 Dimensions: [ Name: 'LoadBalancerName', Value: @Resources.ElasticLoadBalancer ]
145 ComparisonOperator: 'GreaterThanThreshold'
146 MetricName: 'Latency'
147
148 @AWS.ElasticLoadBalancing.LoadBalancer 'ElasticLoadBalancer',
149 Listeners: [
150 InstancePort: @Params.WebServerPort,
151 PolicyNames: [ 'p1' ],
152 Protocol: 'HTTP',
153 LoadBalancerPort: '80'
154 ]
155 HealthCheck:
156 HealthyThreshold: '2'
157 Timeout: '5'
158 Interval: '10'
159 UnhealthyThreshold: '5'
160 Target: @Join '', 'HTTP:', @Params.WebServerPort, '/wp-admin/install.php'
161 AvailabilityZones: allZones
162 LBCookieStickinessPolicy: [
163 CookieExpirationPeriod: '30',
164 PolicyName: 'p1'
165 ]
166
167 @AWS.EC2.SecurityGroup 'EC2SecurityGroup',
168 GroupDescription: 'HTTP and SSH access'
169 SecurityGroupIngress: [ openPort('22'), openPort(@Params.WebServerPort) ]
170 @AWS.RDS.DBSecurityGroup 'DBSecurityGroup',
171 GroupDescription: 'database access'
172 DBSecurityGroupIngress:
173 EC2SecurityGroupName: @Resources.EC2SecurityGroup
174
175 @AWS.RDS.DBInstance 'WordPressDB',
176 Engine: 'MySQL'
177 DBName: @Params.WordPressDBName
178 Port: @Params.WordPressDBPort
179 MultiAZ : @FindInMap 'AWSRegionCapabilities', @Region, 'RDSMultiAZ'
180 MasterUsername: @Params.WordPressUser
181 DBInstanceClass: 'db.m1.small'
182 DBSecurityGroups: [ @Resources.DBSecurityGroup ]
183 AllocatedStorage: '5'
184 MasterUserPassword: @Params.WordPressPwd
185 @AWS.AutoScaling.AutoScalingGroup 'WebServerGroup',
186 LoadBalancerNames: [ @Resources.ElasticLoadBalancer ]
187 LaunchConfigurationName: @Resources.LaunchConfig
188 AvailabilityZones: allZones
189 MinSize: '0'
190 MaxSize: '3'
191 DesiredCapacity: '1'
192 NotificationConfiguration:
193 TopicARN: @Resources.AlarmTopic
194 NotificationTypes: [
195 'autoscaling:EC2_INSTANCE_LAUNCH',
196 'autoscaling:EC2_INSTANCE_LAUNCH_ERROR',
197 'autoscaling:EC2_INSTANCE_TERMINATE',
198 'autoscaling:EC2_INSTANCE_TERMINATE_ERROR'
199 ]
200 @AWS.AutoScaling.LaunchConfiguration 'LaunchConfig',
201 SecurityGroups: [ @Resources.EC2SecurityGroup ]
202 ImageId: @FindInMap 'AWSRegionArch2AMI', @Region, @FindInMap('AWSInstanceType2Arch', @Params.InstanceType, 'Arch')
203 UserData:
204 @Base64 @Join ':', @Params.WordPressDBName, @Params.WordPressUser, @Params.WordPressPwd, @Params.WordPressDBPort, @GetAtt('WordPressDB', 'Endpoint.Address'), @Params.WebServerPort, loadBalancerDns
205 KeyName: @Params.KeyName
206 InstanceType: @Params.InstanceType
207
208 @Output 'InstallURL', 'Installation URL of the WordPress website',
209 @Join '', 'http://', loadBalancerDns, '/wp-admin/install.php'
210 @Output 'WebsiteURL',
211 @Join '', 'http://', loadBalancerDns
212
213module.exports = result