Skip to content

Instantly share code, notes, and snippets.

@rs-randallburt
Last active December 16, 2015 12:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rs-randallburt/5437967 to your computer and use it in GitHub Desktop.
Save rs-randallburt/5437967 to your computer and use it in GitHub Desktop.
HeatTemplateFormatVersion: '2012-12-12'
Description: AWS CloudFormation Sample Template
Parameters:
KeyName: {Description: Name of an existing EC2 KeyPair
to enable SSH access to the instances, Type: String}
InstanceType:
Description: WebServer EC2 instance type
Type: String
Default: m1.small
AllowedValues: [t1.micro, m1.small, m1.large, m1.xlarge, m2.xlarge,
m2.2xlarge, m2.4xlarge, c1.medium, c1.xlarge, cc1.4xlarge]
ConstraintDescription: must be a valid EC2 instance type.
DBName: {Default: wordpress, Description: The
WordPress database name, Type: String, MinLength: '1',
MaxLength: '64', AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*',
ConstraintDescription: must begin with a letter and contain only
alphanumeric characters.}
DBUsername: {Default: admin, NoEcho: 'true',
Description: The WordPress database admin account username, Type: String,
MinLength: '1', MaxLength: '16', AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*',
ConstraintDescription: must begin with a letter and contain only
alphanumeric characters.}
DBPassword: {Default: admin, NoEcho: 'true',
Description: The WordPress database admin account password, Type: String,
MinLength: '1', MaxLength: '41', AllowedPattern: '[a-zA-Z0-9]*',
ConstraintDescription: must contain only alphanumeric characters.}
DBRootPassword: {Default: admin, NoEcho: 'true',
Description: Root password for MySQL, Type: String,
MinLength: '1', MaxLength: '41', AllowedPattern: '[a-zA-Z0-9]*',
ConstraintDescription: must contain only alphanumeric characters.}
LinuxDistribution:
Default: F17
Description: Distribution of choice
Type: String
AllowedValues: [F18, F17, U10, RHEL-6.1, RHEL-6.2, RHEL-6.3]
Mappings:
AWSInstanceType2Arch:
t1.micro: {Arch: '32'}
m1.small: {Arch: '64'}
m1.large: {Arch: '64'}
m1.xlarge: {Arch: '64'}
m2.xlarge: {Arch: '64'}
m2.2xlarge: {Arch: '64'}
m2.4xlarge: {Arch: '64'}
c1.medium: {Arch: '32'}
c1.xlarge: {Arch: '64'}
cc1.4xlarge: {Arch: '64'}
DistroArch2AMI:
F18: {'32': F18-i386-cfntools, '64': F18-x86_64-cfntools}
F17: {'32': F17-i386-cfntools, '64': F17-x86_64-cfntools}
U10: {'32': U10-i386-cfntools, '64': U10-x86_64-cfntools}
RHEL-6.1: {'32': rhel61-i386-cfntools, '64': rhel61-x86_64-cfntools}
RHEL-6.2: {'32': rhel62-i386-cfntools, '64': rhel62-x86_64-cfntools}
RHEL-6.3: {'32': rhel63-i386-cfntools, '64': rhel63-x86_64-cfntools}
Resources:
CfnUser: {Type: 'AWS::IAM::User'}
WebServerKeys:
Type: AWS::IAM::AccessKey
Properties:
UserName: {Ref: CfnUser}
WebServerGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
AvailabilityZones: {'Fn::GetAZs': ''}
LaunchConfigurationName: {Ref: LaunchConfig}
MinSize: '1'
MaxSize: '3'
LoadBalancerNames:
- {Ref: ElasticLoadBalancer}
WebServerScaleUpPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
AdjustmentType: ChangeInCapacity
AutoScalingGroupName: {Ref: WebServerGroup}
Cooldown: '60'
ScalingAdjustment: '1'
WebServerScaleDownPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
AdjustmentType: ChangeInCapacity
AutoScalingGroupName: {Ref: WebServerGroup}
Cooldown: '60'
ScalingAdjustment: '-1'
MEMAlarmHigh:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmDescription: Scale-up if MEM > 50% for 1 minute
MetricName: MemoryUtilization
Namespace: system/linux
Statistic: Average
Period: '60'
EvaluationPeriods: '1'
Threshold: '50'
AlarmActions:
- {Ref: WebServerScaleUpPolicy}
Dimensions:
- Name: AutoScalingGroupName
Value: {Ref: WebServerGroup}
ComparisonOperator: GreaterThanThreshold
MEMAlarmLow:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmDescription: Scale-down if MEM < 15% for 1 minute
MetricName: MemoryUtilization
Namespace: system/linux
Statistic: Average
Period: '60'
EvaluationPeriods: '1'
Threshold: '15'
AlarmActions:
- {Ref: WebServerScaleDownPolicy}
Dimensions:
- Name: AutoScalingGroupName
Value: {Ref: WebServerGroup}
ComparisonOperator: LessThanThreshold
ElasticLoadBalancer:
Type: AWS::ElasticLoadBalancing::LoadBalancer
Properties:
AvailabilityZones: {'Fn::GetAZs': ''}
Listeners:
- {LoadBalancerPort: '80', InstancePort: '80',
Protocol: HTTP}
HealthCheck: {Target: 'HTTP:80/', HealthyThreshold: '3',
UnhealthyThreshold: '5', Interval: '30', Timeout: '5'}
LaunchConfig:
Type: AWS::AutoScaling::LaunchConfiguration
Metadata:
AWS::CloudFormation::Init:
config:
files:
/etc/cfn/cfn-credentials:
content:
Fn::Join:
- ''
- - AWSAccessKeyId=
- {Ref: WebServerKeys}
- '
'
- AWSSecretKey=
- Fn::GetAtt: [WebServerKeys, SecretAccessKey]
- '
'
mode: '000400'
owner: root
group: root
/tmp/setup.mysql:
content:
Fn::Join:
- ''
- - 'CREATE DATABASE '
- {Ref: DBName}
- ';
'
- 'GRANT ALL PRIVILEGES ON '
- {Ref: DBName}
- .* TO '
- {Ref: DBUsername}
- '''@''localhost''
'
- IDENTIFIED BY '
- {Ref: DBPassword}
- ''';
'
- 'FLUSH PRIVILEGES;
'
- 'EXIT
'
mode: '000644'
owner: root
group: root
/tmp/stats-crontab.txt:
content:
Fn::Join:
- ''
- - 'MAIL=""
'
- '
'
- '* * * * * /opt/aws/bin/cfn-push-stats --watch '
- {Ref: MEMAlarmHigh}
- ' --mem-util
'
- '* * * * * /opt/aws/bin/cfn-push-stats --watch '
- {Ref: MEMAlarmLow}
- ' --mem-util
'
mode: '000600'
owner: root
group: root
packages:
yum:
python-psutil: []
cronie: []
mysql: []
mysql-server: []
httpd: []
wordpress: []
services:
systemd:
mysqld: {enabled: 'true', ensureRunning: 'true'}
httpd: {enabled: 'true', ensureRunning: 'true'}
crond: {enabled: 'true', ensureRunning: 'true'}
Properties:
ImageId:
Fn::FindInMap:
- DistroArch2AMI
- {Ref: LinuxDistribution}
- Fn::FindInMap:
- AWSInstanceType2Arch
- {Ref: InstanceType}
- Arch
InstanceType: {Ref: InstanceType}
KeyName: {Ref: KeyName}
UserData:
Fn::Base64:
Fn::Join:
- ''
- - '#!/bin/bash -v
'
- '/opt/aws/bin/cfn-init -s '
- {Ref: 'AWS::StackName'}
- ' -r LaunchConfig '
- ' --region '
- {Ref: 'AWS::Region'}
- '
'
- '# Setup MySQL root password and create a user
'
- mysqladmin -u root password '
- {Ref: DBRootPassword}
- '''
'
- mysql -u root --password='
- {Ref: DBRootPassword}
- ''' < /tmp/setup.mysql
'
- 'sed -i "/Deny from All/d" /etc/httpd/conf.d/wordpress.conf
'
- sed --in-place --e s/database_name_here/
- {Ref: DBName}
- / --e s/username_here/
- {Ref: DBUsername}
- / --e s/password_here/
- {Ref: DBPassword}
- '/ /usr/share/wordpress/wp-config.php
'
- 'systemctl restart httpd.service
'
- '# install crontab
'
- 'crontab /tmp/stats-crontab.txt
'
Outputs:
URL:
Description: The URL of the website
Value:
Fn::Join:
- ''
- - http://
- Fn::GetAtt: [ElasticLoadBalancer, DNSName]
- /wordpress
name: Simple Wordpress
services:
blog:
requires:
- compute:
type: linux
constraints:
os: {option: linuxdistribution}
flavor: {option: instancetype}
components:
wordpress:
requires:
- application:
name: wordpress
role: web
relations:
- blog: db
db:
requires:
- database:
type: mysql
constraints:
name: { option: dbname }
username: { option: dbusername }
password: { option: dbpassword }
rootpw: { option: dbrootpassword }
options:
instancetype:
description: Webserver instance type
type: string
default: m1.large
constraints:
- in:
values:
- m1.large
- m1.xlarge
- m2.large
- m2.xlarge
message: "Must be one of m1.large, m1.xlarge, m2.large, m2.xlarge"
dbname:
description: The wordpress database name
type: string
default: wordpress
constraints:
- len:
min: 1
max: 64
message: Must be between 1 and 64 characters
- matches:
expr: [a-zA-Z][a-zA-Z0-9]*
message: must begin with a letter and contain only alphanumeric characters
dbusername:
description: The wordpress database admin account username
type: string
default: admin
constraints:
- len:
min: 1
max: 16
message: must be between 1 and 16 characters
- matches:
expr: [a-zA-Z0-9]*
message: must contain only alphanumeric characters
dbpassword:
description: The WordPress database admin account password
type: password
default: admin
constraints:
- len:
min: 1
max: 41
message: must be between 1 and 41 characters
- matches:
expr: [a-zA-Z0-9]*
message: must contain only alphanumeric characters
dbrootpassword:
description: Root password for MySQL
type: password
default: admin
constraints:
- len:
min: 1
max: 41
message: must be between 1 and 41 characters
- matches:
expr: [a-zA-Z0-9]*
message: must contain only alphanumeric characters
linuxdistribution:
description: Distribution of choice
type: string
default: F17
constraints:
- in
values:
- F18
- F17
- U10
- RHEL-6.1
- RHEL-6.2
- RHEL-6.3
HeatTemplateFormatVersion: '2012-12-12'
Description: 'AWS CloudFormation Sample Template WordPress_Single_Instance:
WordPress is web software you can use to create a beautiful website or blog. This
template installs a single-instance WordPress deployment using a local MySQL database
to store the data.'
Parameters:
KeyName: {Description: Name of an existing EC2 KeyPair
to enable SSH access to the instances, Type: String}
InstanceType:
Description: WebServer EC2 instance type
Type: String
Default: m1.large
AllowedValues: [t1.micro, m1.small, m1.large, m1.xlarge, m2.xlarge,
m2.2xlarge, m2.4xlarge, c1.medium, c1.xlarge, cc1.4xlarge]
ConstraintDescription: must be a valid EC2 instance type.
DBName: {Default: wordpress, Description: The
WordPress database name, Type: String, MinLength: '1',
MaxLength: '64', AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*',
ConstraintDescription: must begin with a letter and contain only
alphanumeric characters.}
DBUsername: {Default: admin, NoEcho: 'true',
Description: The WordPress database admin account username, Type: String,
MinLength: '1', MaxLength: '16', AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*',
ConstraintDescription: must begin with a letter and contain only
alphanumeric characters.}
DBPassword: {Default: admin, NoEcho: 'true',
Description: The WordPress database admin account password, Type: String,
MinLength: '1', MaxLength: '41', AllowedPattern: '[a-zA-Z0-9]*',
ConstraintDescription: must contain only alphanumeric characters.}
DBRootPassword: {Default: admin, NoEcho: 'true',
Description: Root password for MySQL, Type: String,
MinLength: '1', MaxLength: '41', AllowedPattern: '[a-zA-Z0-9]*',
ConstraintDescription: must contain only alphanumeric characters.}
LinuxDistribution:
Default: F17
Description: Distribution of choice
Type: String
AllowedValues: [F18, F17, U10, RHEL-6.1, RHEL-6.2, RHEL-6.3]
Mappings:
AWSInstanceType2Arch:
t1.micro: {Arch: '32'}
m1.small: {Arch: '32'}
m1.large: {Arch: '64'}
m1.xlarge: {Arch: '64'}
m2.xlarge: {Arch: '64'}
m2.2xlarge: {Arch: '64'}
m2.4xlarge: {Arch: '64'}
c1.medium: {Arch: '32'}
c1.xlarge: {Arch: '64'}
cc1.4xlarge: {Arch: '64'}
DistroArch2AMI:
F18: {'32': F18-i386-cfntools, '64': F18-x86_64-cfntools}
F17: {'32': F17-i386-cfntools, '64': F17-x86_64-cfntools}
U10: {'32': U10-i386-cfntools, '64': U10-x86_64-cfntools}
RHEL-6.1: {'32': rhel61-i386-cfntools, '64': rhel61-x86_64-cfntools}
RHEL-6.2: {'32': rhel62-i386-cfntools, '64': rhel62-x86_64-cfntools}
RHEL-6.3: {'32': rhel63-i386-cfntools, '64': rhel63-x86_64-cfntools}
Resources:
WikiDatabase:
Type: AWS::EC2::Instance
Metadata:
AWS::CloudFormation::Init:
config:
packages:
yum:
mysql: []
mysql-server: []
httpd: []
wordpress: []
services:
systemd:
mysqld: {enabled: 'true', ensureRunning: 'true'}
httpd: {enabled: 'true', ensureRunning: 'true'}
Properties:
ImageId:
Fn::FindInMap:
- DistroArch2AMI
- {Ref: LinuxDistribution}
- Fn::FindInMap:
- AWSInstanceType2Arch
- {Ref: InstanceType}
- Arch
InstanceType: {Ref: InstanceType}
KeyName: {Ref: KeyName}
UserData:
Fn::Base64:
Fn::Join:
- ''
- - '#!/bin/bash -v
'
- '/opt/aws/bin/cfn-init
'
- '# Setup MySQL root password and create a user
'
- mysqladmin -u root password '
- {Ref: DBRootPassword}
- '''
'
- cat << EOF | mysql -u root --password='
- {Ref: DBRootPassword}
- '''
'
- 'CREATE DATABASE '
- {Ref: DBName}
- ';
'
- 'GRANT ALL PRIVILEGES ON '
- {Ref: DBName}
- .* TO "
- {Ref: DBUsername}
- '"@"localhost"
'
- IDENTIFIED BY "
- {Ref: DBPassword}
- '";
'
- 'FLUSH PRIVILEGES;
'
- 'EXIT
'
- 'EOF
'
- 'sed -i "/Deny from All/d" /etc/httpd/conf.d/wordpress.conf
'
- 'sed -i "s/Require local/Require all granted/" /etc/httpd/conf.d/wordpress.conf
'
- sed --in-place --e s/database_name_here/
- {Ref: DBName}
- / --e s/username_here/
- {Ref: DBUsername}
- / --e s/password_here/
- {Ref: DBPassword}
- '/ /usr/share/wordpress/wp-config.php
'
- 'systemctl restart httpd.service
'
Outputs:
WebsiteURL:
Value:
Fn::Join:
- ''
- - http://
- Fn::GetAtt: [WikiDatabase, PublicIp]
- /wordpress
Description: URL for Wordpress wiki
name: High Availability WordPress
version: 1.0.0
services:
lb:
requires:
loadbalancer:
protocol:
- http
- https
constraints:
- algorithm: ROUND_ROBIN
relations:
- web: http
- master: http
master:
requires:
- compute:
type: linux
constraints:
os: {option: linuxdistribution}
flavor: {option: instancetype}
components:
wordpress:
requires:
- application:
name: wordpress
role: master
relations:
- backend: blogdb
constraints:
- count: 1
web:
requires:
- compute:
type: linux
constraints:
os: {option: linuxdistribution}
flavor: {option: instancetype}
components:
wordpress:
requires:
- application:
name: wordpress
role: web
relations:
- backend: blogdb
- master: wordpress
backend:
requires:
- datastore:
- type: mysql
components:
- blogdb:
requires:
- database:
constraints:
name: { option: dbname }
username: { option: dbusername }
password: { option: dbpassword }
rootpw: { option: dbrootpassword }
options:
instancetype:
description: Webserver instance type
type: string
default: m1.large
constraints:
- in:
values:
- m1.large
- m1.xlarge
- m2.large
- m2.xlarge
message: "Must be one of m1.large, m1.xlarge, m2.large, m2.xlarge"
dbname:
description: The wordpress database name
type: string
default: wordpress
constraints:
- len:
min: 1
max: 64
message: Must be between 1 and 64 characters
- matches:
expr: [a-zA-Z][a-zA-Z0-9]*
message: must begin with a letter and contain only alphanumeric characters
dbusername:
description: The wordpress database admin account username
type: string
default: admin
constraints:
- len:
min: 1
max: 16
message: must be between 1 and 16 characters
- matches:
expr: [a-zA-Z0-9]*
message: must contain only alphanumeric characters
dbpassword:
description: The WordPress database admin account password
type: password
default: admin
constraints:
- len:
min: 1
max: 41
message: must be between 1 and 41 characters
- matches:
expr: [a-zA-Z0-9]*
message: must contain only alphanumeric characters
dbrootpassword:
description: Root password for MySQL
type: password
default: admin
constraints:
- len:
min: 1
max: 41
message: must be between 1 and 41 characters
- matches:
expr: [a-zA-Z0-9]*
message: must contain only alphanumeric characters
linuxdistribution:
description: Distribution of choice
type: string
default: F17
constraints:
- in
values:
- F18
- F17
- U10
- RHEL-6.1
- RHEL-6.2
- RHEL-6.3
HeatTemplateFormatVersion: '2012-12-12'
Description: 'AWS CloudFormation Sample Template WordPress_Multi_Instance:
WordPress is web software you can use to create a beautiful website or blog. This
template installs two instances: one running a WordPress deployment and the other
using a local MySQL database to store the data.'
Parameters:
KeyName: {Description: Name of an existing EC2 KeyPair
to enable SSH access to the instances, Type: String}
InstanceType:
Description: WebServer EC2 instance type
Type: String
Default: m1.large
AllowedValues: [t1.micro, m1.small, m1.large, m1.xlarge, m2.xlarge,
m2.2xlarge, m2.4xlarge, c1.medium, c1.xlarge, cc1.4xlarge]
ConstraintDescription: must be a valid EC2 instance type.
DBName: {Default: wordpress, Description: The
WordPress database name, Type: String, MinLength: '1',
MaxLength: '64', AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*',
ConstraintDescription: must begin with a letter and contain only
alphanumeric characters.}
DBUsername: {Default: admin, NoEcho: 'true',
Description: The WordPress database admin account username, Type: String,
MinLength: '1', MaxLength: '16', AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*',
ConstraintDescription: must begin with a letter and contain only
alphanumeric characters.}
DBPassword: {Default: admin, NoEcho: 'true',
Description: The WordPress database admin account password, Type: String,
MinLength: '1', MaxLength: '41', AllowedPattern: '[a-zA-Z0-9]*',
ConstraintDescription: must contain only alphanumeric characters.}
DBRootPassword: {Default: admin, NoEcho: 'true',
Description: Root password for MySQL, Type: String,
MinLength: '1', MaxLength: '41', AllowedPattern: '[a-zA-Z0-9]*',
ConstraintDescription: must contain only alphanumeric characters.}
LinuxDistribution:
Default: F17
Description: Distribution of choice
Type: String
AllowedValues: [F18, F17, U10, RHEL-6.1, RHEL-6.2, RHEL-6.3]
HupPollInterval: {Default: '1', Description: Interval
for cfn-hup, Type: String}
Mappings:
AWSInstanceType2Arch:
t1.micro: {Arch: '32'}
m1.small: {Arch: '32'}
m1.large: {Arch: '64'}
m1.xlarge: {Arch: '64'}
m2.xlarge: {Arch: '64'}
m2.2xlarge: {Arch: '64'}
m2.4xlarge: {Arch: '64'}
c1.medium: {Arch: '32'}
c1.xlarge: {Arch: '64'}
cc1.4xlarge: {Arch: '64'}
DistroArch2AMI:
F18: {'32': F18-i386-cfntools, '64': F18-x86_64-cfntools}
F17: {'32': F17-i386-cfntools, '64': F17-x86_64-cfntools}
U10: {'32': U10-i386-cfntools, '64': U10-x86_64-cfntools}
RHEL-6.1: {'32': rhel61-i386-cfntools, '64': rhel61-x86_64-cfntools}
RHEL-6.2: {'32': rhel62-i386-cfntools, '64': rhel62-x86_64-cfntools}
RHEL-6.3: {'32': rhel63-i386-cfntools, '64': rhel63-x86_64-cfntools}
Resources:
CfnUser: {Type: 'AWS::IAM::User'}
WebServerKeys:
Type: AWS::IAM::AccessKey
Properties:
UserName: {Ref: CfnUser}
WebServerRestartPolicy:
Type: OS::Heat::HARestarter
Properties:
InstanceId: {Ref: WikiDatabase}
HttpFailureAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmDescription: Restart the WikiDatabase if httpd fails >
3 times in 10 minutes
MetricName: ServiceFailure
Namespace: system/linux
Statistic: SampleCount
Period: '300'
EvaluationPeriods: '1'
Threshold: '2'
AlarmActions:
- {Ref: WebServerRestartPolicy}
ComparisonOperator: GreaterThanThreshold
WikiDatabase:
Type: AWS::EC2::Instance
Metadata:
AWS::CloudFormation::Init:
config:
files:
/etc/cfn/cfn-credentials:
content:
Fn::Join:
- ''
- - AWSAccessKeyId=
- {Ref: WebServerKeys}
- '
'
- AWSSecretKey=
- Fn::GetAtt: [WebServerKeys, SecretAccessKey]
- '
'
mode: '000400'
owner: root
group: root
/etc/cfn/cfn-hup.conf:
content:
Fn::Join:
- ''
- - '[main]
'
- stack=
- {Ref: 'AWS::StackName'}
- '
'
- 'credential-file=/etc/cfn/cfn-credentials
'
- region=
- {Ref: 'AWS::Region'}
- '
'
- interval=
- {Ref: HupPollInterval}
- '
'
mode: '000400'
owner: root
group: root
/etc/cfn/notify-on-httpd-restarted:
content:
Fn::Join:
- ''
- - '#!/bin/sh
'
- '/opt/aws/bin/cfn-push-stats --watch '
- {Ref: HttpFailureAlarm}
- ' --service-failure
'
mode: '000700'
owner: root
group: root
/tmp/cfn-hup-crontab.txt:
content:
Fn::Join:
- ''
- ['MAIL=""
', '
', '* * * * * /opt/aws/bin/cfn-hup -f
']
mode: '000600'
owner: root
group: root
/tmp/setup.mysql:
content:
Fn::Join:
- ''
- - 'CREATE DATABASE '
- {Ref: DBName}
- ';
'
- 'GRANT ALL PRIVILEGES ON '
- {Ref: DBName}
- .* TO '
- {Ref: DBUsername}
- '''@''localhost''
'
- IDENTIFIED BY '
- {Ref: DBPassword}
- ''';
'
- 'FLUSH PRIVILEGES;
'
- 'EXIT
'
mode: '000644'
owner: root
group: root
/etc/cfn/hooks.conf:
content:
Fn::Join:
- ''
- ['[cfn-http-restarted]
', 'triggers=service.restarted
', 'path=Resources.WikiDatabase.Metadata
', 'action=/etc/cfn/notify-on-httpd-restarted
', 'runas=root
']
mode: '000400'
owner: root
group: root
packages:
yum:
cronie: []
mysql: []
mysql-server: []
httpd: []
wordpress: []
services:
systemd:
mysqld: {enabled: 'true', ensureRunning: 'true'}
httpd: {enabled: 'true', ensureRunning: 'true'}
crond: {enabled: 'true', ensureRunning: 'true'}
Properties:
ImageId:
Fn::FindInMap:
- DistroArch2AMI
- {Ref: LinuxDistribution}
- Fn::FindInMap:
- AWSInstanceType2Arch
- {Ref: InstanceType}
- Arch
InstanceType: {Ref: InstanceType}
KeyName: {Ref: KeyName}
UserData:
Fn::Base64:
Fn::Join:
- ''
- - '#!/bin/bash -v
'
- '# Helper function
'
- 'function error_exit
'
- '{
'
- ' /opt/aws/bin/cfn-signal -e 1 -r "$1" '''
- {Ref: WaitHandle}
- '''
'
- ' exit 1
'
- '}
'
- '/opt/aws/bin/cfn-init -s '
- {Ref: 'AWS::StackName'}
- ' -r WikiDatabase '
- ' --access-key '
- {Ref: WebServerKeys}
- ' --secret-key '
- Fn::GetAtt: [WebServerKeys, SecretAccessKey]
- ' --region '
- {Ref: 'AWS::Region'}
- ' || error_exit ''Failed to run cfn-init''
'
- '# Setup MySQL root password and create a user
'
- mysqladmin -u root password '
- {Ref: DBRootPassword}
- ''' || error_exit ''Failed to initialize root password''
'
- mysql -u root --password='
- {Ref: DBRootPassword}
- ''' < /tmp/setup.mysql || error_exit ''Failed to create database.''
'
- 'sed -i "/Deny from All/d" /etc/httpd/conf.d/wordpress.conf
'
- 'sed -i "s/Require local/Require all granted/" /etc/httpd/conf.d/wordpress.conf
'
- sed --in-place --e s/database_name_here/
- {Ref: DBName}
- / --e s/username_here/
- {Ref: DBUsername}
- / --e s/password_here/
- {Ref: DBPassword}
- '/ /usr/share/wordpress/wp-config.php
'
- 'systemctl restart httpd.service
'
- '# install cfn-hup crontab
'
- 'crontab /tmp/cfn-hup-crontab.txt
'
- '# All is well so signal success
'
- /opt/aws/bin/cfn-signal -e 0 -r "Wiki server setup complete" '
- {Ref: WaitHandle}
- '''
'
WaitHandle: {Type: 'AWS::CloudFormation::WaitConditionHandle'}
WaitCondition:
Type: AWS::CloudFormation::WaitCondition
DependsOn: WikiDatabase
Properties:
Handle: {Ref: WaitHandle}
Count: '1'
Timeout: '600'
Outputs:
WebsiteURL:
Value:
Fn::Join:
- ''
- - http://
- Fn::GetAtt: [WikiDatabase, PublicIp]
- /wordpress
Description: URL for Wordpress wiki
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment