1 |
|
2 | result = require('../lib/coffin') ->
|
3 | @Description '''
|
4 | WordPress 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 |
|
7 | @DeclareResource 'WebServerGroup'
|
8 | @DeclareResource 'ElasticLoadBalancer'
|
9 | @DeclareResource 'LaunchConfig'
|
10 |
|
11 |
|
12 | maxPort = '65535'
|
13 | allZones = @GetAZs @Region
|
14 | loadBalancerDns = @GetAtt('ElasticLoadBalancer', 'DNSName')
|
15 | openPort = (port) ->
|
16 | FromPort: port
|
17 | CidrIp: '0.0.0.0/0'
|
18 | ToPort: port
|
19 | IpProtocol: 'tcp'
|
20 |
|
21 |
|
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 |
|
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 |
|
213 | module.exports = result
|