From 7f1e1a65f9b82c27b612b1d100242589ae87f00a Mon Sep 17 00:00:00 2001
From: e0d <edward@indeterminate.org>
Date: Mon, 29 Apr 2013 08:51:23 -0400
Subject: [PATCH] initial version of complete reference architecture template

---
 cloudformation_templates/edx-reference-architecture.json | 3184 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 3184 insertions(+)
 create mode 100644 cloudformation_templates/edx-reference-architecture.json

diff --git a/cloudformation_templates/edx-reference-architecture.json b/cloudformation_templates/edx-reference-architecture.json
new file mode 100644
index 0000000..fdbc287
--- /dev/null
+++ b/cloudformation_templates/edx-reference-architecture.json
@@ -0,0 +1,3184 @@
+{
+  "AWSTemplateFormatVersion":"2010-09-09",
+  "Description":"A sample template to bring up a minimal, but complete version of the edX stack.  **WARNING** This template creates one or more Amazon EC2 instances. You will be billed for the AWS resources used if you create a stack from this template.",
+  "Parameters":{
+    "EnvironmentTag":{
+      "Type":"String",
+      "Description":"A tag value applied to the hosts in the VPC indicating which environment to use during the configuration phase, e.g., development, stage, production"
+    },
+    "KeyName":{
+      "Type":"String",
+      "Description":"Name of an existing EC2 KeyPair to enable SSH access to the web server"
+    },
+    "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."
+    },
+    "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."
+    },
+    "WebServerPort":{
+      "Description":"The TCP port for the Web Server",
+      "Type":"Number",
+      "Default":"8888"
+    },
+    "BastionInstanceType":{
+      "Description":"Bastion Host 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."
+    },
+    "NATInstanceType":{
+      "Description":"NET Device 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."
+    },
+    "EdxappDesiredCapacity":{
+      "Description":"The Auto-scaling group desired capacity for the edxapp hosts",
+      "Type":"Number",
+      "Default":"2"
+    },
+    "XqueueDesiredCapacity":{
+      "Description":"The Auto-scaling group desired capacity for the xqueue hosts",
+      "Type":"Number",
+      "Default":"2"
+    },
+    "XServerDesiredCapacity":{
+      "Description":"The Auto-scaling group desired capacity for the xserver hosts",
+      "Type":"Number",
+      "Default":"2"
+    },
+    "RabbitMQDesiredCapacity":{
+      "Description":"The Auto-scaling group desired capacity for the RabbitMQ hosts",
+      "Type":"Number",
+      "Default":"2"
+    },
+    "CacheNodeType":{
+      "Default":"cache.m1.small",
+      "Description":"The compute and memory capacity of the nodes in the Cache Cluster",
+      "Type":"String",
+      "AllowedValues":[
+        "cache.t1.micro",
+        "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":"2",
+      "Description":"The number of Cache Nodes the Cache Cluster should have",
+      "Type":"Number",
+      "MinValue":"2",
+      "MaxValue":"10",
+      "ConstraintDescription":"must be between 2 and 10."
+    },
+    "DBName":{
+      "Default":"wwc",
+      "Description":"The 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":"edxapp",
+      "NoEcho":"true",
+      "Description":"The 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":"changeme",
+      "NoEcho":"true",
+      "Description":"The database admin account password",
+      "Type":"String",
+      "MinLength":"8",
+      "MaxLength":"41",
+      "ConstraintDescription":"must contain only alphanumeric characters."
+    },
+    "DBClass":{
+      "Default":"db.m1.small",
+      "Description":"Database instance class",
+      "Type":"String",
+      "AllowedValues":[
+        "db.m1.micro",
+        "db.m1.small",
+        "db.m1.large",
+        "db.m1.xlarge",
+        "db.m2.xlarge",
+        "db.m2.2xlarge",
+        "db.m2.4xlarge"
+      ],
+      "ConstraintDescription":"must select a valid database instance type."
+    },
+    "DBAllocatedStorage":{
+      "Default":"5",
+      "Description":"The size of the database (Gb)",
+      "Type":"Number",
+      "MinValue":"5",
+      "MaxValue":"3072",
+      "ConstraintDescription":"must be between 5 and 3072Gb."
+    }
+  },
+  "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"
+      }
+    },
+    "AWSRegionArch2AMI":{
+      "us-east-1":{
+        "32":"ami-def89fb7",
+        "64":"ami-d0f89fb9"
+      },
+      "us-west-1":{
+        "32":"ami-fc002cb9",
+        "64":"ami-ce7b6fba"
+      },
+      "us-west-2":{
+        "32":"ami-0ef96e3e",
+        "64":"ami-70f96e40"
+      },
+      "eu-west-1":{
+        "32":"ami-c27b6fb6",
+        "64":"ami-ce7b6fba"
+      },
+      "sa-east-1":{
+        "32":"ami-a1da00bc",
+        "64":"ami-a3da00be"
+      },
+      "ap-southeast-1":{
+        "32":"ami-66084734",
+        "64":"ami-64084736"
+      },
+      "ap-southeast-2":{
+        "32":"ami-06ea7a3c",
+        "64":"ami-04ea7a3e"
+      },
+      "ap-northeast-1":{
+        "32":"ami-fc6ceefd",
+        "64":"ami-fe6ceeff"
+      }
+    },
+    "AWSNATAMI":{
+      "us-east-1":{
+        "AMI":"ami-c6699baf"
+      },
+      "us-west-2":{
+        "AMI":"ami-52ff7262"
+      },
+      "us-west-1":{
+        "AMI":"ami-3bcc9e7e"
+      },
+      "eu-west-1":{
+        "AMI":"ami-0b5b6c7f"
+      },
+      "ap-southeast-1":{
+        "AMI":"ami-02eb9350"
+      },
+      "ap-southeast-2":{
+        "AMI":"ami-ab990e91"
+      },
+      "ap-northeast-1":{
+        "AMI":"ami-14d86d15"
+      },
+      "sa-east-1":{
+        "AMI":"ami-0439e619"
+      }
+    },
+    "SubnetConfig":{
+      "VPC":{
+        "CIDR":"10.0.0.0/16"
+      },
+      "Public01":{
+        "CIDR":"10.0.0.0/24"
+      },
+      "Public02":{
+        "CIDR":"10.0.1.0/24"
+      },
+      "Edxapp01":{
+        "CIDR":"10.0.10.0/24"
+      },
+      "Edxapp02":{
+        "CIDR":"10.0.11.0/24"
+      },
+      "XServerJail01":{
+        "CIDR":"10.0.20.0/24"
+      },
+      "XServerJail02":{
+        "CIDR":"10.0.21.0/24"
+      },
+      "Xqueue01":{
+        "CIDR":"10.0.30.0/24"
+      },
+      "Xqueue02":{
+        "CIDR":"10.0.31.0/24"
+      },
+      "Rabbit01":{
+        "CIDR":"10.0.40.0/24"
+      },
+      "Rabbit02":{
+        "CIDR":"10.0.41.0/24"
+      },
+      "Data01":{
+        "CIDR":"10.0.50.0/24"
+      },
+      "Data02":{
+        "CIDR":"10.0.51.0/24"
+      },
+      "Cache01":{
+        "CIDR":"10.0.60.0/24"
+      },
+      "Cache02":{
+        "CIDR":"10.0.61.0/24"
+      }
+    }
+  },
+  "Resources":{
+    "EdxVPC":{
+      "Type":"AWS::EC2::VPC",
+      "Properties":{
+        "CidrBlock":"10.0.0.0/16",
+        "InstanceTenancy":"default"
+      }
+    },
+    "PublicSubnet01":{
+      "Type":"AWS::EC2::Subnet",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "CidrBlock":{
+          "Fn::FindInMap":[
+            "SubnetConfig",
+            "Public01",
+            "CIDR"
+          ]
+        },
+        "AvailabilityZone":"us-east-1b"
+      }
+    },
+    "PublicSubnet02":{
+      "Type":"AWS::EC2::Subnet",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "CidrBlock":{
+          "Fn::FindInMap":[
+            "SubnetConfig",
+            "Public02",
+            "CIDR"
+          ]
+        },
+        "AvailabilityZone":"us-east-1c"
+      }
+    },
+    "EdxappSubnet01":{
+      "Type":"AWS::EC2::Subnet",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "CidrBlock":{
+          "Fn::FindInMap":[
+            "SubnetConfig",
+            "Edxapp01",
+            "CIDR"
+          ]
+        },
+        "AvailabilityZone":"us-east-1b",
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":"edxapp"
+          },
+          {
+            "Key":"Network",
+            "Value":"Private"
+          }
+        ]
+      }
+    },
+    "EdxappSubnet02":{
+      "Type":"AWS::EC2::Subnet",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "CidrBlock":{
+          "Fn::FindInMap":[
+            "SubnetConfig",
+            "Edxapp02",
+            "CIDR"
+          ]
+        },
+        "AvailabilityZone":"us-east-1c",
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":"edxapp"
+          },
+          {
+            "Key":"Network",
+            "Value":"Private"
+          }
+        ]
+      }
+    },
+    "XqueueSubnet01":{
+      "Type":"AWS::EC2::Subnet",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "CidrBlock":{
+          "Fn::FindInMap":[
+            "SubnetConfig",
+            "Xqueue01",
+            "CIDR"
+          ]
+        },
+        "AvailabilityZone":"us-east-1b",
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":"xqueue"
+          },
+          {
+            "Key":"Network",
+            "Value":"Private"
+          }
+        ]
+      }
+    },
+    "XqueueSubnet02":{
+      "Type":"AWS::EC2::Subnet",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "CidrBlock":{
+          "Fn::FindInMap":[
+            "SubnetConfig",
+            "Xqueue02",
+            "CIDR"
+          ]
+        },
+        "AvailabilityZone":"us-east-1c",
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":"xqueue"
+          },
+          {
+            "Key":"Network",
+            "Value":"Private"
+          }
+        ]
+      }
+    },
+    "RabbitSubnet01":{
+      "Type":"AWS::EC2::Subnet",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "CidrBlock":{
+          "Fn::FindInMap":[
+            "SubnetConfig",
+            "Rabbit01",
+            "CIDR"
+          ]
+        },
+        "AvailabilityZone":"us-east-1b",
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":"RabbitMQ"
+          },
+          {
+            "Key":"Network",
+            "Value":"Private"
+          }
+        ]
+      }
+    },
+    "RabbitSubnet02":{
+      "Type":"AWS::EC2::Subnet",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "CidrBlock":{
+          "Fn::FindInMap":[
+            "SubnetConfig",
+            "Rabbit02",
+            "CIDR"
+          ]
+        },
+        "AvailabilityZone":"us-east-1c",
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":"RabbitMQ"
+          },
+          {
+            "Key":"Network",
+            "Value":"Private"
+          }
+        ]
+      }
+    },
+    "XServerSubnet01":{
+      "Type":"AWS::EC2::Subnet",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "CidrBlock":{
+          "Fn::FindInMap":[
+            "SubnetConfig",
+            "XServerJail01",
+            "CIDR"
+          ]
+        },
+        "AvailabilityZone":"us-east-1b",
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":"xserver"
+          },
+          {
+            "Key":"Network",
+            "Value":"Private"
+          }
+        ]
+      }
+    },
+    "XServerSubnet02":{
+      "Type":"AWS::EC2::Subnet",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "CidrBlock":{
+          "Fn::FindInMap":[
+            "SubnetConfig",
+            "XServerJail02",
+            "CIDR"
+          ]
+        },
+        "AvailabilityZone":"us-east-1c",
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":"xserver"
+          },
+          {
+            "Key":"Network",
+            "Value":"Private"
+          }
+        ]
+      }
+    },
+    "Data01":{
+      "Type":"AWS::EC2::Subnet",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "CidrBlock":{
+          "Fn::FindInMap":[
+            "SubnetConfig",
+            "Data01",
+            "CIDR"
+          ]
+        },
+        "AvailabilityZone":"us-east-1b",
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":"RDS"
+          },
+          {
+            "Key":"Network",
+            "Value":"Data"
+          }
+        ]
+      }
+    },
+    "Data02":{
+      "Type":"AWS::EC2::Subnet",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "CidrBlock":{
+          "Fn::FindInMap":[
+            "SubnetConfig",
+            "Data02",
+            "CIDR"
+          ]
+        },
+        "AvailabilityZone":"us-east-1c",
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":"RDS"
+          },
+          {
+            "Key":"Network",
+            "Value":"Data"
+          }
+        ]
+      }
+    },
+    "Cache01":{
+      "Type":"AWS::EC2::Subnet",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "CidrBlock":{
+          "Fn::FindInMap":[
+            "SubnetConfig",
+            "Cache01",
+            "CIDR"
+          ]
+        },
+        "AvailabilityZone":"us-east-1b",
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":"Elasticache"
+          },
+          {
+            "Key":"Network",
+            "Value":"Cache"
+          }
+        ]
+      }
+    },
+    "Cache02":{
+      "Type":"AWS::EC2::Subnet",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "CidrBlock":{
+          "Fn::FindInMap":[
+            "SubnetConfig",
+            "Cache02",
+            "CIDR"
+          ]
+        },
+        "AvailabilityZone":"us-east-1c",
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":"Elasticache"
+          },
+          {
+            "Key":"Network",
+            "Value":"Cache"
+          }
+        ]
+      }
+    },
+    "InternetGateway":{
+      "Type":"AWS::EC2::InternetGateway",
+      "Properties":{
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":{
+              "Ref":"AWS::StackId"
+            }
+          },
+          {
+            "Key":"Network",
+            "Value":"Public"
+          }
+        ]
+      }
+    },
+    "GatewayToInternet":{
+      "Type":"AWS::EC2::VPCGatewayAttachment",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "InternetGatewayId":{
+          "Ref":"InternetGateway"
+        }
+      }
+    },
+    "PublicRouteTable":{
+      "Type":"AWS::EC2::RouteTable",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":{
+              "Ref":"AWS::StackId"
+            }
+          },
+          {
+            "Key":"Network",
+            "Value":"Public"
+          }
+        ]
+      }
+    },
+    "PublicRoute":{
+      "Type":"AWS::EC2::Route",
+      "Properties":{
+        "RouteTableId":{
+          "Ref":"PublicRouteTable"
+        },
+        "DestinationCidrBlock":"0.0.0.0/0",
+        "GatewayId":{
+          "Ref":"InternetGateway"
+        }
+      }
+    },
+    "PublicSubnetRouteTableAssociation01":{
+      "Type":"AWS::EC2::SubnetRouteTableAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"PublicSubnet01"
+        },
+        "RouteTableId":{
+          "Ref":"PublicRouteTable"
+        }
+      }
+    },
+    "PublicSubnetRouteTableAssociation02":{
+      "Type":"AWS::EC2::SubnetRouteTableAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"PublicSubnet02"
+        },
+        "RouteTableId":{
+          "Ref":"PublicRouteTable"
+        }
+      }
+    },
+    "PublicNetworkAcl":{
+      "Type":"AWS::EC2::NetworkAcl",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":{
+              "Ref":"AWS::StackId"
+            }
+          },
+          {
+            "Key":"Network",
+            "Value":"Public"
+          }
+        ]
+      }
+    },
+    "InboundHTTPPublicNetworkAclEntry":{
+      "Type":"AWS::EC2::NetworkAclEntry",
+      "Properties":{
+        "NetworkAclId":{
+          "Ref":"PublicNetworkAcl"
+        },
+        "RuleNumber":"100",
+        "Protocol":"6",
+        "RuleAction":"allow",
+        "Egress":"false",
+        "CidrBlock":"0.0.0.0/0",
+        "PortRange":{
+          "From":"80",
+          "To":"80"
+        }
+      }
+    },
+    "InboundHTTPSPublicNetworkAclEntry":{
+      "Type":"AWS::EC2::NetworkAclEntry",
+      "Properties":{
+        "NetworkAclId":{
+          "Ref":"PublicNetworkAcl"
+        },
+        "RuleNumber":"101",
+        "Protocol":"6",
+        "RuleAction":"allow",
+        "Egress":"false",
+        "CidrBlock":"0.0.0.0/0",
+        "PortRange":{
+          "From":"443",
+          "To":"443"
+        }
+      }
+    },
+    "InboundSSHPublicNetworkAclEntry":{
+      "Type":"AWS::EC2::NetworkAclEntry",
+      "Properties":{
+        "NetworkAclId":{
+          "Ref":"PublicNetworkAcl"
+        },
+        "RuleNumber":"102",
+        "Protocol":"6",
+        "RuleAction":"allow",
+        "Egress":"false",
+        "CidrBlock":{
+          "Ref":"SSHLocation"
+        },
+        "PortRange":{
+          "From":"22",
+          "To":"22"
+        }
+      }
+    },
+    "InboundEmphemeralPublicNetworkAclEntry":{
+      "Type":"AWS::EC2::NetworkAclEntry",
+      "Properties":{
+        "NetworkAclId":{
+          "Ref":"PublicNetworkAcl"
+        },
+        "RuleNumber":"103",
+        "Protocol":"6",
+        "RuleAction":"allow",
+        "Egress":"false",
+        "CidrBlock":"0.0.0.0/0",
+        "PortRange":{
+          "From":"1024",
+          "To":"65535"
+        }
+      }
+    },
+    "OutboundPublicNetworkAclEntry":{
+      "Type":"AWS::EC2::NetworkAclEntry",
+      "Properties":{
+        "NetworkAclId":{
+          "Ref":"PublicNetworkAcl"
+        },
+        "RuleNumber":"100",
+        "Protocol":"6",
+        "RuleAction":"allow",
+        "Egress":"true",
+        "CidrBlock":"0.0.0.0/0",
+        "PortRange":{
+          "From":"0",
+          "To":"65535"
+        }
+      }
+    },
+    "PublicSubnetNetworkAclAssociation01":{
+      "Type":"AWS::EC2::SubnetNetworkAclAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"PublicSubnet01"
+        },
+        "NetworkAclId":{
+          "Ref":"PublicNetworkAcl"
+        }
+      }
+    },
+    "PublicSubnetNetworkAclAssociation02":{
+      "Type":"AWS::EC2::SubnetNetworkAclAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"PublicSubnet02"
+        },
+        "NetworkAclId":{
+          "Ref":"PublicNetworkAcl"
+        }
+      }
+    },
+    "PrivateRouteTable":{
+      "Type":"AWS::EC2::RouteTable",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":{
+              "Ref":"AWS::StackId"
+            }
+          },
+          {
+            "Key":"Network",
+            "Value":"Private"
+          }
+        ]
+      }
+    },
+    "PrivateRoute":{
+      "Type":"AWS::EC2::Route",
+      "Properties":{
+        "RouteTableId":{
+          "Ref":"PrivateRouteTable"
+        },
+        "DestinationCidrBlock":"0.0.0.0/0",
+        "InstanceId":{
+          "Ref":"NATDevice"
+        }
+      }
+    },
+    "PrivateSubnetRouteTableAssociationEdxapp01":{
+      "Type":"AWS::EC2::SubnetRouteTableAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"EdxappSubnet01"
+        },
+        "RouteTableId":{
+          "Ref":"PrivateRouteTable"
+        }
+      }
+    },
+    "PrivateSubnetRouteTableAssociationEdxapp02":{
+      "Type":"AWS::EC2::SubnetRouteTableAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"EdxappSubnet02"
+        },
+        "RouteTableId":{
+          "Ref":"PrivateRouteTable"
+        }
+      }
+    },
+    "PrivateSubnetRouteTableAssociationXqueue01":{
+      "Type":"AWS::EC2::SubnetRouteTableAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"XqueueSubnet01"
+        },
+        "RouteTableId":{
+          "Ref":"PrivateRouteTable"
+        }
+      }
+    },
+    "PrivateSubnetRouteTableAssociationXqueue02":{
+      "Type":"AWS::EC2::SubnetRouteTableAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"XqueueSubnet02"
+        },
+        "RouteTableId":{
+          "Ref":"PrivateRouteTable"
+        }
+      }
+    },
+    "PrivateSubnetRouteTableAssociationRabbit01":{
+      "Type":"AWS::EC2::SubnetRouteTableAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"RabbitSubnet01"
+        },
+        "RouteTableId":{
+          "Ref":"PrivateRouteTable"
+        }
+      }
+    },
+    "PrivateSubnetRouteTableAssociationRabbit02":{
+      "Type":"AWS::EC2::SubnetRouteTableAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"RabbitSubnet02"
+        },
+        "RouteTableId":{
+          "Ref":"PrivateRouteTable"
+        }
+      }
+    },
+    "PrivateSubnetRouteTableAssociationXServer01":{
+      "Type":"AWS::EC2::SubnetRouteTableAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"XServerSubnet01"
+        },
+        "RouteTableId":{
+          "Ref":"PrivateRouteTable"
+        }
+      }
+    },
+    "PrivateSubnetRouteTableAssociationXServer02":{
+      "Type":"AWS::EC2::SubnetRouteTableAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"XServerSubnet02"
+        },
+        "RouteTableId":{
+          "Ref":"PrivateRouteTable"
+        }
+      }
+    },
+    "PrivateSubnetRouteTableAssociationData01":{
+      "Type":"AWS::EC2::SubnetRouteTableAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"Data01"
+        },
+        "RouteTableId":{
+          "Ref":"PrivateRouteTable"
+        }
+      }
+    },
+    "PrivateSubnetRouteTableAssociationData02":{
+      "Type":"AWS::EC2::SubnetRouteTableAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"Data02"
+        },
+        "RouteTableId":{
+          "Ref":"PrivateRouteTable"
+        }
+      }
+    },
+    "PrivateSubnetRouteTableAssociationCache01":{
+      "Type":"AWS::EC2::SubnetRouteTableAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"Cache01"
+        },
+        "RouteTableId":{
+          "Ref":"PrivateRouteTable"
+        }
+      }
+    },
+    "PrivateSubnetRouteTableAssociationCache02":{
+      "Type":"AWS::EC2::SubnetRouteTableAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"Cache02"
+        },
+        "RouteTableId":{
+          "Ref":"PrivateRouteTable"
+        }
+      }
+    },
+    "PrivateNetworkAcl":{
+      "Type":"AWS::EC2::NetworkAcl",
+      "Properties":{
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "Tags":[
+          {
+            "Key":"Application",
+            "Value":{
+              "Ref":"AWS::StackId"
+            }
+          },
+          {
+            "Key":"Network",
+            "Value":"Private"
+          }
+        ]
+      }
+    },
+    "InboundPrivateNetworkAclEntry":{
+      "Type":"AWS::EC2::NetworkAclEntry",
+      "Properties":{
+        "NetworkAclId":{
+          "Ref":"PrivateNetworkAcl"
+        },
+        "RuleNumber":"100",
+        "Protocol":"6",
+        "RuleAction":"allow",
+        "Egress":"false",
+        "CidrBlock":"0.0.0.0/0",
+        "PortRange":{
+          "From":"0",
+          "To":"65535"
+        }
+      }
+    },
+    "OutBoundPrivateNetworkAclEntry":{
+      "Type":"AWS::EC2::NetworkAclEntry",
+      "Properties":{
+        "NetworkAclId":{
+          "Ref":"PrivateNetworkAcl"
+        },
+        "RuleNumber":"100",
+        "Protocol":"6",
+        "RuleAction":"allow",
+        "Egress":"true",
+        "CidrBlock":"0.0.0.0/0",
+        "PortRange":{
+          "From":"0",
+          "To":"65535"
+        }
+      }
+    },
+    "PrivateSubnetNetworkAclAssociationEdxapp01":{
+      "Type":"AWS::EC2::SubnetNetworkAclAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"EdxappSubnet01"
+        },
+        "NetworkAclId":{
+          "Ref":"PrivateNetworkAcl"
+        }
+      }
+    },
+    "PrivateSubnetNetworkAclAssociationEdxapp02":{
+      "Type":"AWS::EC2::SubnetNetworkAclAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"EdxappSubnet02"
+        },
+        "NetworkAclId":{
+          "Ref":"PrivateNetworkAcl"
+        }
+      }
+    },
+    "PrivateSubnetNetworkAclAssociationXqueue01":{
+      "Type":"AWS::EC2::SubnetNetworkAclAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"XqueueSubnet01"
+        },
+        "NetworkAclId":{
+          "Ref":"PrivateNetworkAcl"
+        }
+      }
+    },
+    "PrivateSubnetNetworkAclAssociationXqueue02":{
+      "Type":"AWS::EC2::SubnetNetworkAclAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"XqueueSubnet02"
+        },
+        "NetworkAclId":{
+          "Ref":"PrivateNetworkAcl"
+        }
+      }
+    },
+    "PrivateSubnetNetworkAclAssociationRabbit01":{
+      "Type":"AWS::EC2::SubnetNetworkAclAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"RabbitSubnet01"
+        },
+        "NetworkAclId":{
+          "Ref":"PrivateNetworkAcl"
+        }
+      }
+    },
+    "PrivateSubnetNetworkAclAssociationRabbit02":{
+      "Type":"AWS::EC2::SubnetNetworkAclAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"RabbitSubnet02"
+        },
+        "NetworkAclId":{
+          "Ref":"PrivateNetworkAcl"
+        }
+      }
+    },
+    "PrivateSubnetNetworkAclAssociationXServer01":{
+      "Type":"AWS::EC2::SubnetNetworkAclAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"XServerSubnet01"
+        },
+        "NetworkAclId":{
+          "Ref":"PrivateNetworkAcl"
+        }
+      }
+    },
+    "PrivateSubnetNetworkAclAssociationXServer02":{
+      "Type":"AWS::EC2::SubnetNetworkAclAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"XServerSubnet02"
+        },
+        "NetworkAclId":{
+          "Ref":"PrivateNetworkAcl"
+        }
+      }
+    },
+    "PrivateSubnetNetworkAclAssociationData01":{
+      "Type":"AWS::EC2::SubnetNetworkAclAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"Data01"
+        },
+        "NetworkAclId":{
+          "Ref":"PrivateNetworkAcl"
+        }
+      }
+    },
+    "PrivateSubnetNetworkAclAssociationData02":{
+      "Type":"AWS::EC2::SubnetNetworkAclAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"Data02"
+        },
+        "NetworkAclId":{
+          "Ref":"PrivateNetworkAcl"
+        }
+      }
+    },
+    "PrivateSubnetNetworkAclAssociationCache01":{
+      "Type":"AWS::EC2::SubnetNetworkAclAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"Cache01"
+        },
+        "NetworkAclId":{
+          "Ref":"PrivateNetworkAcl"
+        }
+      }
+    },
+    "PrivateSubnetNetworkAclAssociationCache02":{
+      "Type":"AWS::EC2::SubnetNetworkAclAssociation",
+      "Properties":{
+        "SubnetId":{
+          "Ref":"Cache02"
+        },
+        "NetworkAclId":{
+          "Ref":"PrivateNetworkAcl"
+        }
+      }
+    },
+    "NATIPAddress":{
+      "Type":"AWS::EC2::EIP",
+      "Properties":{
+        "Domain":"vpc",
+        "InstanceId":{
+          "Ref":"NATDevice"
+        }
+      }
+    },
+    "NATDevice":{
+      "Type":"AWS::EC2::Instance",
+      "Properties":{
+        "InstanceType":{
+          "Ref":"NATInstanceType"
+        },
+        "KeyName":{
+          "Ref":"KeyName"
+        },
+        "SubnetId":{
+          "Ref":"PublicSubnet01"
+        },
+        "SourceDestCheck":"false",
+        "ImageId":{
+          "Fn::FindInMap":[
+            "AWSNATAMI",
+            {
+              "Ref":"AWS::Region"
+            },
+            "AMI"
+          ]
+        },
+        "SecurityGroupIds":[
+          {
+            "Ref":"NATSecurityGroup"
+          }
+        ]
+      }
+    },
+    "NATSecurityGroup":{
+      "Type":"AWS::EC2::SecurityGroup",
+      "Properties":{
+        "GroupDescription":"Enable internal access to the NAT device",
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "SecurityGroupIngress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"80",
+            "ToPort":"80",
+            "CidrIp":"0.0.0.0/0"
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"443",
+            "ToPort":"443",
+            "CidrIp":"0.0.0.0/0"
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"22",
+            "ToPort":"22",
+            "CidrIp":{
+              "Ref":"SSHLocation"
+            }
+          }
+        ],
+        "SecurityGroupEgress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"80",
+            "ToPort":"80",
+            "CidrIp":"0.0.0.0/0"
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"443",
+            "ToPort":"443",
+            "CidrIp":"0.0.0.0/0"
+          }
+        ]
+      }
+    },
+    "BastionIPAddress":{
+      "Type":"AWS::EC2::EIP",
+      "Properties":{
+        "Domain":"vpc",
+        "InstanceId":{
+          "Ref":"BastionHost"
+        }
+      }
+    },
+    "BastionHost":{
+      "Type":"AWS::EC2::Instance",
+      "Properties":{
+        "InstanceType":{
+          "Ref":"BastionInstanceType"
+        },
+        "KeyName":{
+          "Ref":"KeyName"
+        },
+        "SubnetId":{
+          "Ref":"PublicSubnet01"
+        },
+        "ImageId":{
+          "Fn::FindInMap":[
+            "AWSRegionArch2AMI",
+            {
+              "Ref":"AWS::Region"
+            },
+            {
+              "Fn::FindInMap":[
+                "AWSInstanceType2Arch",
+                {
+                  "Ref":"BastionInstanceType"
+                },
+                "Arch"
+              ]
+            }
+          ]
+        },
+        "SecurityGroupIds":[
+          {
+            "Ref":"BastionSecurityGroup"
+          }
+        ]
+      }
+    },
+    "BastionSecurityGroup":{
+      "Type":"AWS::EC2::SecurityGroup",
+      "Properties":{
+        "GroupDescription":"Enable access to the Bastion host",
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "SecurityGroupIngress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"22",
+            "ToPort":"22",
+            "CidrIp":{
+              "Ref":"SSHLocation"
+            }
+          }
+        ],
+        "SecurityGroupEgress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"22",
+            "ToPort":"22",
+            "CidrIp":{
+              "Fn::FindInMap":[
+                "SubnetConfig",
+                "Edxapp01",
+                "CIDR"
+              ]
+            }
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"22",
+            "ToPort":"22",
+            "CidrIp":{
+              "Fn::FindInMap":[
+                "SubnetConfig",
+                "Edxapp02",
+                "CIDR"
+              ]
+            }
+          }
+        ]
+      }
+    },
+    "EdxServerUser":{
+      "Type":"AWS::IAM::User",
+      "Properties":{
+        "Path":"/",
+        "Policies":[
+          {
+            "PolicyName":"root",
+            "PolicyDocument":{
+              "Statement":[
+                {
+                  "Effect":"Allow",
+                  "Action":[
+                    "cloudformation:DescribeStackResource",
+                    "s3:Put"
+                  ],
+                  "Resource":"*"
+                }
+              ]
+            }
+          }
+        ]
+      }
+    },
+    "HostKeys":{
+      "Type":"AWS::IAM::AccessKey",
+      "Properties":{
+        "UserName":{
+          "Ref":"EdxServerUser"
+        }
+      }
+    },
+    "AdminSecurityGroup":{
+      "Type":"AWS::EC2::SecurityGroup",
+      "Properties":{
+        "GroupDescription":"Admin Security Group",
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "SecurityGroupIngress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"22",
+            "ToPort":"22",
+            "CidrIp":{
+              "Ref":"SSHLocation"
+            }
+          }
+        ]
+      }
+    },
+    "EdxappServer":{
+      "Type":"AWS::AutoScaling::LaunchConfiguration",
+      "Metadata":{
+        "AWS::CloudFormation::Init":{
+          "config":{
+            "files":{
+              "/home/ubuntu/.s3cfg":{
+                "content":{
+                  "Fn::Join":[
+                    "",
+                    [
+                      "[default]\n",
+                      "access_key = ",
+                      {
+                        "Ref":"HostKeys"
+                      },
+                      "\n",
+                      "secret_key = ",
+                      {
+                        "Fn::GetAtt":[
+                          "HostKeys",
+                          "SecretAccessKey"
+                        ]
+                      },
+                      "\n",
+                      "use_https = True\n"
+                    ]
+                  ]
+                },
+                "mode":"000644",
+                "owner":"ubuntu",
+                "group":"ubuntu"
+              }
+            }
+          }
+        }
+      },
+      "Properties":{
+        "SecurityGroups":[
+          {
+            "Ref":"EdxappServerSecurityGroup"
+          }
+        ],
+        "ImageId":{
+          "Fn::FindInMap":[
+            "AWSRegionArch2AMI",
+            {
+              "Ref":"AWS::Region"
+            },
+            {
+              "Fn::FindInMap":[
+                "AWSInstanceType2Arch",
+                {
+                  "Ref":"InstanceType"
+                },
+                "Arch"
+              ]
+            }
+          ]
+        },
+        "UserData":{
+          "Fn::Base64":{
+            "Fn::Join":[
+              "",
+              [
+                "#!/bin/bash\n",
+                "exec >> /home/ubuntu/cflog.log\n",
+                "exec 2>> /home/ubuntu/cflog.log\n",
+                "function error_exit\n",
+                "{\n",
+                "  cfn-signal -e 1 -r \"$1\" '",
+                {
+                  "Ref":"EdxServerWaitHandle"
+                },
+                "'\n",
+                "  exit 1\n",
+                "}\n",
+                "apt-get -y update\n",
+                "apt-get -y install python-setuptools\n",
+                "echo \"Python Tools installed\" - `date` >> /home/ubuntu/cflog.txt\n",
+                "easy_install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
+                "echo \"Cloudformation Boostrap installed \" - `date` >> /home/ubuntu/cflog.txt\n",
+                "cfn-init --region ",
+                {
+                  "Ref":"AWS::Region"
+                },
+                "    -s ",
+                {
+                  "Ref":"AWS::StackName"
+                },
+                " -r EdxappServer ",
+                "         --access-key ",
+                {
+                  "Ref":"HostKeys"
+                },
+                "         --secret-key ",
+                {
+                  "Fn::GetAtt":[
+                    "HostKeys",
+                    "SecretAccessKey"
+                  ]
+                },
+                " || error_exit 'Failed to run cfn-init'\n",
+                "echo \"cfn-init run \" - `date` >> /home/ubuntu/cflog.txt\n",
+                "# If all went well, signal success\n",
+                "cfn-signal -e $? -r 'Edx Server configuration' '",
+                {
+                  "Ref":"EdxServerWaitHandle"
+                },
+                "'\n"
+              ]
+            ]
+          }
+        },
+        "KeyName":{
+          "Ref":"KeyName"
+        },
+        "InstanceType":{
+          "Ref":"InstanceType"
+        },
+        "BlockDeviceMappings":[
+          {
+            "DeviceName":"/dev/xvdb",
+            "Ebs":{
+              "VolumeSize":"50"
+            }
+          },
+          {
+            "DeviceName":"/dev/xvdc",
+            "Ebs":{
+              "VolumeSize":"50"
+            }
+          }
+        ]
+      }
+    },
+    "EdxappServerASGroup":{
+      "Type":"AWS::AutoScaling::AutoScalingGroup",
+      "Properties":{
+        "AvailabilityZones":[
+          {
+            "Fn::GetAtt":[
+              "EdxappSubnet01",
+              "AvailabilityZone"
+            ]
+          },
+          {
+            "Fn::GetAtt":[
+              "EdxappSubnet02",
+              "AvailabilityZone"
+            ]
+          }
+        ],
+        "VPCZoneIdentifier":[
+          {
+            "Ref":"EdxappSubnet01"
+          },
+          {
+            "Ref":"EdxappSubnet02"
+          }
+        ],
+        "Tags":[
+          {
+            "Key":"group",
+            "Value":"edxapp",
+            "PropagateAtLaunch":true
+          },
+          {
+            "Key":"environment",
+            "Value":{
+              "Ref":"EnvironmentTag"
+            },
+            "PropagateAtLaunch":true
+          }
+        ],
+        "LaunchConfigurationName":{
+          "Ref":"EdxappServer"
+        },
+        "MinSize":"2",
+        "MaxSize":"2",
+        "DesiredCapacity":{
+          "Ref":"EdxappDesiredCapacity"
+        },
+        "LoadBalancerNames":[
+          {
+            "Ref":"EdxappELB"
+          }
+        ]
+      }
+    },
+    "EdxappServerScaleUpPolicy":{
+      "Type":"AWS::AutoScaling::ScalingPolicy",
+      "Properties":{
+        "AdjustmentType":"ChangeInCapacity",
+        "AutoScalingGroupName":{
+          "Ref":"EdxappServerASGroup"
+        },
+        "Cooldown":"60",
+        "ScalingAdjustment":"1"
+      }
+    },
+    "EdxappServerScaleDownPolicy":{
+      "Type":"AWS::AutoScaling::ScalingPolicy",
+      "Properties":{
+        "AdjustmentType":"ChangeInCapacity",
+        "AutoScalingGroupName":{
+          "Ref":"EdxappServerASGroup"
+        },
+        "Cooldown":"60",
+        "ScalingAdjustment":"-1"
+      }
+    },
+    "EdxappCPUAlarmHigh":{
+      "Type":"AWS::CloudWatch::Alarm",
+      "Properties":{
+        "AlarmDescription":"Scale-up if CPU > 90% for 10 minutes",
+        "MetricName":"CPUUtilization",
+        "Namespace":"AWS/EC2",
+        "Statistic":"Average",
+        "Period":"300",
+        "EvaluationPeriods":"2",
+        "Threshold":"90",
+        "AlarmActions":[
+          {
+            "Ref":"EdxappServerScaleUpPolicy"
+          }
+        ],
+        "Dimensions":[
+          {
+            "Name":"AutoScalingGroupName",
+            "Value":{
+              "Ref":"EdxappServerASGroup"
+            }
+          }
+        ],
+        "ComparisonOperator":"GreaterThanThreshold"
+      }
+    },
+    "EdxappCPUAlarmLow":{
+      "Type":"AWS::CloudWatch::Alarm",
+      "Properties":{
+        "AlarmDescription":"Scale-down if CPU < 70% for 10 minutes",
+        "MetricName":"CPUUtilization",
+        "Namespace":"AWS/EC2",
+        "Statistic":"Average",
+        "Period":"300",
+        "EvaluationPeriods":"2",
+        "Threshold":"70",
+        "AlarmActions":[
+          {
+            "Ref":"EdxappServerScaleDownPolicy"
+          }
+        ],
+        "Dimensions":[
+          {
+            "Name":"AutoScalingGroupName",
+            "Value":{
+              "Ref":"EdxappServerASGroup"
+            }
+          }
+        ],
+        "ComparisonOperator":"LessThanThreshold"
+      }
+    },
+    "EdxappELB":{
+      "Type":"AWS::ElasticLoadBalancing::LoadBalancer",
+      "Properties":{
+        "SecurityGroups":[
+          {
+            "Ref":"EdxappELBSecurityGroup"
+          }
+        ],
+        "Listeners":[
+          {
+            "LoadBalancerPort":"80",
+            "InstancePort":{
+              "Ref":"WebServerPort"
+            },
+            "Protocol":"HTTP"
+          }
+        ],
+        "HealthCheck":{
+          "Target":"TCP:22",
+          "HealthyThreshold":"3",
+          "UnhealthyThreshold":"5",
+          "Interval":"30",
+          "Timeout":"5"
+        },
+        "Subnets":[
+          {
+            "Ref":"PublicSubnet01"
+          }
+        ]
+      }
+    },
+    "EdxappELBSecurityGroup":{
+      "Type":"AWS::EC2::SecurityGroup",
+      "Properties":{
+        "GroupDescription":"Enable HTTP access on port 80",
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "SecurityGroupIngress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"80",
+            "ToPort":"80",
+            "CidrIp":"0.0.0.0/0"
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"443",
+            "ToPort":"443",
+            "CidrIp":"0.0.0.0/0"
+          }
+        ],
+        "SecurityGroupEgress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"80",
+            "ToPort":"80",
+            "CidrIp":"0.0.0.0/0"
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"443",
+            "ToPort":"443",
+            "CidrIp":"0.0.0.0/0"
+          }
+        ]
+      }
+    },
+    "EdxappServerSecurityGroup":{
+      "Type":"AWS::EC2::SecurityGroup",
+      "Properties":{
+        "GroupDescription":"Open up SSH access plus Edx Server required ports",
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "SecurityGroupIngress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"22",
+            "ToPort":"22",
+            "CidrIp":{
+              "Ref":"SSHLocation"
+            }
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"80",
+            "ToPort":"80",
+            "CidrIp":"0.0.0.0/0"
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"443",
+            "ToPort":"443",
+            "CidrIp":"0.0.0.0/0"
+          }
+        ]
+      }
+    },
+    "EdxServerWaitHandle":{
+      "Type":"AWS::CloudFormation::WaitConditionHandle"
+    },
+    "EdxServerWaitCondition":{
+      "Type":"AWS::CloudFormation::WaitCondition",
+      "DependsOn":"EdxappServer",
+      "Properties":{
+        "Handle":{
+          "Ref":"EdxServerWaitHandle"
+        },
+        "Timeout":"1200"
+      }
+    },
+    "XqueueServer":{
+      "Type":"AWS::AutoScaling::LaunchConfiguration",
+      "Metadata":{
+        "AWS::CloudFormation::Init":{
+          "config":{
+            "files":{
+              "/home/ubuntu/.s3cfg":{
+                "content":{
+                  "Fn::Join":[
+                    "",
+                    [
+                      "[default]\n",
+                      "access_key = ",
+                      {
+                        "Ref":"HostKeys"
+                      },
+                      "\n",
+                      "secret_key = ",
+                      {
+                        "Fn::GetAtt":[
+                          "HostKeys",
+                          "SecretAccessKey"
+                        ]
+                      },
+                      "\n",
+                      "use_https = True\n"
+                    ]
+                  ]
+                },
+                "mode":"000644",
+                "owner":"ubuntu",
+                "group":"ubuntu"
+              }
+            }
+          }
+        }
+      },
+      "Properties":{
+        "SecurityGroups":[
+          {
+            "Ref":"XqueueServerSecurityGroup"
+          }
+        ],
+        "ImageId":{
+          "Fn::FindInMap":[
+            "AWSRegionArch2AMI",
+            {
+              "Ref":"AWS::Region"
+            },
+            {
+              "Fn::FindInMap":[
+                "AWSInstanceType2Arch",
+                {
+                  "Ref":"InstanceType"
+                },
+                "Arch"
+              ]
+            }
+          ]
+        },
+        "UserData":{
+          "Fn::Base64":{
+            "Fn::Join":[
+              "",
+              [
+                "#!/bin/bash\n",
+                "exec >> /home/ubuntu/cflog.log\n",
+                "exec 2>> /home/ubuntu/cflog.log\n",
+                "function error_exit\n",
+                "{\n",
+                "  cfn-signal -e 1 -r \"$1\" '",
+                {
+                  "Ref":"XqueueServerWaitHandle"
+                },
+                "'\n",
+                "  exit 1\n",
+                "}\n",
+                "apt-get -y update\n",
+                "apt-get -y install python-setuptools\n",
+                "echo \"Python Tools installed\" - `date` >> /home/ubuntu/cflog.txt\n",
+                "easy_install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
+                "echo \"Cloudformation Boostrap installed \" - `date` >> /home/ubuntu/cflog.txt\n",
+                "cfn-init --region ",
+                {
+                  "Ref":"AWS::Region"
+                },
+                "    -s ",
+                {
+                  "Ref":"AWS::StackName"
+                },
+                " -r EdxappServer ",
+                "         --access-key ",
+                {
+                  "Ref":"HostKeys"
+                },
+                "         --secret-key ",
+                {
+                  "Fn::GetAtt":[
+                    "HostKeys",
+                    "SecretAccessKey"
+                  ]
+                },
+                " || error_exit 'Failed to run cfn-init'\n",
+                "echo \"cfn-init run \" - `date` >> /home/ubuntu/cflog.txt\n",
+                "# If all went well, signal success\n",
+                "cfn-signal -e $? -r 'Edx Server configuration' '",
+                {
+                  "Ref":"XqueueServerWaitHandle"
+                },
+                "'\n"
+              ]
+            ]
+          }
+        },
+        "KeyName":{
+          "Ref":"KeyName"
+        },
+        "InstanceType":{
+          "Ref":"InstanceType"
+        },
+        "BlockDeviceMappings":[
+          {
+            "DeviceName":"/dev/xvdb",
+            "Ebs":{
+              "VolumeSize":"50"
+            }
+          },
+          {
+            "DeviceName":"/dev/xvdc",
+            "Ebs":{
+              "VolumeSize":"50"
+            }
+          }
+        ]
+      }
+    },
+    "XqueueServerASGroup":{
+      "Type":"AWS::AutoScaling::AutoScalingGroup",
+      "Properties":{
+        "AvailabilityZones":[
+          {
+            "Fn::GetAtt":[
+              "XqueueSubnet01",
+              "AvailabilityZone"
+            ]
+          },
+          {
+            "Fn::GetAtt":[
+              "XqueueSubnet02",
+              "AvailabilityZone"
+            ]
+          }
+        ],
+        "VPCZoneIdentifier":[
+          {
+            "Ref":"XqueueSubnet01"
+          },
+          {
+            "Ref":"XqueueSubnet02"
+          }
+        ],
+        "Tags":[
+          {
+            "Key":"group",
+            "Value":"xqueue",
+            "PropagateAtLaunch":true
+          },
+          {
+            "Key":"environment",
+            "Value":{
+              "Ref":"EnvironmentTag"
+            },
+            "PropagateAtLaunch":true
+          }
+        ],
+        "LaunchConfigurationName":{
+          "Ref":"XqueueServer"
+        },
+        "MinSize":"2",
+        "MaxSize":"2",
+        "DesiredCapacity":{
+          "Ref":"XqueueDesiredCapacity"
+        },
+        "LoadBalancerNames":[
+          {
+            "Ref":"XqueueELB"
+          }
+        ]
+      }
+    },
+    "XqueueScaleUpPolicy":{
+      "Type":"AWS::AutoScaling::ScalingPolicy",
+      "Properties":{
+        "AdjustmentType":"ChangeInCapacity",
+        "AutoScalingGroupName":{
+          "Ref":"XqueueServerASGroup"
+        },
+        "Cooldown":"60",
+        "ScalingAdjustment":"1"
+      }
+    },
+    "XqueueScaleDownPolicy":{
+      "Type":"AWS::AutoScaling::ScalingPolicy",
+      "Properties":{
+        "AdjustmentType":"ChangeInCapacity",
+        "AutoScalingGroupName":{
+          "Ref":"XqueueServerASGroup"
+        },
+        "Cooldown":"60",
+        "ScalingAdjustment":"-1"
+      }
+    },
+    "XqueueCPUAlarmHigh":{
+      "Type":"AWS::CloudWatch::Alarm",
+      "Properties":{
+        "AlarmDescription":"Scale-up if CPU > 90% for 10 minutes",
+        "MetricName":"CPUUtilization",
+        "Namespace":"AWS/EC2",
+        "Statistic":"Average",
+        "Period":"300",
+        "EvaluationPeriods":"2",
+        "Threshold":"90",
+        "AlarmActions":[
+          {
+            "Ref":"XqueueScaleUpPolicy"
+          }
+        ],
+        "Dimensions":[
+          {
+            "Name":"AutoScalingGroupName",
+            "Value":{
+              "Ref":"XqueueServerASGroup"
+            }
+          }
+        ],
+        "ComparisonOperator":"GreaterThanThreshold"
+      }
+    },
+    "XqueueCPUAlarmLow":{
+      "Type":"AWS::CloudWatch::Alarm",
+      "Properties":{
+        "AlarmDescription":"Scale-down if CPU < 70% for 10 minutes",
+        "MetricName":"CPUUtilization",
+        "Namespace":"AWS/EC2",
+        "Statistic":"Average",
+        "Period":"300",
+        "EvaluationPeriods":"2",
+        "Threshold":"70",
+        "AlarmActions":[
+          {
+            "Ref":"XqueueScaleDownPolicy"
+          }
+        ],
+        "Dimensions":[
+          {
+            "Name":"AutoScalingGroupName",
+            "Value":{
+              "Ref":"XqueueServerASGroup"
+            }
+          }
+        ],
+        "ComparisonOperator":"LessThanThreshold"
+      }
+    },
+    "XqueueELB":{
+      "Type":"AWS::ElasticLoadBalancing::LoadBalancer",
+      "Properties":{
+        "SecurityGroups":[
+          {
+            "Ref":"XqueueELBSecurityGroup"
+          }
+        ],
+        "Listeners":[
+          {
+            "LoadBalancerPort":"80",
+            "InstancePort":"80",
+            "Protocol":"HTTP"
+          },
+          {
+            "LoadBalancerPort":"443",
+            "InstancePort":"443",
+            "Protocol":"HTTP"
+          }
+        ],
+        "HealthCheck":{
+          "Target":"TCP:22",
+          "HealthyThreshold":"3",
+          "UnhealthyThreshold":"5",
+          "Interval":"30",
+          "Timeout":"5"
+        },
+        "Subnets":[
+          {
+            "Ref":"PublicSubnet01"
+          }
+        ]
+      }
+    },
+    "XqueueELBSecurityGroup":{
+      "Type":"AWS::EC2::SecurityGroup",
+      "Properties":{
+        "GroupDescription":"Enable HTTP access on port 80",
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "SecurityGroupIngress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"80",
+            "ToPort":"80",
+            "CidrIp":"0.0.0.0/0"
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"443",
+            "ToPort":"443",
+            "CidrIp":"0.0.0.0/0"
+          }
+        ],
+        "SecurityGroupEgress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"80",
+            "ToPort":"80",
+            "CidrIp":"0.0.0.0/0"
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"443",
+            "ToPort":"443",
+            "CidrIp":"0.0.0.0/0"
+          }
+        ]
+      }
+    },
+    "XqueueServerSecurityGroup":{
+      "Type":"AWS::EC2::SecurityGroup",
+      "Properties":{
+        "GroupDescription":"Open up SSH access plus Edx Server required ports",
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "SecurityGroupIngress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"22",
+            "ToPort":"22",
+            "CidrIp":{
+              "Ref":"SSHLocation"
+            }
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"80",
+            "ToPort":"80",
+            "CidrIp":"0.0.0.0/0"
+          }
+        ]
+      }
+    },
+    "XqueueServerWaitHandle":{
+      "Type":"AWS::CloudFormation::WaitConditionHandle"
+    },
+    "XqueueServerWaitCondition":{
+      "Type":"AWS::CloudFormation::WaitCondition",
+      "DependsOn":"XqueueServer",
+      "Properties":{
+        "Handle":{
+          "Ref":"XqueueServerWaitHandle"
+        },
+        "Timeout":"1200"
+      }
+    },
+    "RabbitMQServer":{
+      "Type":"AWS::AutoScaling::LaunchConfiguration",
+      "Metadata":{
+        "AWS::CloudFormation::Init":{
+          "config":{
+            "files":{
+              "/home/ubuntu/.s3cfg":{
+                "content":{
+                  "Fn::Join":[
+                    "",
+                    [
+                      "[default]\n",
+                      "access_key = ",
+                      {
+                        "Ref":"HostKeys"
+                      },
+                      "\n",
+                      "secret_key = ",
+                      {
+                        "Fn::GetAtt":[
+                          "HostKeys",
+                          "SecretAccessKey"
+                        ]
+                      },
+                      "\n",
+                      "use_https = True\n"
+                    ]
+                  ]
+                },
+                "mode":"000644",
+                "owner":"ubuntu",
+                "group":"ubuntu"
+              }
+            }
+          }
+        }
+      },
+      "Properties":{
+        "SecurityGroups":[
+          {
+            "Ref":"RabbitMQServerSecurityGroup"
+          }
+        ],
+        "ImageId":{
+          "Fn::FindInMap":[
+            "AWSRegionArch2AMI",
+            {
+              "Ref":"AWS::Region"
+            },
+            {
+              "Fn::FindInMap":[
+                "AWSInstanceType2Arch",
+                {
+                  "Ref":"InstanceType"
+                },
+                "Arch"
+              ]
+            }
+          ]
+        },
+        "UserData":{
+          "Fn::Base64":{
+            "Fn::Join":[
+              "",
+              [
+                "#!/bin/bash\n",
+                "exec >> /home/ubuntu/cflog.log\n",
+                "exec 2>> /home/ubuntu/cflog.log\n",
+                "function error_exit\n",
+                "{\n",
+                "  cfn-signal -e 1 -r \"$1\" '",
+                {
+                  "Ref":"RabbitMQServerWaitHandle"
+                },
+                "'\n",
+                "  exit 1\n",
+                "}\n",
+                "apt-get -y update\n",
+                "apt-get -y install python-setuptools\n",
+                "echo \"Python Tools installed\" - `date` >> /home/ubuntu/cflog.txt\n",
+                "easy_install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
+                "echo \"Cloudformation Boostrap installed \" - `date` >> /home/ubuntu/cflog.txt\n",
+                "cfn-init --region ",
+                {
+                  "Ref":"AWS::Region"
+                },
+                "    -s ",
+                {
+                  "Ref":"AWS::StackName"
+                },
+                " -r RabbitMQServer ",
+                "         --access-key ",
+                {
+                  "Ref":"HostKeys"
+                },
+                "         --secret-key ",
+                {
+                  "Fn::GetAtt":[
+                    "HostKeys",
+                    "SecretAccessKey"
+                  ]
+                },
+                " || error_exit 'Failed to run cfn-init'\n",
+                "echo \"cfn-init run \" - `date` >> /home/ubuntu/cflog.txt\n",
+                "# If all went well, signal success\n",
+                "cfn-signal -e $? -r 'Edx Server configuration' '",
+                {
+                  "Ref":"RabbitMQServerWaitHandle"
+                },
+                "'\n"
+              ]
+            ]
+          }
+        },
+        "KeyName":{
+          "Ref":"KeyName"
+        },
+        "InstanceType":{
+          "Ref":"InstanceType"
+        },
+        "BlockDeviceMappings":[
+          {
+            "DeviceName":"/dev/xvdb",
+            "Ebs":{
+              "VolumeSize":"50"
+            }
+          },
+          {
+            "DeviceName":"/dev/xvdc",
+            "Ebs":{
+              "VolumeSize":"50"
+            }
+          }
+        ]
+      }
+    },
+    "RabbitMQServerASGroup":{
+      "Type":"AWS::AutoScaling::AutoScalingGroup",
+      "Properties":{
+        "AvailabilityZones":[
+          {
+            "Fn::GetAtt":[
+              "RabbitSubnet01",
+              "AvailabilityZone"
+            ]
+          },
+          {
+            "Fn::GetAtt":[
+              "RabbitSubnet02",
+              "AvailabilityZone"
+            ]
+          }
+        ],
+        "VPCZoneIdentifier":[
+          {
+            "Ref":"RabbitSubnet01"
+          },
+          {
+            "Ref":"RabbitSubnet02"
+          }
+        ],
+        "Tags":[
+          {
+            "Key":"group",
+            "Value":"rabbitmq",
+            "PropagateAtLaunch":true
+          },
+          {
+            "Key":"environment",
+            "Value":{
+              "Ref":"EnvironmentTag"
+            },
+            "PropagateAtLaunch":true
+          }
+        ],
+        "LaunchConfigurationName":{
+          "Ref":"RabbitMQServer"
+        },
+        "MinSize":"2",
+        "MaxSize":"2",
+        "DesiredCapacity":{
+          "Ref":"RabbitMQDesiredCapacity"
+        },
+        "LoadBalancerNames":[
+          {
+            "Ref":"RabbitMQELB"
+          }
+        ]
+      }
+    },
+    "RabbitMQScaleUpPolicy":{
+      "Type":"AWS::AutoScaling::ScalingPolicy",
+      "Properties":{
+        "AdjustmentType":"ChangeInCapacity",
+        "AutoScalingGroupName":{
+          "Ref":"RabbitMQServerASGroup"
+        },
+        "Cooldown":"60",
+        "ScalingAdjustment":"1"
+      }
+    },
+    "RabbitMQScaleDownPolicy":{
+      "Type":"AWS::AutoScaling::ScalingPolicy",
+      "Properties":{
+        "AdjustmentType":"ChangeInCapacity",
+        "AutoScalingGroupName":{
+          "Ref":"RabbitMQServerASGroup"
+        },
+        "Cooldown":"60",
+        "ScalingAdjustment":"-1"
+      }
+    },
+    "RabbitMQCPUAlarmHigh":{
+      "Type":"AWS::CloudWatch::Alarm",
+      "Properties":{
+        "AlarmDescription":"Scale-up if CPU > 90% for 10 minutes",
+        "MetricName":"CPUUtilization",
+        "Namespace":"AWS/EC2",
+        "Statistic":"Average",
+        "Period":"300",
+        "EvaluationPeriods":"2",
+        "Threshold":"90",
+        "AlarmActions":[
+          {
+            "Ref":"RabbitMQScaleUpPolicy"
+          }
+        ],
+        "Dimensions":[
+          {
+            "Name":"AutoScalingGroupName",
+            "Value":{
+              "Ref":"RabbitMQServerASGroup"
+            }
+          }
+        ],
+        "ComparisonOperator":"GreaterThanThreshold"
+      }
+    },
+    "RabbitMQCPUAlarmLow":{
+      "Type":"AWS::CloudWatch::Alarm",
+      "Properties":{
+        "AlarmDescription":"Scale-down if CPU < 70% for 10 minutes",
+        "MetricName":"CPUUtilization",
+        "Namespace":"AWS/EC2",
+        "Statistic":"Average",
+        "Period":"300",
+        "EvaluationPeriods":"2",
+        "Threshold":"70",
+        "AlarmActions":[
+          {
+            "Ref":"RabbitMQScaleDownPolicy"
+          }
+        ],
+        "Dimensions":[
+          {
+            "Name":"AutoScalingGroupName",
+            "Value":{
+              "Ref":"RabbitMQServerASGroup"
+            }
+          }
+        ],
+        "ComparisonOperator":"LessThanThreshold"
+      }
+    },
+    "RabbitMQELB":{
+      "Type":"AWS::ElasticLoadBalancing::LoadBalancer",
+      "Properties":{
+        "Scheme":"internal",
+        "SecurityGroups":[
+          {
+            "Ref":"RabbitMQELBSecurityGroup"
+          }
+        ],
+        "Listeners":[
+          {
+            "LoadBalancerPort":"5672",
+            "InstancePort":"5672",
+            "Protocol":"TCP"
+          },
+          {
+            "LoadBalancerPort":"6163",
+            "InstancePort":"6163",
+            "Protocol":"TCP"
+          }
+        ],
+        "HealthCheck":{
+          "Target":"TCP:22",
+          "HealthyThreshold":"3",
+          "UnhealthyThreshold":"5",
+          "Interval":"30",
+          "Timeout":"5"
+        },
+        "Subnets":[
+          {
+            "Ref":"PublicSubnet01"
+          },
+          {
+            "Ref":"PublicSubnet02"
+          }
+        ]
+      }
+    },
+    "RabbitMQELBSecurityGroup":{
+      "Type":"AWS::EC2::SecurityGroup",
+      "Properties":{
+        "GroupDescription":"Enable TCP access on rabbit ports",
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "SecurityGroupIngress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"5672",
+            "ToPort":"5672",
+            "CidrIp":"10.0.0.0/16"
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"6163",
+            "ToPort":"6163",
+            "CidrIp":"10.0.0.0/16"
+          }
+        ],
+        "SecurityGroupEgress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"5672",
+            "ToPort":"5672",
+            "CidrIp":"10.0.0.0/16"
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"6163",
+            "ToPort":"6163",
+            "CidrIp":"10.0.0.0/16"
+          }
+        ]
+      }
+    },
+    "RabbitMQServerSecurityGroup":{
+      "Type":"AWS::EC2::SecurityGroup",
+      "Properties":{
+        "GroupDescription":"Open up SSH access plus Edx Server required ports",
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "SecurityGroupIngress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"22",
+            "ToPort":"22",
+            "CidrIp":"10.0.0.0/16"
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"5672",
+            "ToPort":"5672",
+            "SourceSecurityGroupID" : {
+		"Ref" : "RabbitMQELBSecurityGroup" 
+	    }
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"6163",
+            "ToPort":"6163",
+            "SourceSecurityGroupId" : {
+		"Ref" : "RabbitMQELBSecurityGroup" 
+	    }
+          }
+        ]
+      }
+    },
+    "RabbitMQServerWaitHandle":{
+      "Type":"AWS::CloudFormation::WaitConditionHandle"
+    },
+    "RabbitMQServerWaitCondition":{
+      "Type":"AWS::CloudFormation::WaitCondition",
+      "DependsOn":"RabbitMQServer",
+      "Properties":{
+        "Handle":{
+          "Ref":"RabbitMQServerWaitHandle"
+        },
+        "Timeout":"1200"
+      }
+    },
+    "XServer":{
+      "Type":"AWS::AutoScaling::LaunchConfiguration",
+      "Metadata":{
+        "AWS::CloudFormation::Init":{
+          "config":{
+            "files":{
+              "/home/ubuntu/.s3cfg":{
+                "content":{
+                  "Fn::Join":[
+                    "",
+                    [
+                      "[default]\n",
+                      "access_key = ",
+                      {
+                        "Ref":"HostKeys"
+                      },
+                      "\n",
+                      "secret_key = ",
+                      {
+                        "Fn::GetAtt":[
+                          "HostKeys",
+                          "SecretAccessKey"
+                        ]
+                      },
+                      "\n",
+                      "use_https = True\n"
+                    ]
+                  ]
+                },
+                "mode":"000644",
+                "owner":"ubuntu",
+                "group":"ubuntu"
+              }
+            }
+          }
+        }
+      },
+      "Properties":{
+        "SecurityGroups":[
+          {
+            "Ref":"XServerSecurityGroup"
+          }
+        ],
+        "ImageId":{
+          "Fn::FindInMap":[
+            "AWSRegionArch2AMI",
+            {
+              "Ref":"AWS::Region"
+            },
+            {
+              "Fn::FindInMap":[
+                "AWSInstanceType2Arch",
+                {
+                  "Ref":"InstanceType"
+                },
+                "Arch"
+              ]
+            }
+          ]
+        },
+        "UserData":{
+          "Fn::Base64":{
+            "Fn::Join":[
+              "",
+              [
+                "#!/bin/bash\n",
+                "exec >> /home/ubuntu/cflog.log\n",
+                "exec 2>> /home/ubuntu/cflog.log\n",
+                "function error_exit\n",
+                "{\n",
+                "  cfn-signal -e 1 -r \"$1\" '",
+                {
+                  "Ref":"XServerWaitHandle"
+                },
+                "'\n",
+                "  exit 1\n",
+                "}\n",
+                "apt-get -y update\n",
+                "apt-get -y install python-setuptools\n",
+                "echo \"Python Tools installed\" - `date` >> /home/ubuntu/cflog.txt\n",
+                "easy_install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
+                "echo \"Cloudformation Boostrap installed \" - `date` >> /home/ubuntu/cflog.txt\n",
+                "cfn-init --region ",
+                {
+                  "Ref":"AWS::Region"
+                },
+                "    -s ",
+                {
+                  "Ref":"AWS::StackName"
+                },
+                " -r XServer ",
+                "         --access-key ",
+                {
+                  "Ref":"HostKeys"
+                },
+                "         --secret-key ",
+                {
+                  "Fn::GetAtt":[
+                    "HostKeys",
+                    "SecretAccessKey"
+                  ]
+                },
+                " || error_exit 'Failed to run cfn-init'\n",
+                "echo \"cfn-init run \" - `date` >> /home/ubuntu/cflog.txt\n",
+                "# If all went well, signal success\n",
+                "cfn-signal -e $? -r 'Edx Server configuration' '",
+                {
+                  "Ref":"XServerWaitHandle"
+                },
+                "'\n"
+              ]
+            ]
+          }
+        },
+        "KeyName":{
+          "Ref":"KeyName"
+        },
+        "InstanceType":{
+          "Ref":"InstanceType"
+        },
+        "BlockDeviceMappings":[
+          {
+            "DeviceName":"/dev/xvdb",
+            "Ebs":{
+              "VolumeSize":"50"
+            }
+          },
+          {
+            "DeviceName":"/dev/xvdc",
+            "Ebs":{
+              "VolumeSize":"50"
+            }
+          }
+        ]
+      }
+    },
+    "XServerASGroup":{
+      "Type":"AWS::AutoScaling::AutoScalingGroup",
+      "Properties":{
+        "AvailabilityZones":[
+          {
+            "Fn::GetAtt":[
+              "XServerSubnet01",
+              "AvailabilityZone"
+            ]
+          },
+          {
+            "Fn::GetAtt":[
+              "XServerSubnet02",
+              "AvailabilityZone"
+            ]
+          }
+        ],
+        "VPCZoneIdentifier":[
+          {
+            "Ref":"XServerSubnet01"
+          },
+          {
+            "Ref":"XServerSubnet02"
+          }
+        ],
+        "Tags":[
+          {
+            "Key":"group",
+            "Value":"xserver",
+            "PropagateAtLaunch":true
+          },
+          {
+            "Key":"environment",
+            "Value":{
+              "Ref":"EnvironmentTag"
+            },
+            "PropagateAtLaunch":true
+          }
+        ],
+        "LaunchConfigurationName":{
+          "Ref":"XServer"
+        },
+        "MinSize":"2",
+        "MaxSize":"2",
+        "DesiredCapacity":{
+          "Ref":"XServerDesiredCapacity"
+        },
+        "LoadBalancerNames":[
+          {
+            "Ref":"XServerELB"
+          }
+        ]
+      }
+    },
+    "XServerScaleUpPolicy":{
+      "Type":"AWS::AutoScaling::ScalingPolicy",
+      "Properties":{
+        "AdjustmentType":"ChangeInCapacity",
+        "AutoScalingGroupName":{
+          "Ref":"XServerASGroup"
+        },
+        "Cooldown":"60",
+        "ScalingAdjustment":"1"
+      }
+    },
+    "XServerScaleDownPolicy":{
+      "Type":"AWS::AutoScaling::ScalingPolicy",
+      "Properties":{
+        "AdjustmentType":"ChangeInCapacity",
+        "AutoScalingGroupName":{
+          "Ref":"XServerASGroup"
+        },
+        "Cooldown":"60",
+        "ScalingAdjustment":"-1"
+      }
+    },
+    "XServerCPUAlarmHigh":{
+      "Type":"AWS::CloudWatch::Alarm",
+      "Properties":{
+        "AlarmDescription":"Scale-up if CPU > 90% for 10 minutes",
+        "MetricName":"CPUUtilization",
+        "Namespace":"AWS/EC2",
+        "Statistic":"Average",
+        "Period":"300",
+        "EvaluationPeriods":"2",
+        "Threshold":"90",
+        "AlarmActions":[
+          {
+            "Ref":"XServerScaleUpPolicy"
+          }
+        ],
+        "Dimensions":[
+          {
+            "Name":"AutoScalingGroupName",
+            "Value":{
+              "Ref":"XServerASGroup"
+            }
+          }
+        ],
+        "ComparisonOperator":"GreaterThanThreshold"
+      }
+    },
+    "XServerCPUAlarmLow":{
+      "Type":"AWS::CloudWatch::Alarm",
+      "Properties":{
+        "AlarmDescription":"Scale-down if CPU < 70% for 10 minutes",
+        "MetricName":"CPUUtilization",
+        "Namespace":"AWS/EC2",
+        "Statistic":"Average",
+        "Period":"300",
+        "EvaluationPeriods":"2",
+        "Threshold":"70",
+        "AlarmActions":[
+          {
+            "Ref":"XServerScaleDownPolicy"
+          }
+        ],
+        "Dimensions":[
+          {
+            "Name":"AutoScalingGroupName",
+            "Value":{
+              "Ref":"XServerASGroup"
+            }
+          }
+        ],
+        "ComparisonOperator":"LessThanThreshold"
+      }
+    },
+    "XServerELB":{
+      "Type":"AWS::ElasticLoadBalancing::LoadBalancer",
+      "Properties":{
+        "Scheme":"internal",
+        "SecurityGroups":[
+          {
+            "Ref":"XServerELBSecurityGroup"
+          }
+        ],
+        "Listeners":[
+          {
+            "LoadBalancerPort":"5672",
+            "InstancePort":"5672",
+            "Protocol":"TCP"
+          },
+          {
+            "LoadBalancerPort":"6163",
+            "InstancePort":"6163",
+            "Protocol":"TCP"
+          }
+        ],
+        "HealthCheck":{
+          "Target":"TCP:22",
+          "HealthyThreshold":"3",
+          "UnhealthyThreshold":"5",
+          "Interval":"30",
+          "Timeout":"5"
+        },
+        "Subnets":[
+          {
+            "Ref":"PublicSubnet01"
+          },
+          {
+            "Ref":"PublicSubnet02"
+          }
+        ]
+      }
+    },
+    "XServerELBSecurityGroup":{
+      "Type":"AWS::EC2::SecurityGroup",
+      "Properties":{
+        "GroupDescription":"Enable TCP access on xserver ports",
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "SecurityGroupIngress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"80",
+            "ToPort":"80",
+            "CidrIp":"10.0.0.0/16"
+          }
+        ],
+        "SecurityGroupEgress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"80",
+            "ToPort":"80",
+            "CidrIp":"10.0.0.0/16"
+          }
+        ]
+      }
+    },
+    "XServerSecurityGroup":{
+      "Type":"AWS::EC2::SecurityGroup",
+      "Properties":{
+        "GroupDescription":"Open up SSH access plus XServer required ports",
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "SecurityGroupIngress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"22",
+            "ToPort":"22",
+            "CidrIp":"10.0.0.0/16"
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"80",
+            "ToPort":"80",
+            "CidrIp":"10.0.0.0/16"
+          },
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"80",
+            "ToPort":"80",
+            "SourceSecurityGroupId" : { 
+		"Ref" : "XServerELBSecurityGroup" 
+	    }
+          }
+        ]
+      }
+    },
+    "XServerWaitHandle":{
+      "Type":"AWS::CloudFormation::WaitConditionHandle"
+    },
+    "XServerWaitCondition":{
+      "Type":"AWS::CloudFormation::WaitCondition",
+      "DependsOn":"XServer",
+      "Properties":{
+        "Handle":{
+          "Ref":"XServerWaitHandle"
+        },
+        "Timeout":"1200"
+      }
+    },
+    "EdxDataSecurityGroup":{
+      "Type":"AWS::EC2::SecurityGroup",
+      "Properties":{
+        "GroupDescription":"Open up access to the data subnet",
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "SecurityGroupIngress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"3306",
+            "ToPort":"3306",
+            "CidrIp":"0.0.0.0/0"
+          }
+        ]
+      }
+    },
+    "EdxDBSubnetGroup":{
+      "Type":"AWS::RDS::DBSubnetGroup",
+      "Properties":{
+        "DBSubnetGroupDescription":"Subnets available for the RDS DB Instance",
+        "SubnetIds":[
+          {
+            "Ref":"Data01"
+          },
+          {
+            "Ref":"Data02"
+          }
+        ]
+      }
+    },
+    "DBSecurityGroup":{
+      "Type":"AWS::RDS::DBSecurityGroup",
+      "Properties":{
+        "EC2VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "DBSecurityGroupIngress":[
+          {
+            "EC2SecurityGroupId":{
+              "Ref":"EdxappServerSecurityGroup"
+            }
+          }
+        ],
+        "GroupDescription":"Data access"
+      }
+    },
+    "EdxDB":{
+      "Type":"AWS::RDS::DBInstance",
+      "Properties":{
+        "DBName":{
+          "Ref":"DBName"
+        },
+        "AllocatedStorage":{
+          "Ref":"DBAllocatedStorage"
+        },
+        "DBInstanceClass":{
+          "Ref":"DBClass"
+        },
+        "Engine":"MySQL",
+        "EngineVersion":"5.5",
+        "MasterUsername":{
+          "Ref":"DBUsername"
+        },
+        "MasterUserPassword":{
+          "Ref":"DBPassword"
+        },
+        "DBSubnetGroupName":{
+          "Ref":"EdxDBSubnetGroup"
+        },
+        "DBSecurityGroups":[
+          {
+            "Ref":"DBSecurityGroup"
+          }
+        ],
+        "MultiAZ":"true"
+      }
+    },
+    "CacheSecurityGroup":{
+      "Type":"AWS::EC2::SecurityGroup",
+      "Properties":{
+        "GroupDescription":"Access to the elastic cache cluster",
+        "VpcId":{
+          "Ref":"EdxVPC"
+        },
+        "SecurityGroupIngress":[
+          {
+            "IpProtocol":"tcp",
+            "FromPort":"12345",
+            "ToPort":"12345",
+            "SourceSecurityGroupId":{
+              "Ref":"EdxappELBSecurityGroup"
+            }
+          }
+        ]
+      }
+    }
+  },
+  "Outputs":{
+    "EdxSecurityGroup":{
+      "Description":"EC2 Security Group with access to the Edx server",
+      "Value":{
+        "Ref":"EdxappServerSecurityGroup"
+      }
+    },
+    "DatabaseConfigurationString":{
+      "Description":"JDBC connection string for database",
+      "Value":{
+        "Fn::Join":[
+          "",
+          [
+            "'DATABASES': {\n",
+            "    'default': {\n",
+            "        'ENGINE': 'django.db.backends.mysql',\n",
+            "        'NAME': '",
+            {
+              "Ref":"DBName"
+            },
+            "',\n",
+            "        'USER': '",
+            {
+              "Ref":"DBUsername"
+            },
+            "',\n",
+            "        'PASSWORD': '",
+            {
+              "Ref":"DBPassword"
+            },
+            "',\n",
+            "        'HOST': '",
+            {
+              "Fn::GetAtt":[
+                "EdxDB",
+                "Endpoint.Address"
+              ]
+            },
+            "'\n",
+            "        'PORT': '",
+            {
+              "Fn::GetAtt":[
+                "EdxDB",
+                "Endpoint.Port"
+              ]
+            },
+            "'\n",
+            "    }\n",
+            "}\n"
+          ]
+        ]
+      }
+    },
+    "ElasticCacheCreateSubnetGroupCommand":{
+      "Description":"Commands to be run to create the elatic cache.  Creation isn't fully supported in CF today.",
+      "Value":{
+        "Fn::Join":[
+          "",
+          [
+            "elasticache-create-cache-subnet-group",
+            " ",
+            {
+              "Ref":"EdxVPC"
+            },
+            "_ElasticCacheSubnetGroup --description  'VPC ElasticCache Subnet Group'",
+            "--subnet-ID-list",
+            " ",
+            {
+              "Ref":"Cache01"
+            },
+            " ",
+            {
+              "Ref":"Cache02"
+            }
+          ]
+        ]
+      }
+    },
+    "ElasticCacheCreateCacheClusterCommand":{
+      "Description":"Foo",
+      "Value":{
+        "Fn::Join":[
+          "",
+          [
+            "elasticache-create-cache-cluster",
+            " ",
+            {
+              "Ref":"EdxVPC"
+            },
+            "_ElacticCacheCluster --num-cache-nodes ",
+            {
+              "Ref":"NumberOfCacheNodes"
+            },
+            " --cache-node-type ",
+            {
+              "Ref":"CacheNodeType"
+            },
+            " --engine memcached --engine-version 1.4.5 --port 12345 --preferred-availability-zone us-east-1b",
+            " --cache-parameter-group-name default.memcached1.4 --auto-minor-version-upgrade true",
+            " --cache-subnet-group-name ElasticCacheSubnetGroup",
+            "bar"
+          ]
+        ]
+      }
+    }
+  }
+}
--
libgit2 0.26.0