Last active
August 29, 2015 14:20
-
-
Save nickveenhof/601c5dc1b76ff26896bf to your computer and use it in GitHub Desktop.
Drupaljam AutoScaling Example - See http://www.slideshare.net/nickvh/scaling-drupal-in-aws-using-autoscaling-cloudformation-rds-and-more for details
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"AWSTemplateFormatVersion":"2010-09-09", | |
"Description":"AWS CloudFormation Sample Template for HA Drupal in Multi AZ Deployments. ", | |
"Parameters":{ | |
"KeyName":{ | |
"Description":"EC2 KeyPair to enable SSH access to the instances", | |
"Default":"drupaljam", | |
"Type":"String", | |
"MinLength":"1", | |
"MaxLength":"255", | |
"AllowedPattern":"[\\x20-\\x7E]*", | |
"ConstraintDescription":"can contain only ASCII characters." | |
}, | |
"InstanceType":{ | |
"Description":"WebServer EC2 instance type", | |
"Type":"String", | |
"Default":"m3.medium", | |
"ConstraintDescription":"must be a valid EC2 instance type." | |
}, | |
"SiteName":{ | |
"Default":"Drupal", | |
"Description":"Drupal Web Site", | |
"Type":"String" | |
}, | |
"SiteEMail":{ | |
"Default":"[email protected]", | |
"Description":"Email for site admin", | |
"Type":"String" | |
}, | |
"SiteAdmin":{ | |
"Default":"admin", | |
"Description":"The Drupal site 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." | |
}, | |
"SitePassword":{ | |
"Default":"admin", | |
"NoEcho":"true", | |
"Description":"The Drupal site admin account password", | |
"Type":"String", | |
"MinLength":"1", | |
"MaxLength":"41", | |
"AllowedPattern":"[a-zA-Z0-9]*", | |
"ConstraintDescription":"must contain only alphanumeric characters." | |
}, | |
"DBName":{ | |
"Default":"myDatabase", | |
"Description":"MySQL 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":{ | |
"NoEcho":"true", | |
"Default":"dbuser", | |
"Description":"Username for MySQL database access", | |
"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":"dbpassword", | |
"NoEcho":"true", | |
"Description":"Password for MySQL database access", | |
"Type":"String", | |
"MinLength":"8", | |
"MaxLength":"41", | |
"AllowedPattern":"[a-zA-Z0-9]*", | |
"ConstraintDescription":"must contain only alphanumeric characters." | |
}, | |
"DBClass":{ | |
"Description":"The database instance type", | |
"Type":"String", | |
"Default":"db.m1.small", | |
"AllowedValues":[ | |
"db.t1.micro", | |
"db.m1.small", | |
"db.m1.medium", | |
"db.m1.large", | |
"db.m1.xlarge", | |
"db.m2.xlarge", | |
"db.m2.2xlarge", | |
"db.m2.4xlarge", | |
"db.m3.medium", | |
"db.m3.large", | |
"db.m3.xlarge", | |
"db.m3.2xlarge", | |
"db.r3.large", | |
"db.r3.xlarge", | |
"db.r3.2xlarge", | |
"db.r3.4xlarge", | |
"db.r3.8xlarge", | |
"db.m2.xlarge", | |
"db.m2.2xlarge", | |
"db.m2.4xlarge", | |
"db.cr1.8xlarge" | |
], | |
"ConstraintDescription":"must select a valid database instance type." | |
}, | |
"DBAllocatedStorage":{ | |
"Default":"5", | |
"Description":"The size of the database (Gb)", | |
"Type":"Number", | |
"MinValue":"5", | |
"MaxValue":"1024", | |
"ConstraintDescription":"must be between 5 and 1024Gb." | |
}, | |
"MultiAZDatabase":{ | |
"Default":"true", | |
"Description":"Create a multi-AZ MySQL Amazon RDS database instance", | |
"Type":"String", | |
"AllowedValues":[ | |
"true", | |
"false" | |
], | |
"ConstraintDescription":"must be either true or false." | |
}, | |
"WebServerCapacity":{ | |
"Default":"3", | |
"Description":"The initial number of WebServer instances", | |
"Type":"Number", | |
"MinValue":"2", | |
"MaxValue":"5", | |
"ConstraintDescription":"must be between 1 and 5 EC2 instances." | |
}, | |
"WebServerCapacitySingle":{ | |
"Default":"1", | |
"Description":"The initial number of WebServer instances", | |
"Type":"Number", | |
"MinValue":"1", | |
"MaxValue":"1", | |
"ConstraintDescription":"must be between 1 and 1 EC2 instances." | |
}, | |
"SSHLocation":{ | |
"Description":"The IP address range that can be used to SSH to the EC2 instances", | |
"Type":"String", | |
"MinLength":"9", | |
"MaxLength":"18", | |
"Default":"0.0.0.0/0", | |
"AllowedPattern":"(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})", | |
"ConstraintDescription":"must be a valid IP CIDR range of the form x.x.x.x/x." | |
} | |
}, | |
"Mappings":{ | |
"AWSInstanceType2Arch":{ | |
"t1.micro":{ | |
"Arch":"PV64" | |
}, | |
"t2.micro":{ | |
"Arch":"HVM64" | |
}, | |
"t2.small":{ | |
"Arch":"HVM64" | |
}, | |
"t2.medium":{ | |
"Arch":"HVM64" | |
}, | |
"m1.small":{ | |
"Arch":"PV64" | |
}, | |
"m1.medium":{ | |
"Arch":"PV64" | |
}, | |
"m1.large":{ | |
"Arch":"PV64" | |
}, | |
"m1.xlarge":{ | |
"Arch":"PV64" | |
}, | |
"m2.xlarge":{ | |
"Arch":"PV64" | |
}, | |
"m2.2xlarge":{ | |
"Arch":"PV64" | |
}, | |
"m2.4xlarge":{ | |
"Arch":"PV64" | |
}, | |
"m3.medium":{ | |
"Arch":"HVM64" | |
}, | |
"m3.large":{ | |
"Arch":"HVM64" | |
}, | |
"m3.xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"m3.2xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"c1.medium":{ | |
"Arch":"PV64" | |
}, | |
"c1.xlarge":{ | |
"Arch":"PV64" | |
}, | |
"c3.large":{ | |
"Arch":"HVM64" | |
}, | |
"c3.xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"c3.2xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"c3.4xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"c3.8xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"c4.large":{ | |
"Arch":"HVM64" | |
}, | |
"c4.xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"c4.2xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"c4.4xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"c4.8xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"g2.2xlarge":{ | |
"Arch":"HVMG2" | |
}, | |
"r3.large":{ | |
"Arch":"HVM64" | |
}, | |
"r3.xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"r3.2xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"r3.4xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"r3.8xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"i2.xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"i2.2xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"i2.4xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"i2.8xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"d2.xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"d2.2xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"d2.4xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"d2.8xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"hi1.4xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"hs1.8xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"cr1.8xlarge":{ | |
"Arch":"HVM64" | |
}, | |
"cc2.8xlarge":{ | |
"Arch":"HVM64" | |
} | |
}, | |
"AWSRegionArch2AMI":{ | |
"us-east-1":{ | |
"PV64":"ami-1ccae774", | |
"HVM64":"ami-10cae778", | |
"HVMG2":"ami-8c6b40e4" | |
}, | |
"us-west-2":{ | |
"PV64":"ami-ff527ecf", | |
"HVM64":"ami-e9527ed9", | |
"HVMG2":"ami-abbe919b" | |
}, | |
"us-west-1":{ | |
"PV64":"ami-d514f291", | |
"HVM64":"ami-cb14f28f", | |
"HVMG2":"ami-f31ffeb7" | |
}, | |
"eu-west-1":{ | |
"PV64":"ami-bf0897c8", | |
"HVM64":"ami-a30897d4", | |
"HVMG2":"ami-d5bc24a2" | |
}, | |
"eu-central-1":{ | |
"PV64":"ami-ac221fb1", | |
"HVM64":"ami-ae221fb3", | |
"HVMG2":"ami-7cd2ef61" | |
}, | |
"ap-northeast-1":{ | |
"PV64":"ami-27f90e27", | |
"HVM64":"ami-c7f90ec7", | |
"HVMG2":"ami-6318e863" | |
}, | |
"ap-southeast-1":{ | |
"PV64":"ami-acd9e8fe", | |
"HVM64":"ami-64d8e936", | |
"HVMG2":"ami-3807376a" | |
}, | |
"ap-southeast-2":{ | |
"PV64":"ami-ff9cecc5", | |
"HVM64":"ami-f39cecc9", | |
"HVMG2":"ami-89790ab3" | |
}, | |
"sa-east-1":{ | |
"PV64":"ami-bb2890a6", | |
"HVM64":"ami-b72890aa", | |
"HVMG2":"NOT_SUPPORTED" | |
}, | |
"cn-north-1":{ | |
"PV64":"ami-fa39abc3", | |
"HVM64":"ami-e839abd1", | |
"HVMG2":"NOT_SUPPORTED" | |
} | |
} | |
}, | |
"Resources":{ | |
"S3Bucket":{ | |
"Type":"AWS::S3::Bucket", | |
"DeletionPolicy":"Retain" | |
}, | |
"BucketPolicy":{ | |
"Type":"AWS::S3::BucketPolicy", | |
"Properties":{ | |
"PolicyDocument":{ | |
"Version":"2008-10-17", | |
"Id":"UploadPolicy", | |
"Statement":[ | |
{ | |
"Sid":"EnableReadWrite", | |
"Action":[ | |
"s3:GetObject", | |
"s3:PutObject", | |
"s3:PutObjectACL" | |
], | |
"Effect":"Allow", | |
"Resource":{ | |
"Fn::Join":[ | |
"", | |
[ | |
"arn:aws:s3:::", | |
{ | |
"Ref":"S3Bucket" | |
}, | |
"/*" | |
] | |
] | |
}, | |
"Principal":{ | |
"AWS":{ | |
"Fn::GetAtt":[ | |
"S3User", | |
"Arn" | |
] | |
} | |
} | |
} | |
] | |
}, | |
"Bucket":{ | |
"Ref":"S3Bucket" | |
} | |
} | |
}, | |
"S3User":{ | |
"Type":"AWS::IAM::User", | |
"Properties":{ | |
"Path":"/", | |
"Policies":[ | |
{ | |
"PolicyName":"root", | |
"PolicyDocument":{ | |
"Statement":[ | |
{ | |
"Effect":"Allow", | |
"Action":"s3:*", | |
"Resource":"*" | |
} | |
] | |
} | |
} | |
] | |
} | |
}, | |
"S3Keys":{ | |
"Type":"AWS::IAM::AccessKey", | |
"Properties":{ | |
"UserName":{ | |
"Ref":"S3User" | |
} | |
} | |
}, | |
"ElasticLoadBalancer":{ | |
"Type":"AWS::ElasticLoadBalancing::LoadBalancer", | |
"Metadata":{ | |
"Comment":"Configure the Load Balancer with a simple health check and cookie-based stickiness" | |
}, | |
"Properties":{ | |
"AvailabilityZones":[ | |
"us-east-1b", | |
"us-east-1d" | |
], | |
"LBCookieStickinessPolicy":[ | |
{ | |
"PolicyName":"CookieBasedPolicy", | |
"CookieExpirationPeriod":"30" | |
} | |
], | |
"Listeners":[ | |
{ | |
"LoadBalancerPort":"80", | |
"InstancePort":"80", | |
"Protocol":"HTTP", | |
"PolicyNames":[ | |
"CookieBasedPolicy" | |
] | |
} | |
], | |
"HealthCheck":{ | |
"Target":"HTTP:80/", | |
"HealthyThreshold":"2", | |
"UnhealthyThreshold":"5", | |
"Interval":"10", | |
"Timeout":"5" | |
} | |
} | |
}, | |
"WebServerGroup1":{ | |
"Type":"AWS::AutoScaling::AutoScalingGroup", | |
"Properties":{ | |
"AvailabilityZones":[ | |
"us-east-1b", | |
"us-east-1d" | |
], | |
"LaunchConfigurationName":{ | |
"Ref":"LaunchConfig1" | |
}, | |
"MinSize":"1", | |
"MaxSize":"5", | |
"DesiredCapacity":{ | |
"Ref":"WebServerCapacity" | |
}, | |
"LoadBalancerNames":[ | |
{ | |
"Ref":"ElasticLoadBalancer" | |
} | |
], | |
"Tags":[ | |
{ | |
"Key":"Name", | |
"Value":"Drupaljam Drupal Instance", | |
"PropagateAtLaunch":"true" | |
} | |
] | |
} | |
}, | |
"LaunchConfig1":{ | |
"Type":"AWS::AutoScaling::LaunchConfiguration", | |
"Metadata":{ | |
"AWS::CloudFormation::Init":{ | |
"config":{ | |
"packages":{ | |
"yum":{ | |
"httpd":[ | |
], | |
"php":[ | |
], | |
"php-mysql":[ | |
], | |
"php-gd":[ | |
], | |
"php-xml":[ | |
], | |
"php-mbstring":[ | |
], | |
"mysql":[ | |
], | |
"gcc":[ | |
], | |
"make":[ | |
], | |
"libstdc++-devel":[ | |
], | |
"gcc-c++":[ | |
], | |
"fuse":[ | |
], | |
"fuse-devel":[ | |
], | |
"libcurl-devel":[ | |
], | |
"libxml2-devel":[ | |
], | |
"openssl-devel":[ | |
], | |
"mailcap":[ | |
] | |
} | |
}, | |
"sources":{ | |
"/var/www/html":"http://ftp.drupal.org/files/projects/drupal-7.36.tar.gz", | |
"/home/ec2-user":"http://ftp.drupal.org/files/projects/drush-7.x-4.5.tar.gz", | |
"/home/ec2-user/s3fs":"http://s3fs.googlecode.com/files/s3fs-1.61.tar.gz" | |
}, | |
"files":{ | |
"/etc/passwd-s3fs":{ | |
"content":{ | |
"Fn::Join":[ | |
"", | |
[ | |
{ | |
"Ref":"S3Keys" | |
}, | |
":", | |
{ | |
"Fn::GetAtt":[ | |
"S3Keys", | |
"SecretAccessKey" | |
] | |
}, | |
"\n" | |
] | |
] | |
}, | |
"mode":"000400", | |
"owner":"root", | |
"group":"root" | |
}, | |
"/home/ec2-user/settings.php":{ | |
"content":{ | |
"Fn::Join":[ | |
"", | |
[ | |
"<?php\n", | |
"\n", | |
"$databases = array (\n", | |
" 'default' =>\n", | |
" array (\n", | |
" 'default' =>\n", | |
" array (\n", | |
" 'database' => '", | |
{ | |
"Ref":"DBName" | |
}, | |
"',\n", | |
" 'username' => '", | |
{ | |
"Ref":"DBUsername" | |
}, | |
"',\n", | |
" 'password' => '", | |
{ | |
"Ref":"DBPassword" | |
}, | |
"',\n", | |
" 'host' => '", | |
{ | |
"Fn::GetAtt":[ | |
"MasterDB", | |
"Endpoint.Address" | |
] | |
}, | |
"',\n", | |
" 'port' => '", | |
{ | |
"Fn::GetAtt":[ | |
"MasterDB", | |
"Endpoint.Port" | |
] | |
}, | |
"',\n", | |
" 'driver' => 'mysql',\n", | |
" 'prefix' => 'drupal_',\n", | |
" ),\n", | |
" ),\n", | |
");\n", | |
"\n", | |
"$update_free_access = FALSE;\n", | |
"\n", | |
"$drupal_hash_salt = '0c3R8noNALe3shsioQr5hK1dMHdwRfikLoSfqn0_xpA';\n", | |
"\n", | |
"ini_set('session.gc_probability', 1);\n", | |
"ini_set('session.gc_divisor', 100);\n", | |
"ini_set('session.gc_maxlifetime', 200000);\n", | |
"ini_set('session.cookie_lifetime', 2000000);\n" | |
] | |
] | |
}, | |
"mode":"000444", | |
"owner":"root", | |
"group":"root" | |
} | |
}, | |
"services":{ | |
"sysvinit":{ | |
"httpd":{ | |
"enabled":"true", | |
"ensureRunning":"true" | |
}, | |
"sendmail":{ | |
"enabled":"false", | |
"ensureRunning":"false" | |
} | |
} | |
} | |
} | |
} | |
}, | |
"Properties":{ | |
"ImageId":{ | |
"Fn::FindInMap":[ | |
"AWSRegionArch2AMI", | |
{ | |
"Ref":"AWS::Region" | |
}, | |
{ | |
"Fn::FindInMap":[ | |
"AWSInstanceType2Arch", | |
{ | |
"Ref":"InstanceType" | |
}, | |
"Arch" | |
] | |
} | |
] | |
}, | |
"InstanceType":{ | |
"Ref":"InstanceType" | |
}, | |
"SecurityGroups":[ | |
{ | |
"Ref":"WebServerSecurityGroup" | |
} | |
], | |
"KeyName":{ | |
"Ref":"KeyName" | |
}, | |
"UserData":{ | |
"Fn::Base64":{ | |
"Fn::Join":[ | |
"", | |
[ | |
"#!/bin/bash -v\n", | |
"yum update -y aws-cfn-bootstrap\n", | |
"# Helper function\n", | |
"function error_exit\n", | |
"{\n", | |
" /opt/aws/bin/cfn-signal -e 1 -r \"$1\" '", | |
{ | |
"Ref":"WaitHandle" | |
}, | |
"'\n", | |
" exit 1\n", | |
"}\n", | |
"# Install Apache Web Server, MySQL and Drupal\n", | |
"/opt/aws/bin/cfn-init -s ", | |
{ | |
"Ref":"AWS::StackId" | |
}, | |
" -r LaunchConfig1 ", | |
" --region ", | |
{ | |
"Ref":"AWS::Region" | |
}, | |
" || error_exit 'Failed to run cfn-init'\n", | |
"# Install s3fs\n", | |
"cd /home/ec2-user/s3fs/s3fs-1.61\n", | |
"./configure --prefix=/usr\n", | |
"make\n", | |
"make install\n", | |
"# Move the website files to the top level\n", | |
"mv /var/www/html/drupal-7.36/* /var/www/html\n", | |
"mv /var/www/html/drupal-7.36/.htaccess /var/www/html\n", | |
"rm -Rf /var/www/html/drupal-7.36\n", | |
"# Mount the S3 bucket\n", | |
"mv /var/www/html/sites/default/files /var/www/html/sites/default/files_original\n", | |
"mkdir -p /var/www/html/sites/default/files\n", | |
"s3fs -o allow_other -o use_cache=/tmp ", | |
{ | |
"Ref":"S3Bucket" | |
}, | |
" /var/www/html/sites/default/files || error_exit 'Failed to mount the S3 bucket'\n", | |
"echo `hostname` >> /var/www/html/sites/default/files/hosts\n", | |
"# Make changes to Apache Web Server configuration\n", | |
"sed -i 's/AllowOverride None/AllowOverride All/g' /etc/httpd/conf/httpd.conf\n", | |
"sed -i '/RewriteEngine on/a RewriteRule ^(scripts|profile|includes|cron\\.php|install\\.php|update\\.php|xmlrpc\\.php|filter($|/)|user($|/)|admin($|/)) - [F,L]' /var/www/html/.htaccess\n", | |
"service httpd restart\n", | |
"# Only execute the site install if we are the first host up - otherwise we'll end up losing all the data\n", | |
"read first < /var/www/html/sites/default/files/hosts\n", | |
"if [ `hostname` = $first ]\n", | |
"then\n", | |
" # Create the site in Drupal\n", | |
" cd /var/www/html\n", | |
" ~ec2-user/drush/drush site-install standard --yes", | |
" --site-name='", | |
{ | |
"Ref":"SiteName" | |
}, | |
"' --site-mail=", | |
{ | |
"Ref":"SiteEMail" | |
}, | |
" --account-name=", | |
{ | |
"Ref":"SiteAdmin" | |
}, | |
" --account-pass=", | |
{ | |
"Ref":"SitePassword" | |
}, | |
" --db-url=mysql://", | |
{ | |
"Ref":"DBUsername" | |
}, | |
":", | |
{ | |
"Ref":"DBPassword" | |
}, | |
"@", | |
{ | |
"Fn::GetAtt":[ | |
"MasterDB", | |
"Endpoint.Address" | |
] | |
}, | |
":", | |
{ | |
"Fn::GetAtt":[ | |
"MasterDB", | |
"Endpoint.Port" | |
] | |
}, | |
"/", | |
{ | |
"Ref":"DBName" | |
}, | |
" --db-prefix=drupal_\n", | |
" # use the S3 bucket for shared file storage\n", | |
" cp -R sites/default/files_original/* sites/default/files\n", | |
" cp -R sites/default/files_original/.htaccess sites/default/files\n", | |
"fi\n", | |
"# Copy settings.php file since everything else is configured\n", | |
"cp /home/ec2-user/settings.php /var/www/html/sites/default\n", | |
"rm /home/ec2-user/settings.php\n", | |
"# All is well so signal success\n", | |
"/opt/aws/bin/cfn-signal -e 0 -r \"Drupal setup complete\" '", | |
{ | |
"Ref":"WaitHandle" | |
}, | |
"'\n" | |
] | |
] | |
} | |
} | |
} | |
}, | |
"WebServerGroup2":{ | |
"Type":"AWS::AutoScaling::AutoScalingGroup", | |
"Properties":{ | |
"AvailabilityZones":[ | |
"us-east-1b" | |
], | |
"LaunchConfigurationName":{ | |
"Ref":"LaunchConfig2" | |
}, | |
"MinSize":"1", | |
"MaxSize":"1", | |
"DesiredCapacity":{ | |
"Ref":"WebServerCapacitySingle" | |
}, | |
"Tags":[ | |
{ | |
"Key":"Name", | |
"Value":"Drupaljam Drupal Instance", | |
"PropagateAtLaunch":"true" | |
} | |
] | |
} | |
}, | |
"LaunchConfig2":{ | |
"Type":"AWS::AutoScaling::LaunchConfiguration", | |
"Metadata":{ | |
"AWS::CloudFormation::Init":{ | |
"config":{ | |
"packages":{ | |
"yum":{ | |
"httpd":[ | |
], | |
"php":[ | |
], | |
"php-mysql":[ | |
], | |
"php-gd":[ | |
], | |
"php-xml":[ | |
], | |
"php-mbstring":[ | |
], | |
"mysql":[ | |
], | |
"gcc":[ | |
], | |
"make":[ | |
], | |
"libstdc++-devel":[ | |
], | |
"gcc-c++":[ | |
], | |
"fuse":[ | |
], | |
"fuse-devel":[ | |
], | |
"libcurl-devel":[ | |
], | |
"libxml2-devel":[ | |
], | |
"openssl-devel":[ | |
], | |
"mailcap":[ | |
] | |
} | |
}, | |
"sources":{ | |
"/var/www/html":"http://ftp.drupal.org/files/projects/drupal-7.36.tar.gz", | |
"/home/ec2-user":"http://ftp.drupal.org/files/projects/drush-7.x-4.5.tar.gz", | |
"/home/ec2-user/s3fs":"http://s3fs.googlecode.com/files/s3fs-1.61.tar.gz" | |
}, | |
"files":{ | |
"/etc/passwd-s3fs":{ | |
"content":{ | |
"Fn::Join":[ | |
"", | |
[ | |
{ | |
"Ref":"S3Keys" | |
}, | |
":", | |
{ | |
"Fn::GetAtt":[ | |
"S3Keys", | |
"SecretAccessKey" | |
] | |
}, | |
"\n" | |
] | |
] | |
}, | |
"mode":"000400", | |
"owner":"root", | |
"group":"root" | |
}, | |
"/home/ec2-user/settings.php":{ | |
"content":{ | |
"Fn::Join":[ | |
"", | |
[ | |
"<?php\n", | |
"\n", | |
"$databases = array (\n", | |
" 'default' =>\n", | |
" array (\n", | |
" 'default' =>\n", | |
" array (\n", | |
" 'database' => '", | |
{ | |
"Ref":"DBName" | |
}, | |
"',\n", | |
" 'username' => '", | |
{ | |
"Ref":"DBUsername" | |
}, | |
"',\n", | |
" 'password' => '", | |
{ | |
"Ref":"DBPassword" | |
}, | |
"',\n", | |
" 'host' => '", | |
{ | |
"Fn::GetAtt":[ | |
"MasterDB", | |
"Endpoint.Address" | |
] | |
}, | |
"',\n", | |
" 'port' => '", | |
{ | |
"Fn::GetAtt":[ | |
"MasterDB", | |
"Endpoint.Port" | |
] | |
}, | |
"',\n", | |
" 'driver' => 'mysql',\n", | |
" 'prefix' => 'drupal_',\n", | |
" ),\n", | |
" ),\n", | |
");\n", | |
"\n", | |
"$update_free_access = FALSE;\n", | |
"\n", | |
"$drupal_hash_salt = '0c3R8noNALe3shsioQr5hK1dMHdwRfikLoSfqn0_xpA';\n", | |
"\n", | |
"ini_set('session.gc_probability', 1);\n", | |
"ini_set('session.gc_divisor', 100);\n", | |
"ini_set('session.gc_maxlifetime', 200000);\n", | |
"ini_set('session.cookie_lifetime', 2000000);\n" | |
] | |
] | |
}, | |
"mode":"000444", | |
"owner":"root", | |
"group":"root" | |
} | |
}, | |
"services":{ | |
"sysvinit":{ | |
"httpd":{ | |
"enabled":"true", | |
"ensureRunning":"true" | |
}, | |
"sendmail":{ | |
"enabled":"false", | |
"ensureRunning":"false" | |
} | |
} | |
} | |
} | |
} | |
}, | |
"Properties":{ | |
"ImageId":{ | |
"Fn::FindInMap":[ | |
"AWSRegionArch2AMI", | |
{ | |
"Ref":"AWS::Region" | |
}, | |
{ | |
"Fn::FindInMap":[ | |
"AWSInstanceType2Arch", | |
{ | |
"Ref":"InstanceType" | |
}, | |
"Arch" | |
] | |
} | |
] | |
}, | |
"InstanceType":{ | |
"Ref":"InstanceType" | |
}, | |
"SecurityGroups":[ | |
{ | |
"Ref":"WebServerSecurityGroup" | |
} | |
], | |
"KeyName":{ | |
"Ref":"KeyName" | |
}, | |
"UserData":{ | |
"Fn::Base64":{ | |
"Fn::Join":[ | |
"", | |
[ | |
"#!/bin/bash -v\n", | |
"yum update -y aws-cfn-bootstrap\n", | |
"# Helper function\n", | |
"function error_exit\n", | |
"{\n", | |
" /opt/aws/bin/cfn-signal -e 1 -r \"$1\" '", | |
{ | |
"Ref":"WaitHandle" | |
}, | |
"'\n", | |
" exit 1\n", | |
"}\n", | |
"# Install Apache Web Server and Drupal\n", | |
"/opt/aws/bin/cfn-init -s ", | |
{ | |
"Ref":"AWS::StackId" | |
}, | |
" -r LaunchConfig2 ", | |
" --region ", | |
{ | |
"Ref":"AWS::Region" | |
}, | |
" || error_exit 'Failed to run cfn-init'\n", | |
"# Install s3fs\n", | |
"cd /home/ec2-user/s3fs/s3fs-1.61\n", | |
"./configure --prefix=/usr\n", | |
"make\n", | |
"make install\n", | |
"# Move the website files to the top level\n", | |
"mv /var/www/html/drupal-7.36/* /var/www/html\n", | |
"mv /var/www/html/drupal-7.36/.htaccess /var/www/html\n", | |
"rm -Rf /var/www/html/drupal-7.36\n", | |
"# Mount the S3 bucket\n", | |
"mv /var/www/html/sites/default/files /var/www/html/sites/default/files_original\n", | |
"mkdir -p /var/www/html/sites/default/files\n", | |
"s3fs -o allow_other -o use_cache=/tmp ", | |
{ | |
"Ref":"S3Bucket" | |
}, | |
" /var/www/html/sites/default/files || error_exit 'Failed to mount the S3 bucket'\n", | |
"echo `hostname` >> /var/www/html/sites/default/files/hosts\n", | |
"# Make changes to Apache Web Server configuration\n", | |
"sed -i 's/AllowOverride None/AllowOverride All/g' /etc/httpd/conf/httpd.conf\n", | |
"service httpd restart\n", | |
"# Only execute the site install if we are the first host up - otherwise we'll end up losing all the data\n", | |
"read first < /var/www/html/sites/default/files/hosts\n", | |
"if [ `hostname` = $first ]\n", | |
"then\n", | |
" # Create the site in Drupal\n", | |
" cd /var/www/html\n", | |
" ~ec2-user/drush/drush site-install standard --yes", | |
" --site-name='", | |
{ | |
"Ref":"SiteName" | |
}, | |
"' --site-mail=", | |
{ | |
"Ref":"SiteEMail" | |
}, | |
" --account-name=", | |
{ | |
"Ref":"SiteAdmin" | |
}, | |
" --account-pass=", | |
{ | |
"Ref":"SitePassword" | |
}, | |
" --db-url=mysql://", | |
{ | |
"Ref":"DBUsername" | |
}, | |
":", | |
{ | |
"Ref":"DBPassword" | |
}, | |
"@", | |
{ | |
"Fn::GetAtt":[ | |
"MasterDB", | |
"Endpoint.Address" | |
] | |
}, | |
":", | |
{ | |
"Fn::GetAtt":[ | |
"MasterDB", | |
"Endpoint.Port" | |
] | |
}, | |
"/", | |
{ | |
"Ref":"DBName" | |
}, | |
" --db-prefix=drupal_\n", | |
" # use the S3 bucket for shared file storage\n", | |
" cp -R sites/default/files_original/* sites/default/files\n", | |
" cp -R sites/default/files_original/.htaccess sites/default/files\n", | |
"fi\n", | |
"# Copy settings.php file since everything else is configured\n", | |
"cp /home/ec2-user/settings.php /var/www/html/sites/default\n", | |
"rm /home/ec2-user/settings.php\n", | |
"/usr/bin/mysql -u ", | |
{ | |
"Ref":"DBUsername" | |
}, | |
" -p", | |
{ | |
"Ref":"DBPassword" | |
}, | |
" -h ", | |
{ | |
"Fn::GetAtt":[ | |
"MasterDB", | |
"Endpoint.Address" | |
] | |
}, | |
" -D ", | |
{ | |
"Ref":"DBName" | |
}, | |
" -e 'update drupal_block set status = 0 where delta = \"login\"'\n", | |
"# All is well so signal success\n", | |
"/opt/aws/bin/cfn-signal -e 0 -r \"Drupal setup complete\" '", | |
{ | |
"Ref":"WaitHandle" | |
}, | |
"'\n" | |
] | |
] | |
} | |
} | |
} | |
}, | |
"WaitHandle":{ | |
"Type":"AWS::CloudFormation::WaitConditionHandle" | |
}, | |
"WaitCondition":{ | |
"Type":"AWS::CloudFormation::WaitCondition", | |
"DependsOn":"WebServerGroup1", | |
"Properties":{ | |
"Handle":{ | |
"Ref":"WaitHandle" | |
}, | |
"Timeout":"3000" | |
} | |
}, | |
"MasterDB":{ | |
"Type":"AWS::RDS::DBInstance", | |
"Properties":{ | |
"DBName":{ | |
"Ref":"DBName" | |
}, | |
"AllocatedStorage":{ | |
"Ref":"DBAllocatedStorage" | |
}, | |
"DBInstanceClass":{ | |
"Ref":"DBClass" | |
}, | |
"Engine":"MySQL", | |
"EngineVersion":"5.6", | |
"DBInstanceIdentifier":"MasterDB2", | |
"DBSecurityGroups":[ | |
{ | |
"Ref":"DBSecurityGroup" | |
} | |
], | |
"MasterUsername":{ | |
"Ref":"DBUsername" | |
}, | |
"MasterUserPassword":{ | |
"Ref":"DBPassword" | |
}, | |
"MultiAZ":{ | |
"Ref":"MultiAZDatabase" | |
}, | |
"Tags":[ | |
{ | |
"Key":"Name", | |
"Value":"Drupaljam Drupal Master Database" | |
} | |
] | |
}, | |
"DeletionPolicy":"Snapshot" | |
}, | |
"ReplicaDB":{ | |
"Type":"AWS::RDS::DBInstance", | |
"Properties":{ | |
"DBInstanceIdentifier":"SlaveDB2", | |
"SourceDBInstanceIdentifier":{ | |
"Ref":"MasterDB" | |
}, | |
"DBInstanceClass":{ | |
"Ref":"DBClass" | |
}, | |
"Tags":[ | |
{ | |
"Key":"Name", | |
"Value":"Drupaljam Drupal Read Replica Database" | |
} | |
] | |
} | |
}, | |
"DBSecurityGroup":{ | |
"Type":"AWS::RDS::DBSecurityGroup", | |
"Properties":{ | |
"DBSecurityGroupIngress":{ | |
"EC2SecurityGroupName":{ | |
"Ref":"WebServerSecurityGroup" | |
} | |
}, | |
"GroupDescription":"Frontend Access" | |
} | |
}, | |
"WebServerSecurityGroup":{ | |
"Type":"AWS::EC2::SecurityGroup", | |
"Properties":{ | |
"GroupDescription":"Enable HTTP access via port 80, locked down to requests from the load balancer only and SSH access", | |
"SecurityGroupIngress":[ | |
{ | |
"IpProtocol":"tcp", | |
"FromPort":"80", | |
"ToPort":"80", | |
"SourceSecurityGroupOwnerId":{ | |
"Fn::GetAtt":[ | |
"ElasticLoadBalancer", | |
"SourceSecurityGroup.OwnerAlias" | |
] | |
}, | |
"SourceSecurityGroupName":{ | |
"Fn::GetAtt":[ | |
"ElasticLoadBalancer", | |
"SourceSecurityGroup.GroupName" | |
] | |
} | |
}, | |
{ | |
"IpProtocol":"tcp", | |
"FromPort":"22", | |
"ToPort":"22", | |
"CidrIp":{ | |
"Ref":"SSHLocation" | |
} | |
} | |
] | |
} | |
} | |
}, | |
"Outputs":{ | |
"WebsiteURL":{ | |
"Value":{ | |
"Fn::Join":[ | |
"", | |
[ | |
"http://", | |
{ | |
"Fn::GetAtt":[ | |
"ElasticLoadBalancer", | |
"DNSName" | |
] | |
} | |
] | |
] | |
}, | |
"Description":"Drupal Website" | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment