--- AWSTemplateFormatVersion: '2010-09-09' Description: | AWS CloudFormation Sample Template Drupal_Single_Instance. Drupal is an open source content management platform powering millions of websites and applications. This template installs a singe instance deployment with a local MySQL database for storage. It uses the AWS CloudFormation bootstrap scripts to install packages and files at instance launch time. **WARNING** This template creates an Amazon EC2 instance. You will be billed for the AWS resources used if you create a stack from this template. Parameters: KeyName: Description: Name of an existing EC2 KeyPair to enable SSH access to the instances Type: String MinLength: 1 MaxLength: 255 AllowedPattern: '[\x20-\x7E]*' ConstraintDescription: can contain only ASCII characters. 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 - m3.xlarge - m3.2xlarge - c1.medium - c1.xlarge - cc1.4xlarge - cc2.8xlarge - cg1.4xlarge ConstraintDescription: must be a valid EC2 instance type. SiteName: Default: My Site Description: The name of the Drupal Site Type: String SiteEMail: Description: EMail for site adminitrator Type: String SiteAdmin: 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: 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: drupaldb Description: The Drupal 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 Drupal 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 Drupal database admin account password Type: String MinLength: 1 MaxLength: 41 AllowedPattern: '[a-zA-Z0-9]*' ConstraintDescription: must contain only alphanumeric characters. DBRootPassword: NoEcho: 'true' Description: Root password for MySQL Type: String MinLength: 1 MaxLength: 41 AllowedPattern: '[a-zA-Z0-9]*' ConstraintDescription: must contain only alphanumeric characters. 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: 64 m1.small: Arch: 64 m1.medium: Arch: 64 m1.large: Arch: 64 m1.xlarge: Arch: 64 m2.xlarge: Arch: 64 m2.2xlarge: Arch: 64 m2.4xlarge: Arch: 64 m3.xlarge: Arch: 64 m3.2xlarge: Arch: 64 c1.medium: Arch: 64 c1.xlarge: Arch: 64 cc1.4xlarge: Arch: 64HVM cc2.8xlarge: Arch: 64HVM cg1.4xlarge: Arch: 64HVM AWSRegionArch2AMI: us-east-1: 32: ami-a0cd60c9 64: ami-aecd60c7 64HVM: ami-a8cd60c1 us-west-2: 32: ami-46da5576 64: ami-48da5578 64HVM: NOT_YET_SUPPORTED us-west-1: 32: ami-7d4c6938 64: ami-734c6936 64HVM: NOT_YET_SUPPORTED eu-west-1: 32: ami-61555115 64: ami-6d555119 64HVM: ami-67555113 ap-southeast-1: 32: ami-220b4a70 64: ami-3c0b4a6e 64HVM: NOT_YET_SUPPORTED ap-southeast-2: 32: ami-b3990e89 64: ami-bd990e87 64HVM: NOT_YET_SUPPORTED ap-northeast-1: 32: ami-2a19aa2b 64: ami-2819aa29 64HVM: NOT_YET_SUPPORTED sa-east-1: 32: ami-f836e8e5 64: ami-fe36e8e3 64HVM: NOT_YET_SUPPORTED Resources: WebServer: Type: AWS::EC2::Instance Metadata: AWS::CloudFormation::Init: config: packages: yum: httpd: [] php: [] php-mysql: [] php-gd: [] php-xml: [] php-mbstring: [] mysql: [] mysql-server: [] mysql-devel: [] mysql-libs: [] sources: /var/www/html: http://ftp.drupal.org/files/projects/drupal-7.8.tar.gz /home/ec2-user: http://ftp.drupal.org/files/projects/drush-7.x-4.5.tar.gz files: /tmp/setup.mysql: content: Fn::Join: - '' - [ "CREATE DATABASE ", { Ref: DBName }, ";\n", "CREATE USER '", { Ref: DBUsername }, "'@'localhost' IDENTIFIED BY '", { Ref: DBPassword }, "';\n", "GRANT ALL ON ", { Ref: DBName }, ".* TO '", { Ref: DBUsername }, "'@'localhost';\n", "FLUSH PRIVILEGES;\n" ] mode: '000644' owner: root group: root services: sysvinit: httpd: enabled: 'true' ensureRunning: 'true' mysqld: 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 0 -r \"$1\" '", { Ref: WaitHandle }, "'\n", " exit 1\n", "}\n", "# Install Apache Web Server, MySQL, PHP and Drupal\n", "/opt/aws/bin/cfn-init -s ", { Ref: "AWS::StackId" }, " -r WebServer --region ", { Ref: "AWS::Region" }, " || error_exit 'Failed to run cfn-init'\n", "# Setup MySQL root password and create a user\n", "mysqladmin -u root password '", { Ref: DBRootPassword }, "' || error_exit 'Failed to initialize root password'\n", "mysql -u root --password='", { Ref: DBRootPassword }, "' < /tmp/setup.mysql || error_exit 'Failed to create database user'\n", "# Make changes to Apache Web Server configuration\n", "mv /var/www/html/drupal-7.8/* /var/www/html\n", "mv /var/www/html/drupal-7.8/.* /var/www/html\n", "rmdir /var/www/html/drupal-7.8\n", "sed -i 's/AllowOverride None/AllowOverride All/g' /etc/httpd/conf/httpd.conf\n", "service httpd restart\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 }, "@localhost/", { Ref: DBName }, " --db-prefix=drupal_\n", "chown apache:apache sites/default/files\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: WebServer Properties: Handle: Ref: WaitHandle Timeout: 300 WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Enable HTTP access via port 80 and SSH access SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: Ref: SSHLocation Outputs: WebsiteURL: Value: Fn::Join: - '' - - http:// - Fn::GetAtt: - WebServer - PublicDnsName Description: Drupal Website