{
  "AWSTemplateFormatVersion": "2010-09-09",
  "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 WordPress with a local MySQL database for storage. It demonstrates using the AWS CloudFormation bootstrap scripts to deploy WordPress. **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": "AWS::EC2::KeyPair::KeyName",
      "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
    },
    "InstanceType": {
      "Description": "WebServer EC2 instance type",
      "Type": "String",
      "Default": "t2.small",
      "AllowedValues": [
        "t1.micro",
        "t2.nano",
        "t2.micro",
        "t2.small",
        "t2.medium",
        "t2.large",
        "m1.small",
        "m1.medium",
        "m1.large",
        "m1.xlarge",
        "m2.xlarge",
        "m2.2xlarge",
        "m2.4xlarge",
        "m3.medium",
        "m3.large",
        "m3.xlarge",
        "m3.2xlarge",
        "m4.large",
        "m4.xlarge",
        "m4.2xlarge",
        "m4.4xlarge",
        "m4.10xlarge",
        "c1.medium",
        "c1.xlarge",
        "c3.large",
        "c3.xlarge",
        "c3.2xlarge",
        "c3.4xlarge",
        "c3.8xlarge",
        "c4.large",
        "c4.xlarge",
        "c4.2xlarge",
        "c4.4xlarge",
        "c4.8xlarge",
        "g2.2xlarge",
        "g2.8xlarge",
        "r3.large",
        "r3.xlarge",
        "r3.2xlarge",
        "r3.4xlarge",
        "r3.8xlarge",
        "i2.xlarge",
        "i2.2xlarge",
        "i2.4xlarge",
        "i2.8xlarge",
        "d2.xlarge",
        "d2.2xlarge",
        "d2.4xlarge",
        "d2.8xlarge",
        "hi1.4xlarge",
        "hs1.8xlarge",
        "cr1.8xlarge",
        "cc2.8xlarge",
        "cg1.4xlarge"
      ],
      "ConstraintDescription": "must be a valid EC2 instance type."
    },
    "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."
    },
    "DBName": {
      "Default": "wordpressdb",
      "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."
    },
    "DBUser": {
      "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": {
      "NoEcho": "true",
      "Description": "The WordPress database admin account password",
      "Type": "String",
      "MinLength": "8",
      "MaxLength": "41",
      "AllowedPattern": "[a-zA-Z0-9]*",
      "ConstraintDescription": "must contain only alphanumeric characters."
    },
    "DBRootPassword": {
      "NoEcho": "true",
      "Description": "MySQL root password",
      "Type": "String",
      "MinLength": "8",
      "MaxLength": "41",
      "AllowedPattern": "[a-zA-Z0-9]*",
      "ConstraintDescription": "must contain only alphanumeric characters."
    }
  },
  "Mappings": {
    "AWSInstanceType2Arch": {
      "t1.micro": {
        "Arch": "HVM64"
      },
      "t2.nano": {
        "Arch": "HVM64"
      },
      "t2.micro": {
        "Arch": "HVM64"
      },
      "t2.small": {
        "Arch": "HVM64"
      },
      "t2.medium": {
        "Arch": "HVM64"
      },
      "t2.large": {
        "Arch": "HVM64"
      },
      "m1.small": {
        "Arch": "HVM64"
      },
      "m1.medium": {
        "Arch": "HVM64"
      },
      "m1.large": {
        "Arch": "HVM64"
      },
      "m1.xlarge": {
        "Arch": "HVM64"
      },
      "m2.xlarge": {
        "Arch": "HVM64"
      },
      "m2.2xlarge": {
        "Arch": "HVM64"
      },
      "m2.4xlarge": {
        "Arch": "HVM64"
      },
      "m3.medium": {
        "Arch": "HVM64"
      },
      "m3.large": {
        "Arch": "HVM64"
      },
      "m3.xlarge": {
        "Arch": "HVM64"
      },
      "m3.2xlarge": {
        "Arch": "HVM64"
      },
      "m4.large": {
        "Arch": "HVM64"
      },
      "m4.xlarge": {
        "Arch": "HVM64"
      },
      "m4.2xlarge": {
        "Arch": "HVM64"
      },
      "m4.4xlarge": {
        "Arch": "HVM64"
      },
      "m4.10xlarge": {
        "Arch": "HVM64"
      },
      "c1.medium": {
        "Arch": "HVM64"
      },
      "c1.xlarge": {
        "Arch": "HVM64"
      },
      "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"
      },
      "g2.8xlarge": {
        "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"
      }
    },
    "AWSInstanceType2NATArch": {
      "t1.micro": {
        "Arch": "NATHVM64"
      },
      "t2.nano": {
        "Arch": "NATHVM64"
      },
      "t2.micro": {
        "Arch": "NATHVM64"
      },
      "t2.small": {
        "Arch": "NATHVM64"
      },
      "t2.medium": {
        "Arch": "NATHVM64"
      },
      "t2.large": {
        "Arch": "NATHVM64"
      },
      "m1.small": {
        "Arch": "NATHVM64"
      },
      "m1.medium": {
        "Arch": "NATHVM64"
      },
      "m1.large": {
        "Arch": "NATHVM64"
      },
      "m1.xlarge": {
        "Arch": "NATHVM64"
      },
      "m2.xlarge": {
        "Arch": "NATHVM64"
      },
      "m2.2xlarge": {
        "Arch": "NATHVM64"
      },
      "m2.4xlarge": {
        "Arch": "NATHVM64"
      },
      "m3.medium": {
        "Arch": "NATHVM64"
      },
      "m3.large": {
        "Arch": "NATHVM64"
      },
      "m3.xlarge": {
        "Arch": "NATHVM64"
      },
      "m3.2xlarge": {
        "Arch": "NATHVM64"
      },
      "m4.large": {
        "Arch": "NATHVM64"
      },
      "m4.xlarge": {
        "Arch": "NATHVM64"
      },
      "m4.2xlarge": {
        "Arch": "NATHVM64"
      },
      "m4.4xlarge": {
        "Arch": "NATHVM64"
      },
      "m4.10xlarge": {
        "Arch": "NATHVM64"
      },
      "c1.medium": {
        "Arch": "NATHVM64"
      },
      "c1.xlarge": {
        "Arch": "NATHVM64"
      },
      "c3.large": {
        "Arch": "NATHVM64"
      },
      "c3.xlarge": {
        "Arch": "NATHVM64"
      },
      "c3.2xlarge": {
        "Arch": "NATHVM64"
      },
      "c3.4xlarge": {
        "Arch": "NATHVM64"
      },
      "c3.8xlarge": {
        "Arch": "NATHVM64"
      },
      "c4.large": {
        "Arch": "NATHVM64"
      },
      "c4.xlarge": {
        "Arch": "NATHVM64"
      },
      "c4.2xlarge": {
        "Arch": "NATHVM64"
      },
      "c4.4xlarge": {
        "Arch": "NATHVM64"
      },
      "c4.8xlarge": {
        "Arch": "NATHVM64"
      },
      "g2.2xlarge": {
        "Arch": "NATHVMG2"
      },
      "g2.8xlarge": {
        "Arch": "NATHVMG2"
      },
      "r3.large": {
        "Arch": "NATHVM64"
      },
      "r3.xlarge": {
        "Arch": "NATHVM64"
      },
      "r3.2xlarge": {
        "Arch": "NATHVM64"
      },
      "r3.4xlarge": {
        "Arch": "NATHVM64"
      },
      "r3.8xlarge": {
        "Arch": "NATHVM64"
      },
      "i2.xlarge": {
        "Arch": "NATHVM64"
      },
      "i2.2xlarge": {
        "Arch": "NATHVM64"
      },
      "i2.4xlarge": {
        "Arch": "NATHVM64"
      },
      "i2.8xlarge": {
        "Arch": "NATHVM64"
      },
      "d2.xlarge": {
        "Arch": "NATHVM64"
      },
      "d2.2xlarge": {
        "Arch": "NATHVM64"
      },
      "d2.4xlarge": {
        "Arch": "NATHVM64"
      },
      "d2.8xlarge": {
        "Arch": "NATHVM64"
      },
      "hi1.4xlarge": {
        "Arch": "NATHVM64"
      },
      "hs1.8xlarge": {
        "Arch": "NATHVM64"
      },
      "cr1.8xlarge": {
        "Arch": "NATHVM64"
      },
      "cc2.8xlarge": {
        "Arch": "NATHVM64"
      }
    },
    "AWSRegionArch2AMI": {
      "us-east-1": {
        "HVM64": "ami-0080e4c5bc078760e",
        "HVMG2": "ami-0aeb704d503081ea6"
      },
      "us-west-2": {
        "HVM64": "ami-01e24be29428c15b2",
        "HVMG2": "ami-0fe84a5b4563d8f27"
      },
      "us-west-1": {
        "HVM64": "ami-0ec6517f6edbf8044",
        "HVMG2": "ami-0a7fc72dc0e51aa77"
      },
      "eu-west-1": {
        "HVM64": "ami-08935252a36e25f85",
        "HVMG2": "ami-0d5299b1c6112c3c7"
      },
      "eu-west-2": {
        "HVM64": "ami-01419b804382064e4",
        "HVMG2": "NOT_SUPPORTED"
      },
      "eu-west-3": {
        "HVM64": "ami-0dd7e7ed60da8fb83",
        "HVMG2": "NOT_SUPPORTED"
      },
      "eu-central-1": {
        "HVM64": "ami-0cfbf4f6db41068ac",
        "HVMG2": "ami-0aa1822e3eb913a11"
      },
      "eu-north-1": {
        "HVM64": "ami-86fe70f8",
        "HVMG2": "ami-32d55b4c"
      },
      "ap-northeast-1": {
        "HVM64": "ami-00a5245b4816c38e6",
        "HVMG2": "ami-09d0e0e099ecabba2"
      },
      "ap-northeast-2": {
        "HVM64": "ami-00dc207f8ba6dc919",
        "HVMG2": "NOT_SUPPORTED"
      },
      "ap-northeast-3": {
        "HVM64": "ami-0b65f69a5c11f3522",
        "HVMG2": "NOT_SUPPORTED"
      },
      "ap-southeast-1": {
        "HVM64": "ami-05b3bcf7f311194b3",
        "HVMG2": "ami-0e46ce0d6a87dc979"
      },
      "ap-southeast-2": {
        "HVM64": "ami-02fd0b06f06d93dfc",
        "HVMG2": "ami-0c0ab057a101d8ff2"
      },
      "ap-south-1": {
        "HVM64": "ami-0ad42f4f66f6c1cc9",
        "HVMG2": "ami-0244c1d42815af84a"
      },
      "us-east-2": {
        "HVM64": "ami-0cd3dfa4e37921605",
        "HVMG2": "NOT_SUPPORTED"
      },
      "ca-central-1": {
        "HVM64": "ami-07423fb63ea0a0930",
        "HVMG2": "NOT_SUPPORTED"
      },
      "sa-east-1": {
        "HVM64": "ami-05145e0b28ad8e0b2",
        "HVMG2": "NOT_SUPPORTED"
      },
      "cn-north-1": {
        "HVM64": "ami-053617c9d818c1189",
        "HVMG2": "NOT_SUPPORTED"
      },
      "cn-northwest-1": {
        "HVM64": "ami-0f7937761741dc640",
        "HVMG2": "NOT_SUPPORTED"
      }
    }
  },
  "Resources": {
    "WebServerSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Enable HTTP access via port 80 locked down to the load balancer + SSH access",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": "80",
            "ToPort": "80",
            "CidrIp": "0.0.0.0/0"
          },
          {
            "IpProtocol": "tcp",
            "FromPort": "22",
            "ToPort": "22",
            "CidrIp": {
              "Ref": "SSHLocation"
            }
          }
        ]
      }
    },
    "WebServer": {
      "Type": "AWS::EC2::Instance",
      "Metadata": {
        "AWS::CloudFormation::Init": {
          "configSets": {
            "wordpress_install": [
              "install_cfn",
              "install_wordpress",
              "configure_wordpress"
            ]
          },
          "install_cfn": {
            "files": {
              "/etc/cfn/cfn-hup.conf": {
                "content": {
                  "Fn::Join": [
                    "",
                    [
                      "[main]\n",
                      "stack=",
                      {
                        "Ref": "AWS::StackId"
                      },
                      "\n",
                      "region=",
                      {
                        "Ref": "AWS::Region"
                      },
                      "\n"
                    ]
                  ]
                },
                "mode": "000400",
                "owner": "root",
                "group": "root"
              },
              "/etc/cfn/hooks.d/cfn-auto-reloader.conf": {
                "content": {
                  "Fn::Join": [
                    "",
                    [
                      "[cfn-auto-reloader-hook]\n",
                      "triggers=post.update\n",
                      "path=Resources.WebServer.Metadata.AWS::CloudFormation::Init\n",
                      "action=/opt/aws/bin/cfn-init -v ",
                      "         --stack ",
                      {
                        "Ref": "AWS::StackName"
                      },
                      "         --resource WebServer ",
                      "         --configsets wordpress_install ",
                      "         --region ",
                      {
                        "Ref": "AWS::Region"
                      },
                      "\n"
                    ]
                  ]
                },
                "mode": "000400",
                "owner": "root",
                "group": "root"
              }
            },
            "services": {
              "sysvinit": {
                "cfn-hup": {
                  "enabled": "true",
                  "ensureRunning": "true",
                  "files": [
                    "/etc/cfn/cfn-hup.conf",
                    "/etc/cfn/hooks.d/cfn-auto-reloader.conf"
                  ]
                }
              }
            }
          },
          "install_wordpress": {
            "packages": {
              "yum": {
                "php": [],
                "php-mysql": [],
                "mysql": [],
                "mysql-server": [],
                "mysql-devel": [],
                "mysql-libs": [],
                "httpd": []
              }
            },
            "sources": {
              "/var/www/html": "https://wordpress.org/wordpress-5.1.1.tar.gz"
            },
            "files": {
              "/tmp/setup.mysql": {
                "content": {
                  "Fn::Join": [
                    "",
                    [
                      "CREATE DATABASE ",
                      {
                        "Ref": "DBName"
                      },
                      ";\n",
                      "CREATE USER '",
                      {
                        "Ref": "DBUser"
                      },
                      "'@'localhost' IDENTIFIED BY '",
                      {
                        "Ref": "DBPassword"
                      },
                      "';\n",
                      "GRANT ALL ON ",
                      {
                        "Ref": "DBName"
                      },
                      ".* TO '",
                      {
                        "Ref": "DBUser"
                      },
                      "'@'localhost';\n",
                      "FLUSH PRIVILEGES;\n"
                    ]
                  ]
                },
                "mode": "000400",
                "owner": "root",
                "group": "root"
              },
              "/tmp/create-wp-config": {
                "content": {
                  "Fn::Join": [
                    "",
                    [
                      "#!/bin/bash -xe\n",
                      "cp /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php\n",
                      "chmod -R 755  /var/www/html/wordpress/wp-content\n",
					  "chown -R apache:apache /var/www/html/wordpress/wp-content\n",
                      "sed -i \"s/'database_name_here'/'",
                      {
                        "Ref": "DBName"
                      },
                      "'/g\" wp-config.php\n",
                      "sed -i \"s/'username_here'/'",
                      {
                        "Ref": "DBUser"
                      },
                      "'/g\" wp-config.php\n",
                      "sed -i \"s/'password_here'/'",
                      {
                        "Ref": "DBPassword"
                      },
                      "'/g\" wp-config.php\n"
                    ]
                  ]
                },
                "mode": "000500",
                "owner": "root",
                "group": "root"
              }
            },
            "services": {
              "sysvinit": {
                "httpd": {
                  "enabled": "true",
                  "ensureRunning": "true"
                },
                "mysqld": {
                  "enabled": "true",
                  "ensureRunning": "true"
                }
              }
            }
          },
          "configure_wordpress": {
            "commands": {
              "01_set_mysql_root_password": {
                "command": {
                  "Fn::Join": [
                    "",
                    [
                      "mysqladmin -u root password '",
                      {
                        "Ref": "DBRootPassword"
                      },
                      "'"
                    ]
                  ]
                },
                "test": {
                  "Fn::Join": [
                    "",
                    [
                      "$(mysql ",
                      {
                        "Ref": "DBName"
                      },
                      " -u root --password='",
                      {
                        "Ref": "DBRootPassword"
                      },
                      "' >/dev/null 2>&1 </dev/null); (( $? != 0 ))"
                    ]
                  ]
                }
              },
              "02_create_database": {
                "command": {
                  "Fn::Join": [
                    "",
                    [
                      "mysql -u root --password='",
                      {
                        "Ref": "DBRootPassword"
                      },
                      "' < /tmp/setup.mysql"
                    ]
                  ]
                },
                "test": {
                  "Fn::Join": [
                    "",
                    [
                      "$(mysql ",
                      {
                        "Ref": "DBName"
                      },
                      " -u root --password='",
                      {
                        "Ref": "DBRootPassword"
                      },
                      "' >/dev/null 2>&1 </dev/null); (( $? != 0 ))"
                    ]
                  ]
                }
              },
              "03_configure_wordpress": {
                "command": "/tmp/create-wp-config",
                "cwd": "/var/www/html/wordpress"
              }
            }
          }
        }
      },
      "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 -xe\n",
                "yum update -y aws-cfn-bootstrap\n",
                "/opt/aws/bin/cfn-init -v ",
                "         --stack ",
                {
                  "Ref": "AWS::StackName"
                },
                "         --resource WebServer ",
                "         --configsets wordpress_install ",
                "         --region ",
                {
                  "Ref": "AWS::Region"
                },
                "\n",
                "/opt/aws/bin/cfn-signal -e $? ",
                "         --stack ",
                {
                  "Ref": "AWS::StackName"
                },
                "         --resource WebServer ",
                "         --region ",
                {
                  "Ref": "AWS::Region"
                },
                "\n"
              ]
            ]
          }
        }
      },
      "CreationPolicy": {
        "ResourceSignal": {
          "Timeout": "PT15M"
        }
      }
    }
  },
  "Outputs": {
    "WebsiteURL": {
      "Value": {
        "Fn::Join": [
          "",
          [
            "http://",
            {
              "Fn::GetAtt": [
                "WebServer",
                "PublicDnsName"
              ]
            },
            "/wordpress"
          ]
        ]
      },
      "Description": "WordPress Website"
    }
  }
}