Skip to content

Instantly share code, notes, and snippets.

@sredhar
Last active December 28, 2015 14:39

Revisions

  1. sredhar revised this gist Nov 17, 2013. 1 changed file with 1 addition and 44 deletions.
    45 changes: 1 addition & 44 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -105,50 +105,7 @@
    "php-pear" : []
    }
    },

    "files" : {
    "/var/www/html/index.php" : {
    "content" : { "Fn::Join" : ["", [
    "<?php\n",
    "echo '<h1>AWS CloudFormation sample application for Amazon ElastiCache</h1>';\n",
    "\n",
    "$server_endpoint = '", { "Fn::GetAtt" : [ "CacheCluster", "ConfigurationEndpoint.Address" ]}, "';\n",
    "$server_port = ", { "Fn::GetAtt" : [ "CacheCluster", "ConfigurationEndpoint.Port" ]}, ";\n",
    "\n",
    "/**\n",
    " * The following will initialize a Memcached client to utilize the Auto Discovery feature.\n",
    " * \n",
    " * By configuring the client with the Dynamic client mode with single endpoint, the\n",
    " * client will periodically use the configuration endpoint to retrieve the current cache\n",
    " * cluster configuration. This allows scaling the cache cluster up or down in number of nodes\n",
    " * without requiring any changes to the PHP application. \n",
    " */\n",
    "\n",
    "$dynamic_client = new Memcached();\n",
    "$dynamic_client->setOption(Memcached::OPT_CLIENT_MODE, Memcached::DYNAMIC_CLIENT_MODE);\n",
    "$dynamic_client->addServer($server_endpoint, $server_port);\n",
    "\n",
    "$tmp_object = new stdClass;\n",
    "$tmp_object->str_attr = 'test';\n",
    "$tmp_object->int_attr = 123;\n",
    "\n",
    "$dynamic_client->set('key', $tmp_object, 10) or die ('Failed to save data to the cache');\n",
    "echo '<p>Store data in the cache (data will expire in 10 seconds)</p>';\n",
    "\n",
    "$get_result = $dynamic_client->get('key');\n",
    "echo '<p>Data from the cache:<br/>';\n",
    "\n",
    "var_dump($get_result);\n",
    "\n",
    "echo '</p>';\n",
    "?>\n"
    ]]},
    "mode" : "000644",
    "owner" : "apache",
    "group" : "apache"
    }
    },


    "commands" : {
    "00_install_memcached_client" : {
    "command" : "pecl install https://s3.amazonaws.com/elasticache-downloads/ClusterClient/PHP/latest-64bit"
  2. sredhar created this gist Nov 17, 2013.
    212 changes: 212 additions & 0 deletions gistfile1.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,212 @@
    {
    "AWSTemplateFormatVersion" : "2013-11-07",

    "Description" : "AWS CloudFormation Template for mail. Creates a Auto Scaling group of web tier with load balancer, RDS and Elasticache cluster.",

    "Parameters" : {

    "KeyName" : {
    "Description" : "Name of an existing Amazon EC2 KeyPair for SSH access to the Web Server",
    "Type" : "String"
    },

    "InstanceType" : {
    "Description" : "Atmail WebServer EC2 instance type",
    "Type" : "String",
    "Default" : "m1.small",
    "AllowedValues" : [ "t1.micro","m1.small","m1.medium","m1.large","m1.xlarge", "m3.xlarge", "m3.2xlarge", "m2.xlarge","m2.2xlarge","m2.4xlarge","c1.medium","c1.xlarge","cc1.4xlarge","cc2.8xlarge","cg1.4xlarge", "hi1.4xlarge", "hs1.8xlarge"],
    "ConstraintDescription" : "must be a valid EC2 instance type."
    },

    "CacheNodeType" : {

    "Default" : "cache.m1.small",
    "Description" : "The compute and memory capacity of the nodes in the Cache Cluster",
    "Type" : "String",
    "AllowedValues" : [ "cache.m1.small", "cache.m1.large", "cache.m1.xlarge", "cache.m2.xlarge", "cache.m2.2xlarge", "cache.m2.4xlarge", "cache.c1.xlarge" ],
    "ConstraintDescription" : "must select a valid Cache Node type."
    },

    "NumberOfCacheNodes" : {
    "Default": "1",
    "Description" : "The number of Cache Nodes the Cache Cluster should have",
    "Type": "Number",
    "MinValue": "1",
    "MaxValue": "10",
    "ConstraintDescription" : "must be between 5 and 10."
    }
    },

    "Mappings" : {
    "AWSInstanceType2Arch" : {
    "t1.micro" : { "Arch" : "PV64" },
    "m1.small" : { "Arch" : "PV64" },
    "m1.medium" : { "Arch" : "PV64" },
    "m1.large" : { "Arch" : "PV64" },
    "m1.xlarge" : { "Arch" : "PV64" },
    "m3.xlarge" : { "Arch" : "PV64" },
    "m3.2xlarge" : { "Arch" : "PV64" }
    },

    "AWSRegionArch2AMI" : {
    "us-east-1" : { "PV64" : "ami-1624987f", "CLU64" : "ami-08249861", "GPU64" : "ami-02f54a6b" },
    "us-west-2" : { "PV64" : "ami-2a31bf1a", "CLU64" : "ami-2431bf14", "GPU64" : "NOT_YET_SUPPORTED" }
    }
    },

    "Resources" : {

    "CacheCluster" : {
    "Type": "AWS::ElastiCache::CacheCluster",
    "Properties": {
    "CacheNodeType" : { "Ref" : "CacheNodeType" },
    "CacheSecurityGroupNames" : [ { "Ref" : "CacheSecurityGroup" } ],
    "Engine" : "memcached",
    "NumCacheNodes" : { "Ref" : "NumberOfCacheNodes" }
    }
    },

    "CacheSecurityGroup": {
    "Type": "AWS::ElastiCache::SecurityGroup",
    "Properties": {
    "Description" : "Lock cache down to Web Server access only"
    }
    },

    "CacheSecurityGroupIngress": {
    "Type": "AWS::ElastiCache::SecurityGroupIngress",
    "Properties": {
    "CacheSecurityGroupName" : { "Ref" : "CacheSecurityGroup" },
    "EC2SecurityGroupName" : { "Ref" : "WebServerSecurityGroup" }
    }
    },

    "WebServerSecurityGroup" : {
    "Type" : "AWS::EC2::SecurityGroup",
    "Properties" : {
    "GroupDescription" : "Enable HTTP and SSH access",
    "SecurityGroupIngress" : [
    {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : { "Ref" : "SSHLocation"} },
    {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0"}
    ]
    }
    },

    "WebServerHost": {
    "Type" : "AWS::EC2::Instance",
    "Metadata" : {
    "AWS::CloudFormation::Init" : {
    "config" : {
    "packages" : {
    "yum" : {
    "httpd" : [],
    "gcc-c++" : [],
    "php" : [],
    "php-pear" : []
    }
    },

    "files" : {
    "/var/www/html/index.php" : {
    "content" : { "Fn::Join" : ["", [
    "<?php\n",
    "echo '<h1>AWS CloudFormation sample application for Amazon ElastiCache</h1>';\n",
    "\n",
    "$server_endpoint = '", { "Fn::GetAtt" : [ "CacheCluster", "ConfigurationEndpoint.Address" ]}, "';\n",
    "$server_port = ", { "Fn::GetAtt" : [ "CacheCluster", "ConfigurationEndpoint.Port" ]}, ";\n",
    "\n",
    "/**\n",
    " * The following will initialize a Memcached client to utilize the Auto Discovery feature.\n",
    " * \n",
    " * By configuring the client with the Dynamic client mode with single endpoint, the\n",
    " * client will periodically use the configuration endpoint to retrieve the current cache\n",
    " * cluster configuration. This allows scaling the cache cluster up or down in number of nodes\n",
    " * without requiring any changes to the PHP application. \n",
    " */\n",
    "\n",
    "$dynamic_client = new Memcached();\n",
    "$dynamic_client->setOption(Memcached::OPT_CLIENT_MODE, Memcached::DYNAMIC_CLIENT_MODE);\n",
    "$dynamic_client->addServer($server_endpoint, $server_port);\n",
    "\n",
    "$tmp_object = new stdClass;\n",
    "$tmp_object->str_attr = 'test';\n",
    "$tmp_object->int_attr = 123;\n",
    "\n",
    "$dynamic_client->set('key', $tmp_object, 10) or die ('Failed to save data to the cache');\n",
    "echo '<p>Store data in the cache (data will expire in 10 seconds)</p>';\n",
    "\n",
    "$get_result = $dynamic_client->get('key');\n",
    "echo '<p>Data from the cache:<br/>';\n",
    "\n",
    "var_dump($get_result);\n",
    "\n",
    "echo '</p>';\n",
    "?>\n"
    ]]},
    "mode" : "000644",
    "owner" : "apache",
    "group" : "apache"
    }
    },

    "commands" : {
    "00_install_memcached_client" : {
    "command" : "pecl install https://s3.amazonaws.com/elasticache-downloads/ClusterClient/PHP/latest-64bit"
    },
    "01_enable_auto_discovery" : {
    "command" : "echo 'extension=amazon-elasticache-cluster-client.so' > /etc/php.d/memcached.ini"
    }
    },

    "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",

    "# Setup the PHP sample application\n",
    "/opt/aws/bin/cfn-init ",
    " --stack ", { "Ref" : "AWS::StackName" },
    " --resource WebServerHost ",
    " --region ", { "Ref" : "AWS::Region" }, "\n",

    "# Signal the status of cfn-init\n",
    "/opt/aws/bin/cfn-signal -e $? '", { "Ref" : "WebServerWaitHandle" }, "'\n"
    ]]}}
    }
    },

    "WebServerWaitHandle" : {
    "Type" : "AWS::CloudFormation::WaitConditionHandle"
    },

    "WebServerWaitCondition" : {
    "Type" : "AWS::CloudFormation::WaitCondition",
    "DependsOn" : "WebServerHost",
    "Properties" : {
    "Handle" : {"Ref" : "WebServerWaitHandle"},
    "Timeout" : "300"
    }
    }
    },

    "Outputs" : {
    "WebsiteURL" : {
    "Value" : { "Fn::Join" : ["", ["http://", { "Fn::GetAtt" : [ "WebServerHost", "PublicDnsName" ]} ]] },
    "Description" : "Application URL"
    }
    }
    }