You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2016/02/04 18:57:32 UTC
[08/50] [abbrv] usergrid git commit: Move and re-organize the AWS
cluster deployment along with updates to the Usergrid artifact and
dependencies specified.
http://git-wip-us.apache.org/repos/asf/usergrid/blob/d478adb0/deployment/aws/ugcluster-cf.json
----------------------------------------------------------------------
diff --git a/deployment/aws/ugcluster-cf.json b/deployment/aws/ugcluster-cf.json
new file mode 100644
index 0000000..05e7269
--- /dev/null
+++ b/deployment/aws/ugcluster-cf.json
@@ -0,0 +1,2062 @@
+{
+ "AWSTemplateFormatVersion": "2010-09-09",
+ "Description": "Usergrid AWS Cluster",
+ "Parameters": {
+ "DnsSubDomain": {
+ "Description": "DNS name for stack, must not already exist in Route53.",
+ "Type": "String",
+ "Default": "ugtest"
+ },
+ "DnsDomain": {
+ "Description": "DNS domain for stack, must already exist in Route53",
+ "Type": "String",
+ "Default": "usergrid.com"
+ },
+ "ReleaseBucket": {
+ "Description": "S3 Bucket where Usergrid assembly is to be found.",
+ "Type": "String",
+ "Default": "ug-cloudformation"
+ },
+ "RestMinServers": {
+ "Description": "Minimum number of REST servers.",
+ "Type": "Number",
+ "Default": "1",
+ "MinValue": "1"
+ },
+ "RestMaxServers": {
+ "Description": "Maximum number REST servers.",
+ "Type": "Number",
+ "Default": "3",
+ "MinValue": "1"
+ },
+ "RestInstanceType": {
+ "Description": "Instance type for REST servers",
+ "Type": "String",
+ "Default": "c3.xlarge",
+ "AllowedValues": [
+ "m1.small",
+ "m1.medium",
+ "m1.large",
+ "m1.xlarge",
+ "m3.xlarge",
+ "m3.large",
+ "c3.xlarge",
+ "c3.2xlarge",
+ "c3.4xlarge"
+ ],
+ "ConstraintDescription": "must be valid instance type."
+ },
+ "RestIndexWorkers":{
+ "Description": "The number of index workers to ingest ElasticSearch batch operations per tomcat",
+ "Type": "Number",
+ "Default": "8",
+ "MinValue": "3"
+ },
+ "TomcatThreadsPerCore": {
+ "Description": "Number of threads to configure tomcat for per core",
+ "Type": "Number",
+ "Default": "50",
+ "MinValue": "1"
+ },
+ "KeyPair": {
+ "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instance",
+ "Type": "AWS::EC2::KeyPair::KeyName",
+ "Default": "ug-cloudformation",
+ "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
+ },
+ "CassClusterName": {
+ "Description": "Name to be used for Cassandra cluster.",
+ "Type": "String",
+ "Default": "usergrid"
+ },
+ "CassNumServers": {
+ "Description": "Number of Cass servers to start.",
+ "Type": "Number",
+ "Default": "6",
+ "MinValue": "2"
+ },
+ "CassInstanceType": {
+ "Description": "Instance type for Cass servers",
+ "Type": "String",
+ "Default": "c3.4xlarge",
+ "AllowedValues": [
+ "c3.large",
+ "c3.xlarge",
+ "c3.2xlarge",
+ "c3.4xlarge"
+ ],
+ "ConstraintDescription": "must be valid instance type."
+ },
+ "CassReplicationFactor": {
+ "Description": "Cassandra replication factor",
+ "Type": "Number",
+ "Default": "2",
+ "MinValue": "1"
+ },
+
+ "CassReadConsistency": {
+ "Description": "Cassandra replication factor for Astyanax",
+ "Type": "String",
+ "Default": "CL_ONE"
+ },
+ "CassWriteConsistency": {
+ "Description": "Cassandra replication factor for Astyanax",
+ "Type": "String",
+ "Default": "CL_ONE"
+ },
+ "ESClusterName": {
+ "Description": "Name to be used for Elasticsearch cluster.",
+ "Type": "String",
+ "Default": "usergrid"
+ },
+ "ESNumServers": {
+ "Description": "Number of ES servers to start.",
+ "Type": "Number",
+ "Default": "6",
+ "MinValue": "2"
+ },
+ "ESNumMasterServers": {
+ "Description": "Number of ES master servers to start.",
+ "Type": "Number",
+ "Default": "1",
+ "MinValue": "1"
+ },
+
+
+ "ESInstanceType": {
+ "Description": "Instance type for ES servers",
+ "Type": "String",
+ "Default": "c3.4xlarge",
+ "AllowedValues": [
+ "c3.large",
+ "c3.xlarge",
+ "c3.2xlarge",
+ "c3.4xlarge"
+ ],
+ "ConstraintDescription": "must be valid instance type."
+ },
+ "SuperUserEmail": {
+ "Description": "Email for superuser user",
+ "Type": "String",
+ "Default": "tnine+super@apigee.com"
+ },
+ "TestAdminUserEmail": {
+ "Description": "Email for test admin user",
+ "Type": "String",
+ "Default": "tnine+admin@apigee.com"
+ },
+ "NotificationEmail": {
+ "Description": "Email for notifications",
+ "Type": "String",
+ "Default": "tnine+super@apigee.com"
+ },
+ "GraphiteInstanceType": {
+ "Description": "Instance type for Graphite server",
+ "Type": "String",
+ "Default": "m3.large",
+ "AllowedValues": [
+ "t1.micro",
+ "m1.small",
+ "m1.medium",
+ "m1.large",
+ "m3.large",
+ "m1.xlarge",
+ "m3.xlarge",
+ "m3.2xlarge",
+ "c3.4xlarge"
+ ],
+ "ConstraintDescription": "must be valid instance type."
+ },
+ "GraphiteNumServers": {
+ "Description": "Minimum number of graphite servers. There should only be one",
+ "Type": "Number",
+ "Default": "1",
+ "MinValue": "1"
+ },
+ "OpsCenterInstanceType": {
+ "Description": "Instance type for Opscenter server",
+ "Type": "String",
+ "Default": "c3.large",
+ "AllowedValues": [
+ "c3.large",
+ "c3.xlarge",
+ "c3.2xlarge",
+ "c3.4xlarge"
+ ],
+ "ConstraintDescription": "must be valid instance type."
+ },
+ "OpsCenterNumServers": {
+ "Description": "Minimum number of opscenter servers. There should only be one",
+ "Type": "Number",
+ "Default": "1",
+ "MinValue": "1"
+ },
+ "InstallYourkit": {
+ "Description": "Install the yourkit remote profiling agent into tomcat. Valid values are 'true' or 'false'",
+ "Type": "String",
+ "Default": "false"
+ }
+ },
+ "Mappings": {
+ "AWSInstanceType2Arch": {
+ "t1.micro": {
+ "Arch": "64"
+ },
+ "m1.small": {
+ "Arch": "64"
+ },
+ "m1.medium": {
+ "Arch": "64"
+ },
+ "m1.large": {
+ "Arch": "64"
+ },
+ "m1.xlarge": {
+ "Arch": "64"
+ },
+ "m3.large": {
+ "Arch": "64"
+ },
+ "m3.xlarge": {
+ "Arch": "64"
+ },
+ "c3.large": {
+ "Arch": "64"
+ },
+ "c3.xlarge": {
+ "Arch": "64"
+ },
+ "c3.2xlarge": {
+ "Arch": "64"
+ },
+ "c3.4xlarge": {
+ "Arch": "64"
+ }
+ },
+ "AWSRegionArch2AMI": {
+ "ap-southeast-2": {
+ "64": "ami-c1335ffb"
+ },
+ "us-east-1": {
+ "64": "ami-b89f18d0"
+ },
+ "us-west-2": {
+ "64": "ami-194a0429"
+ }
+ },
+ "FourAZs": {
+ "ap-southeast-2": {
+ "AZ1": "ap-southeast-2a",
+ "AZ2": "ap-southeast-2b",
+ "AZ3": "ap-southeast-2a",
+ "AZ4": "ap-southeast-2b"
+ },
+ "us-east-1": {
+ "AZ1": "us-east-1b",
+ "AZ2": "us-east-1c",
+ "AZ3": "us-east-1a",
+ "AZ4": "us-east-1e"
+ },
+ "us-west-2": {
+ "AZ1": "us-west-2a",
+ "AZ2": "us-west-2b",
+ "AZ3": "us-west-2c",
+ "AZ4": "us-west-2a"
+ }
+ }
+ },
+ "Resources": {
+ "GraphiteUser": {
+ "Type": "AWS::IAM::User",
+ "Properties": {
+ "Path": "/",
+ "Policies": [
+ {
+ "PolicyName": "root",
+ "PolicyDocument": {
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Action": "*",
+ "Resource": "*"
+
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "GraphiteKey": {
+ "Type": "AWS::IAM::AccessKey",
+ "Properties": {
+ "UserName": {
+ "Ref": "GraphiteUser"
+ }
+ }
+ },
+ "GraphiteAutoScalingLaunchConfiguration":{
+ "Type":"AWS::AutoScaling::LaunchConfiguration",
+ "Properties":{
+ "UserData":{
+ "Fn::Base64":{
+ "Fn::Join":[
+ "",
+ [
+ "#!/bin/bash -x\n",
+ "sudo git clone https://github.com/hopsoft/docker-graphite-statsd.git \n",
+ "sudo ./docker-graphite-statsd/bin/start \n",
+ "sudo git clone https://github.com/dotcloud/collectd-graphite.git \n",
+ "sudo collectd-graphite/docker build -t collectd-graphite . \n",
+
+ "#!/bin/bash -ex\n",
+ "# REST SERVER STARTUP \n",
+ "exec >/var/log/usergrid-bootstrap.log 2>&1\n",
+ "\n",
+ "mkdir -p /usr/share/usergrid\n",
+ "\n",
+ "# create script that sets our environment variables\n",
+ "cat >/etc/profile.d/usergrid-env.sh <<EOF\n",
+ "alias sudo='sudo -E'\n",
+ "\n",
+ "export TYPE=graphite\n",
+ "export STACK_NAME=", { "Ref":"AWS::StackName" }, "\n",
+ "\n",
+ "export DNS_NAME=", { "Ref":"DnsSubDomain" }, "\n",
+ "export DNS_DOMAIN=", { "Ref":"DnsDomain" },
+ "\n",
+ "export PUBLIC_HOSTNAME=`(curl -s http://169.254.169.254/latest/meta-data/public-hostname)`\n",
+ "export INTERNAL_HOSTNAME=`(curl http://169.254.169.254/latest/meta-data/local-ipv4)`\n",
+ "export ELB_NAME=", { "Ref":"RestElasticLoadBalancer" }, "\n",
+ "\n",
+ "export EC2_INSTANCE_ID=`ec2metadata --instance-id`\n",
+ "export EC2_REGION=", { "Ref":"AWS::Region" },
+ "\n",
+ "export EC2_URL=https://ec2.amazonaws.com/\n",
+ "\n",
+ "export REST_SECURITY_GROUP_NAME=", { "Ref":"RestSecurityGroup" }, "\n",
+ "export GRAPHITE_NUM_SERVERS=", { "Ref":"GraphiteNumServers" }, "\n",
+ "export RELEASE_BUCKET=", { "Ref":"ReleaseBucket" }, "\n",
+ "EOF\n",
+ "\n",
+ "# put AWS creds in environment\n",
+ "cat >/etc/profile.d/aws-credentials.sh <<EOF\n",
+ "export AWS_ACCESS_KEY=", { "Ref":"RestKey" }, "\n",
+ "export AWS_SECRET_KEY=", { "Fn::GetAtt":[ "RestKey", "SecretAccessKey" ] }, "\n",
+ "EOF\n",
+ "\n",
+ "# setup s3cmd (will be installed by init script) \n",
+ "cat >/etc/s3cfg <<EOF\n",
+ "access_key=", { "Ref":"RestKey" }, "\n",
+ "secret_key=", { "Fn::GetAtt":[ "RestKey", "SecretAccessKey" ] }, "\n",
+ "EOF\n",
+ "chmod 644 /etc/s3cfg\n",
+ "ln -s /etc/s3cfg ~ubuntu/.s3cfg\n",
+ "ln -s /etc/s3cfg ~root/.s3cfg\n",
+ "\n",
+ "# download usergrid and init script bundle from S3\n",
+ "wget -O- -q http://s3tools.org/repo/deb-all/stable/s3tools.key | apt-key add -\n",
+ "wget -O/etc/apt/sources.list.d/s3tools.list http://s3tools.org/repo/deb-all/stable/s3tools.list\n",
+ "apt-get update\n",
+ "apt-get -y install s3cmd\n",
+ "cd /usr/share/usergrid\n",
+ "s3cmd --config=/etc/s3cfg get s3://", { "Ref":"ReleaseBucket" }, "/awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "tar xvf awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "rm -fr awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "chmod 755 ./init_instance/*.sh\n",
+ "cd ./init_instance\n",
+ "# Init as a REST intance \n",
+ "sh ./init_graphite_server.sh\n"
+ ]
+ ]
+
+ }
+ },
+ "KeyName":{
+ "Ref":"KeyPair"
+ },
+ "ImageId":{
+ "Fn::FindInMap":[
+ "AWSRegionArch2AMI",
+ {
+ "Ref":"AWS::Region"
+ },
+ {
+ "Fn::FindInMap":[
+ "AWSInstanceType2Arch",
+ {
+ "Ref":"GraphiteInstanceType"
+ },
+ "Arch"
+ ]
+ }
+ ]
+ },
+ "InstanceType":{
+ "Ref":"GraphiteInstanceType"
+ },
+ "IamInstanceProfile":{
+ "Ref":"RootInstanceProfile"
+ },
+ "SecurityGroups":[
+ {
+ "Ref":"GraphiteSecurityGroup"
+ }
+ ]
+
+ }
+ },
+ "GraphiteAutoScalingGroup": {
+ "Type": "AWS::AutoScaling::AutoScalingGroup",
+ "Version": "2014-07-24",
+ "Properties": {
+ "AvailabilityZones": [
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ1"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ2"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ3"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ4"
+ ]
+ }
+ ],
+ "LaunchConfigurationName": {
+ "Ref": "GraphiteAutoScalingLaunchConfiguration"
+ },
+ "MinSize": {
+ "Ref": "GraphiteNumServers"
+ },
+ "MaxSize": {
+ "Ref": "GraphiteNumServers"
+ },
+ "NotificationConfiguration": {
+ "TopicARN": {
+ "Ref": "NotificationTopic"
+ },
+ "NotificationTypes": [
+ "autoscaling:EC2_INSTANCE_LAUNCH",
+ "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
+ "autoscaling:EC2_INSTANCE_TERMINATE",
+ "autoscaling:EC2_INSTANCE_TERMINATE_ERROR"
+ ]
+ }
+ }
+ },
+ "OpsCenterUser": {
+ "Type": "AWS::IAM::User",
+ "Properties": {
+ "Path": "/",
+ "Policies": [
+ {
+ "PolicyName": "root",
+ "PolicyDocument": {
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Action": "*",
+ "Resource": "*"
+
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "OpsCenterKey": {
+ "Type": "AWS::IAM::AccessKey",
+ "Properties": {
+ "UserName": {
+ "Ref": "OpsCenterUser"
+ }
+ }
+ },
+ "OpsCenterAutoScalingLaunchConfiguration":{
+ "Type":"AWS::AutoScaling::LaunchConfiguration",
+ "Properties":{
+ "UserData":{
+ "Fn::Base64":{
+ "Fn::Join":[
+ "",
+ [
+ "#!/bin/bash -ex\n",
+ "# OPSCENTER NODE STARTUP \n",
+ "exec >/var/log/usergrid-bootstrap.log 2>&1\n",
+ "\n",
+ "mkdir -p /usr/share/usergrid\n",
+ "\n",
+ "# create script that sets our environment variables\n",
+ "cat >/etc/profile.d/usergrid-env.sh <<EOF\n",
+ "alias sudo='sudo -E'\n", "\n",
+ "export TYPE=opscenter\n",
+ "export STACK_NAME=", { "Ref":"AWS::StackName" }, "\n", "\n",
+ "export PUBLIC_HOSTNAME=`(curl -s http://169.254.169.254/latest/meta-data/public-hostname)`\n",
+ "export INTERNAL_HOSTNAME=`(curl http://169.254.169.254/latest/meta-data/local-ipv4)`\n",
+ "\n",
+ "export EC2_INSTANCE_ID=`ec2metadata --instance-id`\n",
+ "export EC2_REGION=", { "Ref":"AWS::Region" },
+ "\n",
+ "export EC2_URL=https://ec2.amazonaws.com/\n",
+ "\n",
+ "export OPSCENTER_SECURITY_GROUP_NAME=", { "Ref":"OpsCenterSecurityGroup" }, "\n",
+ "\n",
+ "\n",
+ "export CASSANDRA_CLUSTER_NAME=", { "Ref":"CassClusterName" }, "\n",
+ "export CASSANDRA_NUM_SERVERS=", { "Ref":"CassNumServers" }, "\n",
+ "export GRAPHITE_NUM_SERVERS=", { "Ref":"GraphiteNumServers" }, "\n",
+ "export CASSANDRA_KEYSPACE_NAME=usergrid", "\n",
+ "export CASSANDRA_REPLICATION_FACTOR=", { "Ref":"CassReplicationFactor" }, "\n",
+ "\n",
+ "export RELEASE_BUCKET=", { "Ref":"ReleaseBucket" }, "\n",
+ "\n",
+ "EOF\n",
+ "\n",
+ "# put AWS creds in environment\n",
+ "cat >/etc/profile.d/aws-credentials.sh <<EOF\n",
+ "export AWS_ACCESS_KEY=", { "Ref":"CassKey" }, "\n",
+ "export AWS_SECRET_KEY=", { "Fn::GetAtt":[ "CassKey", "SecretAccessKey" ] }, "\n",
+ "EOF\n",
+ "\n",
+ "# put AWS creds Priam's config file\n",
+ "cat >/etc/awscredential.properties <<EOF\n",
+ "AWSACCESSID=", { "Ref":"CassKey" }, "\n",
+ "AWSKEY=", { "Fn::GetAtt":[ "CassKey", "SecretAccessKey" ] },
+ "\n",
+ "EOF\n",
+ "\n",
+ "# setup s3cmd (will be installed by init script) \n",
+ "cat >/etc/s3cfg <<EOF\n",
+ "access_key=", { "Ref":"CassKey" }, "\n",
+ "secret_key=", { "Fn::GetAtt":[ "CassKey", "SecretAccessKey" ] },
+ "\n",
+ "EOF\n",
+ "chmod 644 /etc/s3cfg\n",
+ "ln -s /etc/s3cfg ~ubuntu/.s3cfg\n",
+ "ln -s /etc/s3cfg ~root/.s3cfg\n",
+ "\n",
+ "# download usergrid and init script bundle from S3\n",
+ "wget -O- -q http://s3tools.org/repo/deb-all/stable/s3tools.key | apt-key add -\n",
+ "wget -O/etc/apt/sources.list.d/s3tools.list http://s3tools.org/repo/deb-all/stable/s3tools.list\n",
+ "apt-get update\n",
+ "apt-get -y install s3cmd\n",
+ "cd /usr/share/usergrid\n",
+ "s3cmd --config=/etc/s3cfg get s3://", { "Ref":"ReleaseBucket" }, "/awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "tar xvf awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "rm -fr awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "chmod 755 ./init_instance/*.sh\n",
+ "cd ./init_instance\n",
+ "# init as an opscenter node \n",
+ "sh ./init_opscenter_server.sh\n"
+ ]
+ ]
+
+ }
+ },
+ "KeyName":{
+ "Ref":"KeyPair"
+ },
+ "ImageId":{
+ "Fn::FindInMap":[
+ "AWSRegionArch2AMI",
+ {
+ "Ref":"AWS::Region"
+ },
+ {
+ "Fn::FindInMap":[
+ "AWSInstanceType2Arch",
+ {
+ "Ref":"OpsCenterInstanceType"
+ },
+ "Arch"
+ ]
+ }
+ ]
+ },
+ "InstanceType":{
+ "Ref":"OpsCenterInstanceType"
+ },
+ "IamInstanceProfile":{
+ "Ref":"RootInstanceProfile"
+ },
+ "SecurityGroups":[
+ {
+ "Ref":"OpsCenterSecurityGroup"
+ }
+ ],
+
+ "BlockDeviceMappings": [
+ {
+ "DeviceName": "/dev/sdb",
+ "VirtualName": "ephemeral0"
+ },
+ {
+ "DeviceName": "/dev/sdc",
+ "VirtualName": "ephemeral1"
+ }
+ ]
+
+ }
+ },
+ "OpsCenterAutoScalingGroup": {
+ "Type": "AWS::AutoScaling::AutoScalingGroup",
+ "Version": "2014-07-24",
+ "Properties": {
+ "AvailabilityZones": [
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ1"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ2"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ3"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ4"
+ ]
+ }
+ ],
+ "LaunchConfigurationName": {
+ "Ref": "OpsCenterAutoScalingLaunchConfiguration"
+ },
+ "MinSize": {
+ "Ref": "OpsCenterNumServers"
+ },
+ "MaxSize": {
+ "Ref": "OpsCenterNumServers"
+ },
+ "NotificationConfiguration": {
+ "TopicARN": {
+ "Ref": "NotificationTopic"
+ },
+ "NotificationTypes": [
+ "autoscaling:EC2_INSTANCE_LAUNCH",
+ "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
+ "autoscaling:EC2_INSTANCE_TERMINATE",
+ "autoscaling:EC2_INSTANCE_TERMINATE_ERROR"
+ ]
+ }
+ }
+ },
+ "RestUser": {
+ "Type": "AWS::IAM::User",
+ "Properties": {
+ "Path": "/",
+ "Policies": [
+ {
+ "PolicyName": "root",
+ "PolicyDocument": {
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Action": "*",
+ "Resource": "*"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "RestKey": {
+ "Type": "AWS::IAM::AccessKey",
+ "Properties": {
+ "UserName": {
+ "Ref": "RestUser"
+ }
+ }
+ },
+ "CassUser": {
+ "Type": "AWS::IAM::User",
+ "Properties": {
+ "Path": "/",
+ "Policies": [
+ {
+ "PolicyName": "root",
+ "PolicyDocument": {
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Action": "*",
+ "Resource": "*"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "CassKey": {
+ "Type": "AWS::IAM::AccessKey",
+ "Properties": {
+ "UserName": {
+ "Ref": "CassUser"
+ }
+ }
+ },
+ "ESUser": {
+ "Type": "AWS::IAM::User",
+ "Properties": {
+ "Path": "/",
+ "Policies": [
+ {
+ "PolicyName": "root",
+ "PolicyDocument": {
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Action": "*",
+ "Resource": "*"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "ESKey": {
+ "Type": "AWS::IAM::AccessKey",
+ "Properties": {
+ "UserName": {
+ "Ref": "CassUser"
+ }
+ }
+ },
+ "CassAutoScalingLaunchConfiguration":{
+ "Type":"AWS::AutoScaling::LaunchConfiguration",
+ "Properties":{
+ "UserData":{
+ "Fn::Base64":{
+ "Fn::Join":[
+ "",
+ [
+ "#!/bin/bash -ex\n",
+ "# CASSANDRA NODE STARTUP \n",
+ "exec >/var/log/usergrid-bootstrap.log 2>&1\n",
+ "\n",
+ "mkdir -p /usr/share/usergrid\n",
+ "\n",
+ "# create script that sets our environment variables\n",
+ "cat >/etc/profile.d/usergrid-env.sh <<EOF\n",
+ "alias sudo='sudo -E'\n", "\n",
+ "export TYPE=cass\n",
+ "export STACK_NAME=", { "Ref":"AWS::StackName" }, "\n", "\n",
+ "export PUBLIC_HOSTNAME=`(curl -s http://169.254.169.254/latest/meta-data/public-hostname)`\n",
+ "export INTERNAL_HOSTNAME=`(curl http://169.254.169.254/latest/meta-data/local-ipv4)`\n",
+ "\n",
+ "export EC2_INSTANCE_ID=`ec2metadata --instance-id`\n",
+ "export EC2_REGION=", { "Ref":"AWS::Region" },
+ "\n",
+ "export EC2_URL=https://ec2.amazonaws.com/\n",
+ "\n",
+ "export CASS_SECURITY_GROUP_NAME=", { "Ref":"CassSecurityGroup" }, "\n",
+ "\n",
+ "\n",
+ "export CASSANDRA_CLUSTER_NAME=", { "Ref":"CassClusterName" }, "\n",
+ "export CASSANDRA_NUM_SERVERS=", { "Ref":"CassNumServers" }, "\n",
+ "export GRAPHITE_NUM_SERVERS=", { "Ref":"GraphiteNumServers" }, "\n",
+ "export CASSANDRA_KEYSPACE_NAME=usergrid", "\n",
+ "export CASSANDRA_REPLICATION_FACTOR=", { "Ref":"CassReplicationFactor" }, "\n",
+ "\n",
+ "export RELEASE_BUCKET=", { "Ref":"ReleaseBucket" }, "\n",
+ "\n",
+ "EOF\n",
+ "\n",
+ "# put AWS creds in environment\n",
+ "cat >/etc/profile.d/aws-credentials.sh <<EOF\n",
+ "export AWS_ACCESS_KEY=", { "Ref":"CassKey" }, "\n",
+ "export AWS_SECRET_KEY=", { "Fn::GetAtt":[ "CassKey", "SecretAccessKey" ] }, "\n",
+ "EOF\n",
+ "\n",
+ "# put AWS creds Priam's config file\n",
+ "cat >/etc/awscredential.properties <<EOF\n",
+ "AWSACCESSID=", { "Ref":"CassKey" }, "\n",
+ "AWSKEY=", { "Fn::GetAtt":[ "CassKey", "SecretAccessKey" ] },
+ "\n",
+ "EOF\n",
+ "\n",
+ "# setup s3cmd (will be installed by init script) \n",
+ "cat >/etc/s3cfg <<EOF\n",
+ "access_key=", { "Ref":"CassKey" }, "\n",
+ "secret_key=", { "Fn::GetAtt":[ "CassKey", "SecretAccessKey" ] },
+ "\n",
+ "EOF\n",
+ "chmod 644 /etc/s3cfg\n",
+ "ln -s /etc/s3cfg ~ubuntu/.s3cfg\n",
+ "ln -s /etc/s3cfg ~root/.s3cfg\n",
+ "\n",
+ "# download usergrid and init script bundle from S3\n",
+ "wget -O- -q http://s3tools.org/repo/deb-all/stable/s3tools.key | apt-key add -\n",
+ "wget -O/etc/apt/sources.list.d/s3tools.list http://s3tools.org/repo/deb-all/stable/s3tools.list\n",
+ "apt-get update\n",
+ "apt-get -y install s3cmd\n",
+ "cd /usr/share/usergrid\n",
+ "s3cmd --config=/etc/s3cfg get s3://", { "Ref":"ReleaseBucket" }, "/awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "tar xvf awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "rm -fr awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "chmod 755 ./init_instance/*.sh\n",
+ "cd ./init_instance\n",
+ "# init as a Cassandra node \n",
+ "sh ./init_db_server.sh\n"
+ ]
+ ]
+ }
+ },
+ "KeyName": {
+ "Ref": "KeyPair"
+ },
+ "ImageId": {
+ "Fn::FindInMap": [
+ "AWSRegionArch2AMI",
+ {
+ "Ref": "AWS::Region"
+ },
+ {
+ "Fn::FindInMap": [
+ "AWSInstanceType2Arch",
+ {
+ "Ref": "CassInstanceType"
+ },
+ "Arch"
+ ]
+ }
+ ]
+ },
+ "InstanceType": {
+ "Ref": "CassInstanceType"
+ },
+ "IamInstanceProfile": {
+ "Ref": "RootInstanceProfile"
+ },
+ "SecurityGroups": [
+ {
+ "Ref": "CassSecurityGroup"
+ }
+ ],
+
+ "BlockDeviceMappings": [
+ {
+ "DeviceName": "/dev/sdb",
+ "VirtualName": "ephemeral0"
+ },
+ {
+ "DeviceName": "/dev/sdc",
+ "VirtualName": "ephemeral1"
+ }
+ ]
+ }
+ },
+ "CassAutoScalingGroup": {
+ "Type": "AWS::AutoScaling::AutoScalingGroup",
+ "Version": "2009-05-15",
+ "Properties": {
+ "AvailabilityZones": [
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ1"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ2"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ3"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ4"
+ ]
+ }
+ ],
+ "LaunchConfigurationName": {
+ "Ref": "CassAutoScalingLaunchConfiguration"
+ },
+ "MinSize": {
+ "Ref": "CassNumServers"
+ },
+ "MaxSize": {
+ "Ref": "CassNumServers"
+ },
+ "NotificationConfiguration": {
+ "TopicARN": {
+ "Ref": "NotificationTopic"
+ },
+ "NotificationTypes": [
+ "autoscaling:EC2_INSTANCE_LAUNCH",
+ "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
+ "autoscaling:EC2_INSTANCE_TERMINATE",
+ "autoscaling:EC2_INSTANCE_TERMINATE_ERROR"
+ ]
+ }
+ }
+ },
+ "ESMasterAutoScalingLaunchConfiguration":{
+ "Type":"AWS::AutoScaling::LaunchConfiguration",
+ "Properties":{
+ "UserData":{
+ "Fn::Base64":{
+ "Fn::Join":[
+ "",
+ [
+ "#!/bin/bash -ex\n",
+ "# ES NODE STARTUP \n",
+ "exec >/var/log/usergrid-bootstrap.log 2>&1\n",
+ "\n",
+ "mkdir -p /usr/share/usergrid\n",
+ "\n",
+ "# create script that sets our environment variables\n",
+ "cat >/etc/profile.d/usergrid-env.sh <<EOF\n",
+ "alias sudo='sudo -E'\n", "\n",
+ "export TYPE=es\n",
+ "export STACK_NAME=", { "Ref":"AWS::StackName" }, "\n", "\n",
+ "export PUBLIC_HOSTNAME=`(curl -s http://169.254.169.254/latest/meta-data/public-hostname)`\n",
+ "export INTERNAL_HOSTNAME=`(curl http://169.254.169.254/latest/meta-data/local-ipv4)`\n",
+ "\n",
+ "export EC2_INSTANCE_ID=`ec2metadata --instance-id`\n",
+ "export EC2_REGION=", { "Ref":"AWS::Region" },
+ "\n",
+ "export EC2_URL=https://ec2.amazonaws.com/\n",
+ "\n",
+ "export ES_SECURITY_GROUP_NAME=", { "Ref":"ESSecurityGroup" }, "\n",
+ "\n",
+ "\n",
+ "export ES_CLUSTER_NAME=", { "Ref":"ESClusterName" }, "\n",
+ "export ES_NUM_SERVERS=", { "Ref":"ESNumServers" }, "\n",
+ "export ES_MASTER=true", "\n",
+
+ "export GRAPHITE_NUM_SERVERS=", { "Ref":"GraphiteNumServers" }, "\n",
+
+ "\n",
+ "export RELEASE_BUCKET=", { "Ref":"ReleaseBucket" }, "\n",
+ "\n",
+ "EOF\n",
+ "\n",
+ "# put AWS creds in environment\n",
+ "cat >/etc/profile.d/aws-credentials.sh <<EOF\n",
+ "export AWS_ACCESS_KEY=", { "Ref":"ESKey" }, "\n",
+ "export AWS_SECRET_KEY=", { "Fn::GetAtt":[ "ESKey", "SecretAccessKey" ] }, "\n",
+ "EOF\n",
+ "\n",
+ "# setup s3cmd (will be installed by init script) \n",
+ "cat >/etc/s3cfg <<EOF\n",
+ "access_key=", { "Ref":"ESKey" }, "\n",
+ "secret_key=", { "Fn::GetAtt":[ "ESKey", "SecretAccessKey" ] },
+ "\n",
+ "EOF\n",
+ "chmod 644 /etc/s3cfg\n",
+ "ln -s /etc/s3cfg ~ubuntu/.s3cfg\n",
+ "ln -s /etc/s3cfg ~root/.s3cfg\n",
+ "\n",
+ "# download usergrid and init script bundle from S3\n",
+ "wget -O- -q http://s3tools.org/repo/deb-all/stable/s3tools.key | apt-key add -\n",
+ "wget -O/etc/apt/sources.list.d/s3tools.list http://s3tools.org/repo/deb-all/stable/s3tools.list\n",
+ "apt-get update\n",
+ "apt-get -y install s3cmd\n",
+ "cd /usr/share/usergrid\n",
+ "s3cmd --config=/etc/s3cfg get s3://", { "Ref":"ReleaseBucket" }, "/awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "tar xvf awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "rm -fr awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "chmod 755 ./init_instance/*.sh\n",
+ "cd ./init_instance\n",
+ "# init as an ES node \n",
+ "sh ./init_es_server.sh\n"
+ ]
+ ]
+ }
+ },
+ "KeyName": {
+ "Ref": "KeyPair"
+ },
+ "ImageId": {
+ "Fn::FindInMap": [
+ "AWSRegionArch2AMI",
+ {
+ "Ref": "AWS::Region"
+ },
+ {
+ "Fn::FindInMap": [
+ "AWSInstanceType2Arch",
+ {
+ "Ref": "CassInstanceType"
+ },
+ "Arch"
+ ]
+ }
+ ]
+ },
+ "InstanceType": {
+ "Ref": "ESInstanceType"
+ },
+ "IamInstanceProfile": {
+ "Ref": "RootInstanceProfile"
+ },
+ "SecurityGroups": [
+ {
+ "Ref": "ESSecurityGroup"
+ }
+ ],
+
+ "BlockDeviceMappings": [
+ {
+ "DeviceName": "/dev/sdb",
+ "VirtualName": "ephemeral0"
+ },
+ {
+ "DeviceName": "/dev/sdc",
+ "VirtualName": "ephemeral1"
+ }
+ ]
+ }
+ },
+ "ESMasterAutoScalingGroup": {
+ "Type": "AWS::AutoScaling::AutoScalingGroup",
+ "Version": "2009-05-15",
+ "Properties": {
+ "AvailabilityZones": [
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ1"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ2"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ3"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ4"
+ ]
+ }
+ ],
+ "LaunchConfigurationName": {
+ "Ref": "ESMasterAutoScalingLaunchConfiguration"
+ },
+ "MinSize": {
+ "Ref": "ESNumMasterServers"
+ },
+ "MaxSize": {
+ "Ref": "ESNumMasterServers"
+ },
+ "NotificationConfiguration": {
+ "TopicARN": {
+ "Ref": "NotificationTopic"
+ },
+ "NotificationTypes": [
+ "autoscaling:EC2_INSTANCE_LAUNCH",
+ "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
+ "autoscaling:EC2_INSTANCE_TERMINATE",
+ "autoscaling:EC2_INSTANCE_TERMINATE_ERROR"
+ ]
+ }
+ }
+ },
+ "ESAutoScalingLaunchConfiguration":{
+ "Type":"AWS::AutoScaling::LaunchConfiguration",
+ "Properties":{
+ "UserData":{
+ "Fn::Base64":{
+ "Fn::Join":[
+ "",
+ [
+ "#!/bin/bash -ex\n",
+ "# ES NODE STARTUP \n",
+ "exec >/var/log/usergrid-bootstrap.log 2>&1\n",
+ "\n",
+ "mkdir -p /usr/share/usergrid\n",
+ "\n",
+ "# create script that sets our environment variables\n",
+ "cat >/etc/profile.d/usergrid-env.sh <<EOF\n",
+ "alias sudo='sudo -E'\n", "\n",
+ "export TYPE=es\n",
+ "export STACK_NAME=", { "Ref":"AWS::StackName" }, "\n", "\n",
+ "export PUBLIC_HOSTNAME=`(curl -s http://169.254.169.254/latest/meta-data/public-hostname)`\n",
+ "export INTERNAL_HOSTNAME=`(curl http://169.254.169.254/latest/meta-data/local-ipv4)`\n",
+ "\n",
+ "export EC2_INSTANCE_ID=`ec2metadata --instance-id`\n",
+ "export EC2_REGION=", { "Ref":"AWS::Region" },
+ "\n",
+ "export EC2_URL=https://ec2.amazonaws.com/\n",
+ "\n",
+ "export ES_SECURITY_GROUP_NAME=", { "Ref":"ESSecurityGroup" }, "\n",
+ "\n",
+ "\n",
+ "export ES_CLUSTER_NAME=", { "Ref":"ESClusterName" }, "\n",
+ "export ES_NUM_SERVERS=", { "Ref":"ESNumServers" }, "\n",
+ "export ES_MASTER=false","\n",
+ "export GRAPHITE_NUM_SERVERS=", { "Ref":"GraphiteNumServers" }, "\n",
+ "\n",
+ "export RELEASE_BUCKET=", { "Ref":"ReleaseBucket" }, "\n",
+ "\n",
+ "EOF\n",
+ "\n",
+ "# put AWS creds in environment\n",
+ "cat >/etc/profile.d/aws-credentials.sh <<EOF\n",
+ "export AWS_ACCESS_KEY=", { "Ref":"ESKey" }, "\n",
+ "export AWS_SECRET_KEY=", { "Fn::GetAtt":[ "ESKey", "SecretAccessKey" ] }, "\n",
+ "EOF\n",
+ "\n",
+ "# setup s3cmd (will be installed by init script) \n",
+ "cat >/etc/s3cfg <<EOF\n",
+ "access_key=", { "Ref":"ESKey" }, "\n",
+ "secret_key=", { "Fn::GetAtt":[ "ESKey", "SecretAccessKey" ] },
+ "\n",
+ "EOF\n",
+ "chmod 644 /etc/s3cfg\n",
+ "ln -s /etc/s3cfg ~ubuntu/.s3cfg\n",
+ "ln -s /etc/s3cfg ~root/.s3cfg\n",
+ "\n",
+ "# download usergrid and init script bundle from S3\n",
+ "wget -O- -q http://s3tools.org/repo/deb-all/stable/s3tools.key | apt-key add -\n",
+ "wget -O/etc/apt/sources.list.d/s3tools.list http://s3tools.org/repo/deb-all/stable/s3tools.list\n",
+ "apt-get update\n",
+ "apt-get -y install s3cmd\n",
+ "cd /usr/share/usergrid\n",
+ "s3cmd --config=/etc/s3cfg get s3://", { "Ref":"ReleaseBucket" }, "/awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "tar xvf awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "rm -fr awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "chmod 755 ./init_instance/*.sh\n",
+ "cd ./init_instance\n",
+ "# init as an ES node \n",
+ "sh ./init_es_server.sh\n"
+ ]
+ ]
+ }
+ },
+ "KeyName": {
+ "Ref": "KeyPair"
+ },
+ "ImageId": {
+ "Fn::FindInMap": [
+ "AWSRegionArch2AMI",
+ {
+ "Ref": "AWS::Region"
+ },
+ {
+ "Fn::FindInMap": [
+ "AWSInstanceType2Arch",
+ {
+ "Ref": "CassInstanceType"
+ },
+ "Arch"
+ ]
+ }
+ ]
+ },
+ "InstanceType": {
+ "Ref": "ESInstanceType"
+ },
+ "IamInstanceProfile": {
+ "Ref": "RootInstanceProfile"
+ },
+ "SecurityGroups": [
+ {
+ "Ref": "ESSecurityGroup"
+ }
+ ],
+
+ "BlockDeviceMappings": [
+ {
+ "DeviceName": "/dev/sdb",
+ "VirtualName": "ephemeral0"
+ },
+ {
+ "DeviceName": "/dev/sdc",
+ "VirtualName": "ephemeral1"
+ }
+ ]
+ }
+ },
+ "ESAutoScalingGroup": {
+ "Type": "AWS::AutoScaling::AutoScalingGroup",
+ "Version": "2009-05-15",
+ "Properties": {
+ "AvailabilityZones": [
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ1"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ2"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ3"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ4"
+ ]
+ }
+ ],
+ "LaunchConfigurationName": {
+ "Ref": "ESAutoScalingLaunchConfiguration"
+ },
+ "MinSize": {
+ "Ref": "ESNumServers"
+ },
+ "MaxSize": {
+ "Ref": "ESNumServers"
+ },
+ "NotificationConfiguration": {
+ "TopicARN": {
+ "Ref": "NotificationTopic"
+ },
+ "NotificationTypes": [
+ "autoscaling:EC2_INSTANCE_LAUNCH",
+ "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
+ "autoscaling:EC2_INSTANCE_TERMINATE",
+ "autoscaling:EC2_INSTANCE_TERMINATE_ERROR"
+ ]
+ }
+ }
+ },
+ "RestAutoScalingLaunchConfiguration":{
+ "Type":"AWS::AutoScaling::LaunchConfiguration",
+ "Properties":{
+ "UserData":{
+ "Fn::Base64":{
+ "Fn::Join":[
+ "",
+ [
+ "#!/bin/bash -ex\n",
+ "# REST SERVER STARTUP \n",
+ "exec >/var/log/usergrid-bootstrap.log 2>&1\n",
+ "\n",
+ "mkdir -p /usr/share/usergrid\n",
+ "\n",
+ "# create script that sets our environment variables\n",
+ "cat >/etc/profile.d/usergrid-env.sh <<EOF\n",
+ "alias sudo='sudo -E'\n",
+ "\n",
+ "export TYPE=rest\n",
+ "export STACK_NAME=", { "Ref":"AWS::StackName" }, "\n",
+ "export YOURKIT=", { "Ref":"InstallYourkit" }, "\n",
+ "export DNS_NAME=", { "Ref":"DnsSubDomain" }, "\n",
+ "export DNS_DOMAIN=", { "Ref":"DnsDomain" }, "\n",
+ "export PUBLIC_HOSTNAME=`(curl -s http://169.254.169.254/latest/meta-data/public-hostname)`\n",
+ "export INTERNAL_HOSTNAME=`(curl http://169.254.169.254/latest/meta-data/local-ipv4)`\n",
+ "export ELB_NAME=", { "Ref":"RestElasticLoadBalancer" }, "\n",
+ "\n",
+ "export EC2_INSTANCE_ID=`ec2metadata --instance-id`\n",
+ "export EC2_REGION=", { "Ref":"AWS::Region" }, "\n",
+ "export EC2_URL=https://ec2.amazonaws.com/\n", "\n",
+ "export REST_SECURITY_GROUP_NAME=", { "Ref":"RestSecurityGroup" }, "\n",
+ "export DB_SECURITY_GROUP_NAME=", { "Ref":"CassSecurityGroup" }, "\n",
+ "\n",
+ "export CASSANDRA_CLUSTER_NAME=", { "Ref":"CassClusterName" }, "\n",
+ "export CASSANDRA_KEYSPACE_NAME=usergrid", "\n",
+ "export CASSANDRA_NUM_SERVERS=", { "Ref":"CassNumServers" }, "\n",
+ "export GRAPHITE_NUM_SERVERS=", { "Ref":"GraphiteNumServers" }, "\n",
+ "export TOMCAT_NUM_SERVERS=", { "Ref":"RestMinServers" }, "\n",
+ "\n",
+ "export CASSANDRA_REPLICATION_FACTOR=", { "Ref":"CassReplicationFactor" }, "\n",
+ "\n",
+ "export CASSANDRA_READ_CONSISTENCY=", { "Ref":"CassReadConsistency" }, "\n",
+ "\n",
+ "export CASSANDRA_WRITE_CONSISTENCY=", { "Ref":"CassWriteConsistency" }, "\n",
+ "\n",
+ "export INDEX_WORKER_COUNT=", { "Ref":"RestIndexWorkers" }, "\n",
+
+ "export ES_CLUSTER_NAME=", { "Ref":"ESClusterName" }, "\n",
+ "export ES_NUM_SERVERS=", { "Ref":"ESNumServers" }, "\n",
+ "\n",
+ "export RELEASE_BUCKET=", { "Ref":"ReleaseBucket" }, "\n",
+ "\n",
+ "export NUM_THREAD_PROC=", { "Ref":"TomcatThreadsPerCore" }, "\n",
+ "\n",
+ "export SUPER_USER_EMAIL=", { "Ref":"SuperUserEmail" }, "\n",
+ "export TEST_ADMIN_USER_EMAIL=", { "Ref":"TestAdminUserEmail" }, "\n",
+ "\n",
+ "EOF\n",
+ "\n",
+ "# put AWS creds in environment\n",
+ "cat >/etc/profile.d/aws-credentials.sh <<EOF\n",
+ "export AWS_ACCESS_KEY=", { "Ref":"RestKey" }, "\n",
+ "export AWS_SECRET_KEY=", { "Fn::GetAtt":[ "RestKey", "SecretAccessKey" ] }, "\n",
+ "EOF\n",
+ "\n",
+ "# setup s3cmd (will be installed by init script) \n",
+ "cat >/etc/s3cfg <<EOF\n",
+ "access_key=", { "Ref":"RestKey" }, "\n",
+ "secret_key=", { "Fn::GetAtt":[ "RestKey", "SecretAccessKey" ] }, "\n",
+ "EOF\n",
+ "chmod 644 /etc/s3cfg\n",
+ "ln -s /etc/s3cfg ~ubuntu/.s3cfg\n",
+ "ln -s /etc/s3cfg ~root/.s3cfg\n",
+ "\n",
+ "# download usergrid and init script bundle from S3\n",
+ "wget -O- -q http://s3tools.org/repo/deb-all/stable/s3tools.key | apt-key add -\n",
+ "wget -O/etc/apt/sources.list.d/s3tools.list http://s3tools.org/repo/deb-all/stable/s3tools.list\n",
+ "apt-get update\n",
+ "apt-get -y install s3cmd\n",
+ "cd /usr/share/usergrid\n",
+ "s3cmd --config=/etc/s3cfg get s3://", {"Ref": "ReleaseBucket"}, "/awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "s3cmd --config=/etc/s3cfg get s3://", {"Ref": "ReleaseBucket"}, "/ROOT.war\n",
+ "tar xvf awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "rm -fr awscluster-1.0-SNAPSHOT.tar.gz\n",
+ "mv ROOT.war webapps/ROOT.war\n",
+ "chmod 755 ./init_instance/*.sh\n",
+ "cd ./init_instance\n",
+ "# Init as a REST intance \n",
+ "sh ./init_rest_server.sh\n"
+ ]
+ ]
+ }
+ },
+ "KeyName":{
+ "Ref":"KeyPair"
+ },
+ "ImageId":{
+ "Fn::FindInMap":[
+ "AWSRegionArch2AMI",
+ {
+ "Ref":"AWS::Region"
+ },
+ {
+ "Fn::FindInMap":[
+ "AWSInstanceType2Arch",
+ {
+ "Ref":"RestInstanceType"
+ },
+ "Arch"
+ ]
+ }
+ ]
+ },
+ "InstanceType":{
+ "Ref":"RestInstanceType"
+ },
+ "IamInstanceProfile":{
+ "Ref":"RootInstanceProfile"
+ },
+ "SecurityGroups":[
+ {
+ "Ref":"RestSecurityGroup"
+ }
+ ]
+ }
+ },
+ "RestAutoScalingGroup": {
+ "Type": "AWS::AutoScaling::AutoScalingGroup",
+ "Version": "2009-05-15",
+ "Properties": {
+ "AvailabilityZones": [
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ1"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ2"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ3"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ4"
+ ]
+ }
+ ],
+ "LaunchConfigurationName": {
+ "Ref": "RestAutoScalingLaunchConfiguration"
+ },
+ "MinSize": {
+ "Ref": "RestMinServers"
+ },
+ "MaxSize": {
+ "Ref": "RestMaxServers"
+ },
+ "HealthCheckType": "ELB",
+ "HealthCheckGracePeriod": "1800",
+ "LoadBalancerNames": [
+ {
+ "Ref": "RestElasticLoadBalancer"
+ }
+ ],
+ "NotificationConfiguration": {
+ "TopicARN": {
+ "Ref": "NotificationTopic"
+ },
+ "NotificationTypes": [
+ "autoscaling:EC2_INSTANCE_LAUNCH",
+ "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
+ "autoscaling:EC2_INSTANCE_TERMINATE",
+ "autoscaling:EC2_INSTANCE_TERMINATE_ERROR"
+ ]
+ }
+ }
+ },
+ "RestServerScaleUpPolicy": {
+ "Type": "AWS::AutoScaling::ScalingPolicy",
+ "Properties": {
+ "AdjustmentType": "ChangeInCapacity",
+ "AutoScalingGroupName": {
+ "Ref": "RestAutoScalingGroup"
+ },
+ "Cooldown": "60",
+ "ScalingAdjustment": "1"
+ }
+ },
+ "RestServerScaleDownPolicy": {
+ "Type": "AWS::AutoScaling::ScalingPolicy",
+ "Properties": {
+ "AdjustmentType": "ChangeInCapacity",
+ "AutoScalingGroupName": {
+ "Ref": "RestAutoScalingGroup"
+ },
+ "Cooldown": "60",
+ "ScalingAdjustment": "-1"
+ }
+ },
+ "CPUAlarmHigh": {
+ "Type": "AWS::CloudWatch::Alarm",
+ "Properties": {
+ "AlarmDescription": "Scale-up if CPU > 60% for 10 minutes",
+ "MetricName": "CPUUtilization",
+ "Namespace": "AWS/EC2",
+ "Statistic": "Average",
+ "Period": "600",
+ "EvaluationPeriods": "2",
+ "Threshold": "60",
+ "AlarmActions": [
+ {
+ "Ref": "RestServerScaleUpPolicy"
+ }
+ ],
+ "Dimensions": [
+ {
+ "Name": "AutoScalingGroupName",
+ "Value": {
+ "Ref": "RestAutoScalingGroup"
+ }
+ }
+ ],
+ "ComparisonOperator": "GreaterThanThreshold"
+ }
+ },
+ "CPUAlarmLow": {
+ "Type": "AWS::CloudWatch::Alarm",
+ "Properties": {
+ "AlarmDescription": "Scale-down if CPU < 10% for 10 minutes",
+ "MetricName": "CPUUtilization",
+ "Namespace": "AWS/EC2",
+ "Statistic": "Average",
+ "Period": "600",
+ "EvaluationPeriods": "2",
+ "Threshold": "10",
+ "AlarmActions": [
+ {
+ "Ref": "RestServerScaleDownPolicy"
+ }
+ ],
+ "Dimensions": [
+ {
+ "Name": "AutoScalingGroupName",
+ "Value": {
+ "Ref": "RestAutoScalingGroup"
+ }
+ }
+ ],
+ "ComparisonOperator": "LessThanThreshold"
+ }
+ },
+ "RestElasticLoadBalancer": {
+ "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
+ "Properties": {
+ "AvailabilityZones": [
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ1"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ2"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ3"
+ ]
+ },
+ {
+ "Fn::FindInMap": [
+ "FourAZs",
+ {
+ "Ref": "AWS::Region"
+ },
+ "AZ4"
+ ]
+ }
+ ],
+ "Listeners": [
+ {
+ "LoadBalancerPort": "80",
+ "InstancePort": "8080",
+ "Protocol": "HTTP"
+ }
+ ],
+ "HealthCheck": {
+ "Target": "HTTP:8080/status",
+ "HealthyThreshold": "2",
+ "UnhealthyThreshold": "8",
+ "Interval": "10",
+ "Timeout": "5"
+ },
+ "CrossZone": "true"
+ }
+ },
+ "NotificationTopic": {
+ "Type": "AWS::SNS::Topic",
+ "Properties": {
+ "Subscription": [
+ {
+ "Endpoint": {
+ "Ref": "NotificationEmail"
+ },
+ "Protocol": "email"
+ }
+ ]
+ }
+ },
+ "DnsRecord": {
+ "Type": "AWS::Route53::RecordSetGroup",
+ "Properties": {
+ "HostedZoneName": {
+ "Fn::Join": [
+ ".",
+ [
+ {
+ "Ref": "DnsDomain"
+ },
+ ""
+ ]
+ ]
+ },
+ "RecordSets": [
+ {
+ "Name": {
+ "Fn::Join": [
+ ".",
+ [
+ {
+ "Ref": "DnsSubDomain"
+ },
+ {
+ "Ref": "DnsDomain"
+ }
+ ]
+ ]
+ },
+ "Type": "A",
+ "AliasTarget": {
+ "HostedZoneId": {
+ "Fn::GetAtt": [
+ "RestElasticLoadBalancer",
+ "CanonicalHostedZoneNameID"
+ ]
+ },
+ "DNSName": {
+ "Fn::GetAtt": [
+ "RestElasticLoadBalancer",
+ "CanonicalHostedZoneName"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ },
+ "RootRole": {
+ "Type": "AWS::IAM::Role",
+ "Properties": {
+ "AssumeRolePolicyDocument": {
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Principal": {
+ "Service": [
+ "ec2.amazonaws.com"
+ ]
+ },
+ "Action": [
+ "sts:AssumeRole"
+ ]
+ }
+ ]
+ },
+ "Path": "/"
+ }
+ },
+ "RolePolicies": {
+ "Type": "AWS::IAM::Policy",
+ "Properties": {
+ "PolicyName": "root",
+ "PolicyDocument": {
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Action": "*",
+ "Resource": "*"
+ }
+ ]
+ },
+ "Roles": [
+ {
+ "Ref": "RootRole"
+ }
+ ]
+ }
+ },
+ "RootInstanceProfile": {
+ "Type": "AWS::IAM::InstanceProfile",
+ "Properties": {
+ "Path": "/",
+ "Roles": [
+ {
+ "Ref": "RootRole"
+ }
+ ]
+ }
+ },
+ "ESSecurityGroup": {
+ "Type": "AWS::EC2::SecurityGroup",
+ "Properties": {
+ "GroupDescription": "ElasticSearch Machines",
+ "SecurityGroupIngress": [
+ {
+ "IpProtocol": "tcp",
+ "FromPort": "22",
+ "ToPort": "22",
+ "CidrIp": "0.0.0.0/0"
+ },
+
+ {
+ "IpProtocol": "tcp",
+ "FromPort": "9200",
+ "ToPort": "9200",
+ "CidrIp": "0.0.0.0/0"
+ }
+ ]
+ }
+ },
+ "AllowCassToESOnAllPorts": {
+ "Type": "AWS::EC2::SecurityGroupIngress",
+ "Properties": {
+ "GroupName": {
+ "Ref": "ESSecurityGroup"
+ },
+ "IpProtocol": "tcp",
+ "FromPort": "1",
+ "ToPort": "65535",
+ "SourceSecurityGroupName": {
+ "Ref": "CassSecurityGroup"
+ }
+ }
+ },
+ "AllowRestToESOnAllPorts": {
+ "Type": "AWS::EC2::SecurityGroupIngress",
+ "Properties": {
+ "GroupName": {
+ "Ref": "ESSecurityGroup"
+ },
+ "IpProtocol": "tcp",
+ "FromPort": "1",
+ "ToPort": "65535",
+ "SourceSecurityGroupName": {
+ "Ref": "RestSecurityGroup"
+ }
+ }
+ },
+ "CassSecurityGroup": {
+ "Type": "AWS::EC2::SecurityGroup",
+ "Properties": {
+ "GroupDescription": "Database Machines",
+ "SecurityGroupIngress": [
+ {
+ "IpProtocol": "tcp",
+ "FromPort": "22",
+ "ToPort": "22",
+ "CidrIp": "0.0.0.0/0"
+ }
+ ]
+ }
+ },
+ "AllowCassToCassOnAllPorts": {
+ "Type": "AWS::EC2::SecurityGroupIngress",
+ "Properties": {
+ "GroupName": {
+ "Ref": "CassSecurityGroup"
+ },
+ "IpProtocol": "tcp",
+ "FromPort": "1",
+ "ToPort": "65535",
+ "SourceSecurityGroupName": {
+ "Ref": "CassSecurityGroup"
+ }
+ }
+ },
+ "AllowESToCassOnAllPorts": {
+ "Type": "AWS::EC2::SecurityGroupIngress",
+ "Properties": {
+ "GroupName": {
+ "Ref": "CassSecurityGroup"
+ },
+ "IpProtocol": "tcp",
+ "FromPort": "1",
+ "ToPort": "65535",
+ "SourceSecurityGroupName": {
+ "Ref": "ESSecurityGroup"
+ }
+ }
+ },
+ "AllowESToESOnAllPorts": {
+ "Type": "AWS::EC2::SecurityGroupIngress",
+ "Properties": {
+ "GroupName": {
+ "Ref": "ESSecurityGroup"
+ },
+ "IpProtocol": "tcp",
+ "FromPort": "1",
+ "ToPort": "65535",
+ "SourceSecurityGroupName": {
+ "Ref": "ESSecurityGroup"
+ }
+ }
+ },
+ "AllowRestToCassOnAllPorts": {
+ "Type": "AWS::EC2::SecurityGroupIngress",
+ "Properties": {
+ "GroupName": {
+ "Ref": "CassSecurityGroup"
+ },
+ "IpProtocol": "tcp",
+ "FromPort": "1",
+ "ToPort": "65535",
+ "SourceSecurityGroupName": {
+ "Ref": "RestSecurityGroup"
+ }
+ }
+ },
+ "AllowCassToRestOnAllPorts": {
+ "Type": "AWS::EC2::SecurityGroupIngress",
+ "Properties": {
+ "GroupName": {
+ "Ref": "RestSecurityGroup"
+ },
+ "IpProtocol": "tcp",
+ "FromPort": "0",
+ "ToPort": "65535",
+ "SourceSecurityGroupName": {
+ "Ref": "CassSecurityGroup"
+ }
+ }
+ },
+ "AllowESToRestOnAllPorts": {
+ "Type": "AWS::EC2::SecurityGroupIngress",
+ "Properties": {
+ "GroupName": {
+ "Ref": "RestSecurityGroup"
+ },
+ "IpProtocol": "tcp",
+ "FromPort": "0",
+ "ToPort": "65535",
+ "SourceSecurityGroupName": {
+ "Ref": "ESSecurityGroup"
+ }
+ }
+ },
+ "AllowCassToCassOnAllPorts": {
+ "Type": "AWS::EC2::SecurityGroupIngress",
+ "Properties": {
+ "GroupName": {
+ "Ref": "CassSecurityGroup"
+ },
+ "IpProtocol": "tcp",
+ "FromPort": "0",
+ "ToPort": "65535",
+ "SourceSecurityGroupName": {
+ "Ref": "CassSecurityGroup"
+ }
+ }
+ },
+ "AllowOpsCenterToCassOnAllPorts": {
+ "Type": "AWS::EC2::SecurityGroupIngress",
+ "Properties": {
+ "GroupName": {
+ "Ref": "CassSecurityGroup"
+ },
+ "IpProtocol": "tcp",
+ "FromPort": "1",
+ "ToPort": "65535",
+ "SourceSecurityGroupName": {
+ "Ref": "OpsCenterSecurityGroup"
+ }
+ }
+ },
+
+ "RestSecurityGroup": {
+ "Type": "AWS::EC2::SecurityGroup",
+ "Properties": {
+ "GroupDescription": "REST Machines",
+ "SecurityGroupIngress": [
+ {
+ "IpProtocol": "tcp",
+ "FromPort": "22",
+ "ToPort": "22",
+ "CidrIp": "0.0.0.0/0"
+ },
+ {
+ "IpProtocol": "tcp",
+ "FromPort": "8080",
+ "ToPort": "8080",
+ "CidrIp": "0.0.0.0/0"
+ }
+ ]
+ }
+ },
+ "GraphiteSecurityGroup": {
+ "Type": "AWS::EC2::SecurityGroup",
+ "Properties": {
+ "GroupDescription": "Graphic Machines",
+ "SecurityGroupIngress": [
+ {
+ "IpProtocol": "tcp",
+ "FromPort": "22",
+ "ToPort": "22",
+ "CidrIp": "0.0.0.0/0"
+ },
+ {
+ "IpProtocol": "tcp",
+ "FromPort": "80",
+ "ToPort": "80",
+ "CidrIp": "0.0.0.0/0"
+ }
+ ]
+ }
+ },
+ "AllowESToGraphiteAllPorts": {
+ "Type": "AWS::EC2::SecurityGroupIngress",
+ "Properties": {
+ "GroupName": {
+ "Ref": "GraphiteSecurityGroup"
+ },
+ "IpProtocol": "tcp",
+ "FromPort": "0",
+ "ToPort": "65535",
+ "SourceSecurityGroupName": {
+ "Ref": "ESSecurityGroup"
+ }
+ }
+ },
+ "AllowCassToGraphiteAllPorts": {
+ "Type": "AWS::EC2::SecurityGroupIngress",
+ "Properties": {
+ "GroupName": {
+ "Ref": "GraphiteSecurityGroup"
+ },
+ "IpProtocol": "tcp",
+ "FromPort": "0",
+ "ToPort": "65535",
+ "SourceSecurityGroupName": {
+ "Ref": "CassSecurityGroup"
+ }
+ }
+ },
+ "AllowRestToGraphiteAllPorts": {
+ "Type": "AWS::EC2::SecurityGroupIngress",
+ "Properties": {
+ "GroupName": {
+ "Ref": "GraphiteSecurityGroup"
+ },
+ "IpProtocol": "tcp",
+ "FromPort": "0",
+ "ToPort": "65535",
+ "SourceSecurityGroupName": {
+ "Ref": "RestSecurityGroup"
+ }
+ }
+ },
+ "OpsCenterSecurityGroup": {
+ "Type": "AWS::EC2::SecurityGroup",
+ "Properties": {
+ "GroupDescription": "Opscenter Machines",
+ "SecurityGroupIngress": [
+ {
+ "IpProtocol": "tcp",
+ "FromPort": "22",
+ "ToPort": "22",
+ "CidrIp": "0.0.0.0/0"
+ },
+ {
+ "IpProtocol": "tcp",
+ "FromPort": "8888",
+ "ToPort": "8888",
+ "CidrIp": "0.0.0.0/0"
+ }
+ ]
+ }
+ },
+ "AllowCassToOpscenterAllPorts": {
+ "Type": "AWS::EC2::SecurityGroupIngress",
+ "Properties": {
+ "GroupName": {
+ "Ref": "OpsCenterSecurityGroup"
+ },
+ "IpProtocol": "tcp",
+ "FromPort": "0",
+ "ToPort": "65535",
+ "SourceSecurityGroupName": {
+ "Ref": "CassSecurityGroup"
+ }
+ }
+ }
+
+ }
+}