git.fiddlerwoaroof.com
Raw Blame History
(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}"}}}})