(ns my-infra.template (:require [cuerdas.core :as str])) (defn process-lines [cb s] ((comp #(str/join "\n" %) cb #(str/split % "\n")) s)) (defn remove-margin ([s] (remove-margin s "|")) ([s margin-indicator] (process-lines (fn [it] (eduction (map str/trim) (map #(str/trim % margin-indicator)) it)) s))) (defmacro demargin [str] (if (and (seq? str) (= (first str) 'str)) (cons (first str) (map (fn [it] (cond (string? it) (remove-margin it) true it)) (rest str))) (remove-margin str))) (demargin "cluster_name: ${CassandraCluster} |num_tokens: 256 |hinted_handoff_enabled: true |max_hint_window_in_ms: 10800000 |hinted_handoff_throttle_in_kb: 1024 |max_hints_delivery_threads: 2 |authenticator: AllowAllAuthenticator |authorizer: AllowAllAuthorizer |permissions_validity_in_ms: 2000 |partitioner: org.apache.cassandra.dht.Murmur3Partitioner |data_file_directories: | - /var/lib/cassandra/data |commitlog_directory: /var/lib/cassandra/commitlog |disk_failure_policy: stop |key_cache_size_in_mb: |key_cache_save_period: 14400 |row_cache_size_in_mb: 0 |row_cache_save_period: 0 |saved_caches_directory: /var/lib/cassandra/saved_caches |commitlog_sync: periodic |commitlog_sync_period_in_ms: 10000 |commitlog_segment_size_in_mb: 32 |seed_provider: | - class_name: org.apache.cassandra.locator.SimpleSeedProvider | parameters: | - seeds: cassandra-seed-1.${AWS::StackName}.${AWS::Region}.cjconfig,cassandra-seed-2.${AWS::StackName}.${AWS::Region}.cjconfig |concurrent_reads: 32 |concurrent_writes: 32 |trickle_fsync: false |trickle_fsync_interval_in_kb: 10240 |storage_port: 7000 |ssl_storage_port: 7001 |listen_address: ${CassandraSeedNetworkInterfaceAz1.PrimaryPrivateIpAddress} |start_native_transport: true |native_transport_port: 9042 |start_rpc: true |rpc_address: ${CassandraSeedNetworkInterfaceAz1.PrimaryPrivateIpAddress} |rpc_port: 9160 |rpc_keepalive: true |rpc_server_type: sync |thrift_framed_transport_size_in_mb: 15 |incremental_backups: false |snapshot_before_compaction: false |auto_snapshot: true |tombstone_warn_threshold: 1000 |tombstone_failure_threshold: 100000 |column_index_size_in_kb: 64 |compaction_throughput_mb_per_sec: 16 |read_request_timeout_in_ms: 5000 |range_request_timeout_in_ms: 10000 |write_request_timeout_in_ms: 2000 |cas_contention_timeout_in_ms: 1000 |truncate_request_timeout_in_ms: 60000 |request_timeout_in_ms: 10000 |cross_node_timeout: false |endpoint_snitch: Ec2Snitch |dynamic_snitch_update_interval_in_ms: 100 |dynamic_snitch_reset_interval_in_ms: 600000 |dynamic_snitch_badness_threshold: 0.1 |request_scheduler: org.apache.cassandra.scheduler.NoScheduler |server_encryption_options: | internode_encryption: none | keystore: conf/.keystore | keystore_password: cassandra | truststore: conf/.truststore | truststore_password: cassandra |client_encryption_options: | enabled: false | keystore: conf/.keystore | keystore_password: cassandra |internode_compression: all |inter_dc_tcp_nodelay: false |hints_directory: /var/lib/cassandra/hints |auto_bootstrap: false") #_ (drop-while #(and (not= % \|) (while) " |") ) (defn cassandra-seed-instance [name dns-resource network-interface-id key-pair other-seed] {"Type" "AWS::EC2::Instance", "DependsOn" dns-resource, "Properties" {"Tags" [{"Key" "Name", "Value" name}], "NetworkInterfaces" [{"DeviceIndex" 0,"NetworkInterfaceId" network-interface-id}], "InstanceType" {"Ref" "InstanceType"}, "KeyName" key-pair, "ImageId" {"Fn::FindInMap" ["AMI" {"Ref" "AWS::Region"} "ami"]}, "BlockDeviceMappings" [{"DeviceName" "/dev/sdb","Ebs" {"VolumeSize" 2048,"VolumeType" "gp2","DeleteOnTermination" false}} {"DeviceName" "/dev/sdg","Ebs" {"VolumeSize" 512,"VolumeType" "gp2","DeleteOnTermination" false}}], "UserData" {"Fn::Base64" {"Fn::Sub" (demargin (str "#!/usr/bin/env bash\nset -evx -u -o pipefail\n\nyum update -y\n\n/opt/aws/bin/cfn-init -v \\ | --stack=${AWS::StackId} \\ | --resource=" name " \\ | --region=${AWS::Region} \\ | | -c cassandra_setup\n\nsleep 20\nservice cassandra status\nCASS_EXIT=$?\n\n/opt/aws/bin/cfn-signal \\ | --stack=${AWS::StackId} \\ | --resource=" name "\\ | --region=${AWS::Region} \\ | --exit-code=$CASS_EXIT \\ | --reason='" name " initialization complete'"))}}}, "CreationPolicy" {"ResourceSignal" {"Timeout" "PT15M"}}, "Metadata" {"AWS::CloudFormation::Init" {"configSets" {"cassandra_setup" ["configure_yum" "install_packages" "configure_hosts" "configure_hard_drive" "configure_cassandra"]}, "configure_yum" {"files" {"/etc/yum.repos.d/cassandra.repo" {"content" "[cassandra]\nname=Apache Cassandra\nbaseurl=https://www.apache.org/dist/cassandra/redhat/311x/\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://www.apache.org/dist/cassandra/KEYS\n"}}}, "install_packages" {"commands" {"01-install-java-8" {"command" "yum install -y java-1.8.0"}, "02-remove-java-7" {"command" "yum remove -y java-1.7.0-openjdk"}, "03-install-cassandra" {"command" "yum install -y cassandra"}}}, "configure_hosts" {"commands" {"01-create-hosts-entry-on-boot" {"command" "echo \"`curl -s http://169.254.169.254/latest/meta-data/local-ipv4` `hostname`\" >> /etc/hosts","test" "test ! -f .create-hosts-entry-semaphore"}, "02-signal_startup_complete" {"command" "touch .create-hosts-entry-semaphore"}}}, "configure_hard_drive" {"commands" {"00-install-xfs-programs" {"command" "yum install -y xfsprogs"}, "01-create-file-system-on-ebs-volume-1" {"command" "mkfs.xfs -s size=4096 /dev/sdb"}, "01-create-file-system-on-ebs-volume-2" {"command" "mkfs.xfs -s size=4096 /dev/sdg"}, "02-setup-fstab-1" {"command" "echo \"/dev/sdb /var/lib/cassandra/data xfs defaults,nofail 0 0\" >> /etc/fstab"}, "02-setup-fstab-2" {"command" "echo \"/dev/sdg /var/lib/cassandra/commitlog xfs defaults,nofail 0 0\" >> /etc/fstab"}, "03-mount-all" {"command" "mount -a"}}}, "configure_cassandra" {"files" {"/etc/cassandra/default.conf/cassandra.yaml" {"content" {"Fn::Sub" (demargin (str "TODO"))}, "mode" 420, "owner" "cassandra", "group" "cassandra"}}, "commands" {"00-chown-for-cassandra-data" {"command" "chown -R cassandra:cassandra /var/lib/cassandra/data"}, "01-chown-for-cassandra-commitlog" {"command" "chown -R cassandra:cassandra /var/lib/cassandra/commitlog"}}, "services" {"sysvinit" {"cassandra" {"enabled" true, "ensureRunning" true}}}}}}}) (def cassandra-seed-az-1 {:instance (cassandra-seed-instance "CassandraSeedAz1" "CassandraSeedAz1DNS" {"Ref" "CassandraSeedNetworkInterfaceAz1"} {"Ref" "Ec2KeyPair"} "CassandraSeedAz2") :dns {"Type" "AWS::Route53::RecordSet", "Properties" {"HostedZoneId" {"Ref" "CassandraHostedZone"}, "Comment" "Cassandra Seed Az1 Record", "Name" {"Fn::Sub" "cassandra-seed-1.${AWS::StackName}.${AWS::Region}.cjconfig"}, "Type" "A", "TTL" 30, "ResourceRecords" [{"Fn::GetAtt" ["CassandraSeedNetworkInterfaceAz1" "PrimaryPrivateIpAddress"]}]}}}) (def cassandra-seed-az-2 {:instance {"Type" "AWS::EC2::Instance", "DependsOn" "CassandraSeedAz2DNS", "Properties" {"NetworkInterfaces" [{"DeviceIndex" 0,"NetworkInterfaceId" {"Ref" "CassandraSeedNetworkInterfaceAz2"}}], "InstanceType" {"Ref" "InstanceType"}, "KeyName" {"Ref" "Ec2KeyPair"}, "ImageId" {"Fn::FindInMap" ["AMI" {"Ref" "AWS::Region"} "ami"]}, "BlockDeviceMappings" [{"DeviceName" "/dev/sdb","Ebs" {"VolumeSize" 2048,"VolumeType" "gp2","DeleteOnTermination" false}} {"DeviceName" "/dev/sdg","Ebs" {"VolumeSize" 512,"VolumeType" "gp2","DeleteOnTermination" false}}], "Tags" [{"Key" "Name", "Value" "CassandraSeedAz2"}], "UserData" {"Fn::Base64" {"Fn::Sub" "#!/usr/bin/env bash\nset -evx -u -o pipefail\n\nyum update -y\n\n/opt/aws/bin/cfn-init -v \\\n --stack=${AWS::StackId} \\\n --resource=CassandraSeedAz2 \\\n --region=${AWS::Region} \\\n -c cassandra_setup\n\nsleep 20\nservice cassandra status\nCASS_EXIT=$?\n\n/opt/aws/bin/cfn-signal \\\n --stack=${AWS::StackId} \\\n --resource=CassandraSeedAz2 \\\n --region=${AWS::Region} \\\n --exit-code=$CASS_EXIT \\\n --reason='CassandraSeedAz2 initialization complete'\n"}}}, "CreationPolicy" {"ResourceSignal" {"Timeout" "PT15M"}}, "Metadata" {"AWS::CloudFormation::Init" {"configSets" {"cassandra_setup" ["configure_yum" "install_packages" "configure_hosts" "configure_hard_drive" "configure_cassandra"]}, "configure_yum" {"files" {"/etc/yum.repos.d/cassandra.repo" {"content" "[cassandra]\nname=Apache Cassandra\nbaseurl=https://www.apache.org/dist/cassandra/redhat/311x/\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://www.apache.org/dist/cassandra/KEYS\n"}}}, "install_packages" {"commands" {"01-install-java-8" {"command" "yum install -y java-1.8.0"}, "02-remove-java-7" {"command" "yum remove -y java-1.7.0-openjdk"}, "03-install-cassandra" {"command" "yum install -y cassandra"}}}, "configure_hosts" {"commands" {"01-create-hosts-entry-on-boot" {"command" "echo \"`curl -s http://169.254.169.254/latest/meta-data/local-ipv4` `hostname`\" >> /etc/hosts","test" "test ! -f .create-hosts-entry-semaphore"}, "02-signal_startup_complete" {"command" "touch .create-hosts-entry-semaphore"}}}, "configure_hard_drive" {"commands" {"00-install-xfs-programs" {"command" "yum install -y xfsprogs"}, "01-create-file-system-on-ebs-volume-1" {"command" "mkfs.xfs -s size=4096 /dev/sdb"}, "01-create-file-system-on-ebs-volume-2" {"command" "mkfs.xfs -s size=4096 /dev/sdg"}, "02-setup-fstab-1" {"command" "echo \"/dev/sdb /var/lib/cassandra/data xfs defaults,nofail 0 0\" >> /etc/fstab"}, "02-setup-fstab-2" {"command" "echo \"/dev/sdg /var/lib/cassandra/commitlog xfs defaults,nofail 0 0\" >> /etc/fstab"}, "03-mount-all" {"command" "mount -a"}}}, "configure_cassandra" {"files" {"/etc/cassandra/default.conf/cassandra.yaml" {"content" {"Fn::Sub" "cluster_name: ${CassandraCluster}\nnum_tokens: 256\nhinted_handoff_enabled: true\nmax_hint_window_in_ms: 10800000\nhinted_handoff_throttle_in_kb: 1024\nmax_hints_delivery_threads: 2\nauthenticator: AllowAllAuthenticator\nauthorizer: AllowAllAuthorizer\npermissions_validity_in_ms: 2000\npartitioner: org.apache.cassandra.dht.Murmur3Partitioner\ndata_file_directories:\n - /var/lib/cassandra/data\ncommitlog_directory: /var/lib/cassandra/commitlog\ndisk_failure_policy: stop\nkey_cache_size_in_mb:\nkey_cache_save_period: 14400\nrow_cache_size_in_mb: 0\nrow_cache_save_period: 0\nsaved_caches_directory: /var/lib/cassandra/saved_caches\ncommitlog_sync: periodic\ncommitlog_sync_period_in_ms: 10000\ncommitlog_segment_size_in_mb: 32\nseed_provider:\n - class_name: org.apache.cassandra.locator.SimpleSeedProvider\n parameters:\n - seeds: cassandra-seed-1.${AWS::StackName}.${AWS::Region}.cjconfig,cassandra-seed-2.${AWS::StackName}.${AWS::Region}.cjconfig\nconcurrent_reads: 32\nconcurrent_writes: 32\ntrickle_fsync: false\ntrickle_fsync_interval_in_kb: 10240\nstorage_port: 7000\nssl_storage_port: 7001\nlisten_address: ${CassandraSeedNetworkInterfaceAz2.PrimaryPrivateIpAddress}\nstart_native_transport: true\nnative_transport_port: 9042\nstart_rpc: true\nrpc_address: ${CassandraSeedNetworkInterfaceAz2.PrimaryPrivateIpAddress}\nrpc_port: 9160\nrpc_keepalive: true\nrpc_server_type: sync\nthrift_framed_transport_size_in_mb: 15\nincremental_backups: false\nsnapshot_before_compaction: false\nauto_snapshot: true\ntombstone_warn_threshold: 1000\ntombstone_failure_threshold: 100000\ncolumn_index_size_in_kb: 64\ncompaction_throughput_mb_per_sec: 16\nread_request_timeout_in_ms: 5000\nrange_request_timeout_in_ms: 10000\nwrite_request_timeout_in_ms: 2000\ncas_contention_timeout_in_ms: 1000\ntruncate_request_timeout_in_ms: 60000\nrequest_timeout_in_ms: 10000\ncross_node_timeout: false\nendpoint_snitch: Ec2Snitch\ndynamic_snitch_update_interval_in_ms: 100\ndynamic_snitch_reset_interval_in_ms: 600000\ndynamic_snitch_badness_threshold: 0.1\nrequest_scheduler: org.apache.cassandra.scheduler.NoScheduler\nserver_encryption_options:\n internode_encryption: none\n keystore: conf/.keystore\n keystore_password: cassandra\n truststore: conf/.truststore\n truststore_password: cassandra\nclient_encryption_options:\n enabled: false\n keystore: conf/.keystore\n keystore_password: cassandra\ninternode_compression: all\ninter_dc_tcp_nodelay: false\nhints_directory: /var/lib/cassandra/hints\nauto_bootstrap: false\n"}, "mode" 420,"owner" "cassandra","group" "cassandra"}}, "commands" {"00-chown-for-cassandra-data" {"command" "chown -R cassandra:cassandra /var/lib/cassandra/data"}, "01-chown-for-cassandra-commitlog" {"command" "chown -R cassandra:cassandra /var/lib/cassandra/commitlog"}}, "services" {"sysvinit" {"cassandra" {"enabled" true, "ensureRunning" true}}}}}}} :dns {"Type" "AWS::Route53::RecordSet", "Properties" {"HostedZoneId" {"Ref" "CassandraHostedZone"}, "Comment" "Cassandra Seed Az2 Record", "Name" {"Fn::Sub" "cassandra-seed-2.${AWS::StackName}.${AWS::Region}.cjconfig"}, "Type" "A", "TTL" 30, "ResourceRecords" [{"Fn::GetAtt" ["CassandraSeedNetworkInterfaceAz2" "PrimaryPrivateIpAddress"]}]}}}) (def template {"AWSTemplateFormatVersion" "2010-09-09", "Description" "Insights Server Cassandra Database", "Parameters" {"Subnets" {"Type" "List<String>","Description" "The subnets where Cassandra nodes live"}, "DefaultSecurityGroup" {"Type" "String","MinLength" 1,"Description" "Security group for general access within VPC"}, "DatabaseSecurityGroup" {"Type" "String","MinLength" 1,"Description" "Database-allowed access"}, "Ec2KeyPair" {"Type" "String","Default" "insights","MinLength" 1,"MaxLength" 64,"AllowedPattern" "[-_ a-zA-Z0-9]*","ConstraintDescription" "can contain only alphanumeric characters, spaces, dashes and underscores.","Description" "Name of an EC2 KeyPair to enable SSH access to EC2 instances"}, "CassandraCluster" {"Type" "String","MinLength" 1,"Description" "The cassandra cluster name"}, "InstanceType" {"Type" "String","Default" "m4.2xlarge","Description" "Instance type"}, "Vpc" {"Type" "String","Description" "The VPC the cluster will be running in"}, "ClusterSize" {"Type" "Number","MinValue" 1,"Default" 6,"Description" "The number of nodes (in addition to the 2 seed nodes)"}}, "Resources" {"CassandraSeedAz1" (:instance cassandra-seed-az-1,) "CassandraSeedAz1DNS" (:dns cassandra-seed-az-1), "CassandraSeedAz2" (:instance cassandra-seed-az-2,) "CassandraSeedAz2DNS" (:dns cassandra-seed-az-2), "CassandraLaunchConfiguration" {"Type" "AWS::AutoScaling::LaunchConfiguration", "Properties" {"InstanceType" {"Ref" "InstanceType"}, "KeyName" {"Ref" "Ec2KeyPair"}, "ImageId" {"Fn::FindInMap" ["AMI" {"Ref" "AWS::Region"} "ami"]}, "SecurityGroups" [{"Ref" "DefaultSecurityGroup"} {"Ref" "DatabaseSecurityGroup"}], "BlockDeviceMappings" [{"DeviceName" "/dev/sdb", "Ebs" {"VolumeSize" 2048, "VolumeType" "gp2", "DeleteOnTermination" false}} {"DeviceName" "/dev/sdg", "Ebs" {"VolumeSize" 512, "VolumeType" "gp2", "DeleteOnTermination" false}}], "UserData" {"Fn::Base64" {"Fn::Sub" "#! /usr/bin/env bash\nset -evx\n\nyum update -y\n\n# start instance initialization\n/opt/aws/bin/cfn-init -v \\\n --stack=${AWS::StackId} \\\n --resource=CassandraLaunchConfiguration \\\n --region=${AWS::Region} \\\n -c cassandra_setup\n\nservice cassandra start\nsleep 20\nservice cassandra status\nCASS_EXIT=$?\n\n# all is well so signal success\n/opt/aws/bin/cfn-signal \\\n --stack=${AWS::StackId} \\\n --resource=CassandraAutoScalingGroup \\\n --region=${AWS::Region} \\\n --exit-code=$CASS_EXIT \\\n --reason='CassandraNodeA initialization complete'\n"}}}, "CreationPolicy" {"ResourceSignal" {"Timeout" "PT15M"}}, "Metadata" {"AWS::CloudFormation::Init" {"configSets" {"cassandra_setup" ["configure_yum" "install_packages" "configure_hosts" "configure_hard_drive" "configure_cassandra"]}, "configure_yum" {"files" {"/etc/yum.repos.d/cassandra.repo" {"content" "[cassandra]\nname=Apache Cassandra\nbaseurl=https://www.apache.org/dist/cassandra/redhat/311x/\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://www.apache.org/dist/cassandra/KEYS\n"}}}, "install_packages" {"commands" {"01-install-java-8" {"command" "yum install -y java-1.8.0"}, "02-remove-java-7" {"command" "yum remove -y java-1.7.0-openjdk"}, "03-install-cassandra" {"command" "yum install -y cassandra"}}}, "configure_hosts" {"commands" {"01-create-hosts-entry-on-boot" {"command" "echo \"`curl -s http://169.254.169.254/latest/meta-data/local-ipv4` `hostname`\" >> /etc/hosts", "test" "test ! -f .create-hosts-entry-semaphore"}, "02-signal_startup_complete" {"command" "touch .create-hosts-entry-semaphore"}}}, "configure_hard_drive" {"commands" {"00-install-xfs-programs" {"command" "yum install -y xfsprogs"}, "01-create-file-system-on-ebs-volume-1" {"command" "mkfs.xfs -s size=4096 /dev/sdb"}, "01-create-file-system-on-ebs-volume-2" {"command" "mkfs.xfs -s size=4096 /dev/sdg"}, "02-setup-fstab-1" {"command" "echo \"/dev/sdb /var/lib/cassandra/data xfs defaults,nofail 0 0\" >> /etc/fstab"}, "02-setup-fstab-2" {"command" "echo \"/dev/sdg /var/lib/cassandra/commitlog xfs defaults,nofail 0 0\" >> /etc/fstab"}, "03-mount-all" {"command" "mount -a"}}}, "configure_cassandra" {"files" {"/etc/cassandra/default.conf/cassandra.yaml" {"content" {"Fn::Sub" "cluster_name: ${CassandraCluster}\nnum_tokens: 256\nhinted_handoff_enabled: true\nmax_hint_window_in_ms: 10800000\nhinted_handoff_throttle_in_kb: 1024\nmax_hints_delivery_threads: 2\nauthenticator: AllowAllAuthenticator\nauthorizer: AllowAllAuthorizer\npermissions_validity_in_ms: 2000\npartitioner: org.apache.cassandra.dht.Murmur3Partitioner\ndata_file_directories:\n - /var/lib/cassandra/data\ncommitlog_directory: /var/lib/cassandra/commitlog\ndisk_failure_policy: stop\nkey_cache_size_in_mb:\nkey_cache_save_period: 14400\nrow_cache_size_in_mb: 0\nrow_cache_save_period: 0\nsaved_caches_directory: /var/lib/cassandra/saved_caches\ncommitlog_sync: periodic\ncommitlog_sync_period_in_ms: 10000\ncommitlog_segment_size_in_mb: 32\nseed_provider:\n - class_name: org.apache.cassandra.locator.SimpleSeedProvider\n parameters:\n - seeds: cassandra-seed-1.${AWS::StackName}.${AWS::Region}.cjconfig,cassandra-seed-2.${AWS::StackName}.${AWS::Region}.cjconfig\nconcurrent_reads: 32\nconcurrent_writes: 32\ntrickle_fsync: false\ntrickle_fsync_interval_in_kb: 10240\nstorage_port: 7000\nssl_storage_port: 7001\nlisten_address: __NODE_IP\nstart_native_transport: true\nnative_transport_port: 9042\nstart_rpc: true\nrpc_address: __NODE_IP\nrpc_port: 9160\nrpc_keepalive: true\nrpc_server_type: sync\nthrift_framed_transport_size_in_mb: 15\nincremental_backups: false\nsnapshot_before_compaction: false\nauto_snapshot: true\ntombstone_warn_threshold: 1000\ntombstone_failure_threshold: 100000\ncolumn_index_size_in_kb: 64\ncompaction_throughput_mb_per_sec: 16\nread_request_timeout_in_ms: 5000\nrange_request_timeout_in_ms: 10000\nwrite_request_timeout_in_ms: 2000\ncas_contention_timeout_in_ms: 1000\ntruncate_request_timeout_in_ms: 60000\nrequest_timeout_in_ms: 10000\ncross_node_timeout: false\nendpoint_snitch: Ec2Snitch\ndynamic_snitch_update_interval_in_ms: 100\ndynamic_snitch_reset_interval_in_ms: 600000\ndynamic_snitch_badness_threshold: 0.1\nrequest_scheduler: org.apache.cassandra.scheduler.NoScheduler\nserver_encryption_options:\n internode_encryption: none\n keystore: conf/.keystore\n keystore_password: cassandra\n truststore: conf/.truststore\n truststore_password: cassandra\nclient_encryption_options:\n enabled: false\n keystore: conf/.keystore\n keystore_password: cassandra\ninternode_compression: all\ninter_dc_tcp_nodelay: false\nhints_directory: /var/lib/cassandra/hints\nauto_bootstrap: false\n"}, "mode" 420, "owner" "cassandra", "group" "cassandra"}}, "commands" {"00-chown-for-cassandra-data" {"command" "chown -R cassandra:cassandra /var/lib/cassandra/data"}, "01-chown-for-cassandra-commitlog" {"command" "chown -R cassandra:cassandra /var/lib/cassandra/commitlog"}, "02-add-node-ip" {"command" "NODE_IP=`hostname -I` sed -i s/__NODE_IP/$NODE_IP/g /etc/cassandra/default.conf/cassandra.yaml"}}, "services" {"sysvinit" {"cassandra" {"enabled" true, "ensureRunning" true}}}}}}}, "CassandraSeedNetworkInterfaceAz1" {"Type" "AWS::EC2::NetworkInterface", "Properties" {"SubnetId" {"Fn::Select" [0 {"Ref" "Subnets"}]}, "GroupSet" [{"Ref" "DefaultSecurityGroup"} {"Ref" "DatabaseSecurityGroup"}]}}, "CassandraAutoScalingGroup" {"Type" "AWS::AutoScaling::AutoScalingGroup", "DependsOn" "CassandraSeedAz1", "Properties" {"MaxSize" {"Ref" "ClusterSize"}, "MinSize" {"Ref" "ClusterSize"}, "DesiredCapacity" {"Ref" "ClusterSize"}, "VPCZoneIdentifier" {"Ref" "Subnets"}, "LaunchConfigurationName" {"Ref" "CassandraLaunchConfiguration"}, "Tags" [{"Key" "Name", "Value" {"Fn::Sub" "Cassandra AutoScale ${AWS::StackName}"}, "PropagateAtLaunch" true}]}}, "CassandraSeedNetworkInterfaceAz2" {"Type" "AWS::EC2::NetworkInterface", "Properties" {"SubnetId" {"Fn::Select" [1 {"Ref" "Subnets"}]}, "GroupSet" [{"Ref" "DefaultSecurityGroup"} {"Ref" "DatabaseSecurityGroup"}]}}, "CassandraHostedZone" {"Type" "AWS::Route53::HostedZone", "Properties" {"Name" {"Fn::Sub" "${AWS::StackName}.${AWS::Region}.cjconfig"}, "HostedZoneConfig" {"Comment" "A hosted zone for our cjconfiguration"}, "VPCs" [{"VPCId" {"Ref" "Vpc"}, "VPCRegion" {"Ref" "AWS::Region"}}]}}}, "Mappings" {"AMI" {"us-east-1" {"ami" "ami-97785bed"}, "us-east-2" {"ami" "ami-f63b1193"}, "us-west-1" {"ami" "ami-824c4ee2"}, "us-west-2" {"ami" "ami-f2d3638a"}}, "NameMap" {"az1" {"name" "cassandra-seed-1"}, "az2" {"name" "cassandra-seed-2"}}}, "Conditions" {"T2InstanceFamily" {"Fn::Equals" [{"Fn::Select" [0 {"Fn::Split" ["." {"Ref" "InstanceType"}]}]} "t2"]}}, "Outputs" {"CassandraContactPoints" {"Value" {"Fn::Sub" "${CassandraSeedNetworkInterfaceAz1.PrimaryPrivateIpAddress},${CassandraSeedNetworkInterfaceAz2.PrimaryPrivateIpAddress}"}}}})