diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..fdd1b78 --- /dev/null +++ b/.metadata @@ -0,0 +1 @@ +language_type: cloudformation diff --git a/.taskcat.yml b/.taskcat.yml index 6bb3790..ca91d0b 100644 --- a/.taskcat.yml +++ b/.taskcat.yml @@ -23,7 +23,7 @@ tests: parameters: AvailabilityZones: $[taskcat_genaz_2] HECClientLocation: 10.0.0.0/16 - KeyName: taskcat-test + KeyName: $[taskcat_getkeypair] QSS3BucketName: $[taskcat_autobucket] QSS3BucketRegion: $[taskcat_current_region] SSHClientLocation: 10.0.0.0/16 @@ -32,7 +32,7 @@ tests: SplunkIndexerDiscoverySecret: $[taskcat_genpass_10] WebClientLocation: 72.21.196.66/32 regions: - - us-west-1 + # - us-west-1 - us-east-2 s3_bucket: '' - template: templates/splunk-enterprise-master.template.yaml + template: templates/splunk-enterprise-main.template.yaml diff --git a/README.md b/README.md index 955e8f8..5de1030 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ View the accompanying [deployment guide](https://fwd.aws/bGBmy) for everything y ### Prerequisites -Before getting started with the template configuration, you will need to make your Splunk Enterprise license privately accessible for CloudFormation template deployment via S3 download. The following steps will guide you through that process. *(Note: This step is not required, and you can upload your license from the Splunk web interface. It is, however, required that you have a non-trial Splunk Enterprise license to fully utilize the deployment our template creates. If you don't already have a Splunk Enterprise license, you can obtain one by contacting sales@splunk.com.)* +Before getting started with the template configuration, you will need to make your Splunk Enterprise license privately accessible for CloudFormation template deployment via S3 download. The following steps will guide you through that process. *(Note: This step is required. A non-trial Splunk Enterprise license is required to allow our template to configure the Splunk deployment. If you don't already have a Splunk Enterprise license, you can obtain one by contacting sales@splunk.com.)* 1. From the AWS Console, select "S3" under the "Storage" heading, or by simply typing "S3" into the search bar. 2. You can either select an existing private bucket to upload to, or create a new one. If you select an existing bucket, make sure its access policy does not grant public access. By default, all the S3 resources are private, so only the AWS account that created the resources can access them. For this exercise, I'm outlining how to create a new bucket. @@ -32,6 +32,4 @@ This project is licensed under Apache License 2.0 - see [LICENSE.txt](./LICENSE. ## Help If you have any problems or general questions, please file an issue in the parent repository: -https://github.com/aws-quickstart/quickstart-splunk-enterprise/issues - - +https://github.com/aws-quickstart/quickstart-splunk-enterprise/issues \ No newline at end of file diff --git a/scripts/user_data.sh b/scripts/user_data.sh new file mode 100644 index 0000000..321924f --- /dev/null +++ b/scripts/user_data.sh @@ -0,0 +1,622 @@ +#!/bin/bash -xe + +#### start universal functions +function base +{ + + # variables + export LOCALIP=$(curl -s http://169.254.169.254/latest/meta-data/local-ipv4) + export INSTANCEID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) + export SPLUNK_USER=splunk + export SPLUNK_BIN=/opt/splunk/bin/splunk + export SPLUNK_HOME=/opt/splunk + + # make cloud-init output log readable by root only to protect sensitive parameter values + chmod 600 /var/log/cloud-init-output.log + + #- The newer version of the Splunk AMI does not come with Splunk pre-installed. Instead + #- Splunk is installed via ansible as part of cloud-init. The following code (starting at line 30) is + #- needed to ensure these install scripts are ran prior to the remainder of the Cloudformation + #- user scripts. Without doing this first, the Splunk installer is ran after CloudFormation's + #- cloud-init scripts, leaving no Splunk install to configure. + + #- remove the cloud-init scripts from running + rm -f /etc/cloud/cloud.cfg.d/20_install_splunk.cfg + rm -f /var/lib/cloud/instance/scripts/runcmd + + # run the ansible code + (cd /opt/splunk-ansible && time sudo -u ec2-user -E -S bash -c "SPLUNK_BUILD_URL=/tmp/splunk.tgz SPLUNK_ENABLE_SERVICE=true SPLUNK_PASSWORD=SPLUNK-$(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id) ansible-playbook -i inventory/environ.py site.yml") + + #- as of 8.2.0, aws-cfn-bootstrap is no longer pre-installed on the AMI. + #- install aws-cfn-bootstrap package + yum -y install aws-cfn-bootstrap + + + # setup auth with user-selected admin password + mv $SPLUNK_HOME/etc/passwd $SPLUNK_HOME/etc/passwd.bak + cat >> $SPLUNK_HOME/etc/system/local/user-seed.conf << end + [user_info] + USERNAME = admin + PASSWORD = $ADMIN_PASSWORD +end + + sed -i '/guid/d' $SPLUNK_HOME/etc/instance.cfg + touch $SPLUNK_HOME/etc/.ui_login + + # restart Splunk for admin password update + $SPLUNK_BIN restart +} + +function restart_signal +{ + + # restart splunk + $SPLUNK_BIN restart + + # communicate back to CloudFormation the status of the instance creation + /opt/aws/bin/cfn-signal -e $? --stack $STACK_NAME --resource $RESOURCE --region $AWS_REGION + + # disable splunk user login + usermod --expiredate 1 splunk +} + +#### end universal config + +##### +#### start role-specific functions +##### + +### +# setup nvme drives for i3 indexers +function nvme_setup +{ + # first, determine the instance type. + ec2_type=$(curl -s http://169.254.169.254/latest/meta-data/instance-type) + + # this script is intended to run on i3* instance types. + if [[ "$ec2_type" != *"i3"* ]] + then + return 0 + fi + + # find the attached nvme drives. lsblk could work here, but utilizing the nvme-list utility due to + # json formatting and simpler parsing. install the nvme-cli and jq packages to accomplish this. + yum -y install nvme-cli jq >/dev/null + + # save the nvme drive information to a temp file for parsing + nvme list --output-format=json > /tmp/nvme_drive.json + + # declare the nvme device array + declare -a nvme_devices + unset nvme_devices + + for nvme_device in $(jq '.Devices[] | .DevicePath' /tmp/nvme_drive.json) + do + # test to ensure that the storage device is instance storage. in testing, I have + # seen EBS volues show as NVME. this logic will ensure attached EBS devices are not + # added to the nvme raid0 + nvme_model_type=$(jq -r '.Devices[] | select(.DevicePath=='$nvme_device') | .ModelNumber' /tmp/nvme_drive.json) + if [[ $nvme_model_type = *"NVMe Instance Storage"* ]] + then + # unfortunate 'hack' here to remove the quotes from the device name. without them, the jq lookup + # will fail in the previous step. however, they need to be removed for the md raid creation later. + # additionally, since there needs to be a space between device names for the md create, convert + # quotes to spaces, and remove leading space. this leaves "$nvme_device " (note trailing space) + # stored in the array. this will allow for simply using the contents of the array as an argument for + # building the raid0 device + nvme_device=$(echo $nvme_device|sed 's/"/ /g'| sed 's/^ //g') + + # save device list in nvme_devices array + nvme_devices+=("$nvme_device") + else + # if the nvme model type is not instance storage, continue to the next iteration of the loop + continue + fi + done + + # name of the raid device to create + raid_device="/dev/md0" + + # mount point of the raid device + raid_mount="/opt/splunk" + + # make directory for mount point + mkdir -p $raid_mount + + # create the raid device + mdadm --create $raid_device --level=raid0 --raid-devices=${#nvme_devices[@]} ${nvme_devices[@]} + + # create filesystem on raid device + if [ ${#nvme_devices[@]} -eq 1 ] + then + discardOption="" + else + discardOption="-E nodiscard" + fi + + mkfs.ext4 -m 2 -F -F ${discardOption} $raid_device + + # add entry to fstab for mounting on reboot + echo "$raid_device $raid_mount auto defaults,nofail,noatime 0 2" >>/etc/fstab + + # mount device + mount $raid_device + +} + +### +# Splunk Cluster Master / License Master +### +function splunk_cm +{ + # execute base install and configuration + base + + export RESOURCE="SplunkCM" + printf '%s\t%s\n' "$LOCALIP" 'splunklicense' >> /etc/hosts + hostname splunklicense + + #- for the CM, we can't reference CM_PRIVATEIP in the CloudFormation UserData like + #- we do in the other resources because the CM hasn't been created yet. To keep the + #- syntax consistent across each resource in user_data.sh, export $CM_PRIVATEIP to + #- the CM's local ip address + export CM_PRIVATEIP=$LOCALIP + + # Install license from metadata. + if [ $INSTALL_LICENSE = 1 ]; then + mkdir -p $SPLUNK_HOME/etc/licenses/enterprise/ + chown $SPLUNK_USER:$SPLUNK_USER $SPLUNK_HOME/etc/licenses/enterprise + /opt/aws/bin/cfn-init -v --stack $STACK_NAME --resource $RESOURCE --region $AWS_REGION + fi + + # Increase splunkweb connection timeout with splunkd + mkdir -p $SPLUNK_HOME/etc/apps/base-autogenerated/local + cat >>$SPLUNK_HOME/etc/apps/base-autogenerated/local/web.conf <>$SPLUNK_HOME/etc/apps/base-autogenerated/local/outputs.conf <>$SPLUNK_HOME/etc/system/local/server.conf < /tmp/token + TOKEN=`sed -n 's/\\ttoken=//p' /tmp/token` && rm /tmp/token + + # place generated config into master-apps + mkdir -p $SPLUNK_HOME/etc/master-apps/peer-base-autogenerated/local + mv $SPLUNK_HOME/etc/apps/splunk_httpinput/local/inputs.conf $SPLUNK_HOME/etc/master-apps/peer-base-autogenerated/local + + # peer config 2: enable splunk tcp input + cat >>$SPLUNK_HOME/etc/master-apps/peer-base-autogenerated/local/inputs.conf <>$SPLUNK_HOME/etc/master-apps/_cluster/local/indexes.conf <> $SPLUNK_HOME/etc/slave-apps/_cluster/local/indexes.conf << end + [default] + repFactor = auto + remotePath = volume:remote_store/splunk_db/$_index_name + coldPath=$SPLUNK_DB/$_index_name/colddb + thawedPath=$SPLUNK_DB/$_index_name/thaweddb +end + + cat >>$SPLUNK_HOME/etc/slave-apps/_cluster/local/indexes.conf <>$SPLUNK_HOME/etc/apps/base-autogenerated/local/web.conf <>$SPLUNK_HOME/etc/apps/base-autogenerated/local/server.conf <>$SPLUNK_HOME/etc/system/local/server.conf <> /etc/hosts + hostname "splunksearch-$num" + + # set splunk servername + sudo -u $SPLUNK_USER $SPLUNK_BIN set servername SHC$num + + # Increase splunkweb connection timeout with splunkd + cat >$SPLUNK_HOME/etc/system/local/web.conf <>$SPLUNK_HOME/etc/system/local/server.conf <> /etc/hosts + hostname splunk-shc-deployer + + # Increase splunkweb connection timeout with splunkd + mkdir -p $SPLUNK_HOME/etc/apps/base-autogenerated/local + cat >>$SPLUNK_HOME/etc/apps/base-autogenerated/local/web.conf <>$SPLUNK_HOME/etc/apps/base-autogenerated/local/server.conf <>$SPLUNK_HOME/etc/apps/base-autogenerated/local/outputs.conf <>$SPLUNK_HOME/etc/shcluster/apps/member-base-autogenerated/local/outputs.conf <> /etc/hosts + hostname splunksearch + + # Increase splunkweb connection timeout with splunkd + mkdir -p $SPLUNK_HOME/etc/apps/base-autogenerated/local + cat >>$SPLUNK_HOME/etc/apps/base-autogenerated/local/web.conf <>$SPLUNK_HOME/etc/apps/base-autogenerated/local/outputs.conf < + NumberOfAZs: + AllowedValues: + - '2' + - '3' + Default: '2' + Description: Number of Availability Zones to use in the VPC. This must match your + selections in the list of Availability Zones parameter. + Type: String + WebClientLocation: + AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$ + ConstraintDescription: Must be a valid IP range in x.x.x.x/x notation. Use 0.0.0.0/0 + for no restrictions. + Description: 'The IP address range that is allowed to connect to the Splunk web + interface. Note: a value of 0.0.0.0/0 will allow access from ANY ip address' + MaxLength: '19' + MinLength: '9' + Type: String + HECClientLocation: + AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$ + ConstraintDescription: Must be a valid IP range in x.x.x.x/x notation. Use 0.0.0.0/0 + for no restrictions. + Description: 'The IP address range that is allowed to send data to Splunk HTTP + Event Collector. Note: a value of 0.0.0.0/0 will allow access from ANY ip address' + MaxLength: '19' + MinLength: '9' + Type: String + IndexerInstanceType: + AllowedValues: + - c4.2xlarge + - c4.4xlarge + - c4.8xlarge + - m4.2xlarge + - m4.4xlarge + - m4.10xlarge + - c5.2xlarge + - c5.4xlarge + - c5.9xlarge + - c5.18xlarge + - i3.2xlarge + - i3.4xlarge + - i3.8xlarge + Description: EC2 instance type for Splunk Indexers + ConstraintDescription: must be a valid EC2 instance type. + Default: c5.4xlarge + Type: String + SearchHeadInstanceType: + AllowedValues: + - c4.2xlarge + - c4.4xlarge + - c4.8xlarge + - r4.4xlarge + - r4.8xlarge + - r4.16xlarge + - c5.2xlarge + - c5.4xlarge + - c5.9xlarge + - m5.2xlarge + - m5.4xlarge + - m5.12xlarge + Description: EC2 instance type for Splunk Search Heads + ConstraintDescription: must be a valid EC2 instance type. + Default: c5.4xlarge + Type: String + IndexerApps: + Description: Comma separated list of URLs of Splunk App (or Add-on) tarballs (.spl) + to pre-install on indexer(s) + Default: '' + Type: CommaDelimitedList + SearchHeadApps: + Description: Comma separated list of URLs of Splunk App (or Add-on) tarballs (.spl) + to pre-install on search head(s) + Default: '' + Type: CommaDelimitedList + KeyName: + ConstraintDescription: Must be the name of an existing EC2 KeyPair. + Description: Name of an existing EC2 KeyPair to enable SSH access to the instance + Type: AWS::EC2::KeyPair::KeyName + PublicSubnet1CIDR: + AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$ + ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. + Default: 10.0.1.0/24 + Description: The address space that will be assigned to the first Splunk server + subnet. (x.x.x.x/x notation) + Type: String + PublicSubnet2CIDR: + AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$ + ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. + Default: 10.0.2.0/24 + Description: The address space that will be assigned to the second Splunk server + subnet. (x.x.x.x/x notation) + Type: String + PublicSubnet3CIDR: + AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$ + ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. + Default: 10.0.3.0/24 + Description: The address space that will be assigned to the second Splunk server + subnet. (x.x.x.x/x notation) + Type: String + QSS3BucketName: + Default: aws-quickstart + Description: S3 bucket name for the Quick Start assets. + Type: String + QSS3BucketRegion: + Default: 'us-west-2' + Description: 'The AWS Region where the Quick Start S3 bucket (QSS3BucketName) is hosted. When using your own bucket, you must specify this value.' + Type: String + QSS3KeyPrefix: + Default: quickstart-splunk-enterprise/ + Description: S3 key prefix for the Quick Start assets. + Type: String + SHCEnabled: + AllowedValues: + - 'yes' + - 'no' + Default: 'no' + Description: Do you want to build a Splunk search head cluster? + Type: String + SSHClientLocation: + AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$ + ConstraintDescription: Must be a valid IP range in x.x.x.x/x notation. Use 0.0.0.0/0 + for no restrictions. + Description: 'The IP address range that is allowed to SSH to the EC2 instances. + Note: a value of 0.0.0.0/0 will allow access from ANY ip address' + MaxLength: '19' + MinLength: '9' + Type: String + SplunkAdminPassword: + AllowedPattern: (?=^.{6,255}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.* + ConstraintDescription: Must be at least 8 characters containing letters, numbers + and symbols. + Description: Admin password for Splunk. Must be at least 6 characters containing + letters, numbers and symbols + MaxLength: '32' + MinLength: '6' + NoEcho: 'true' + Type: String + SplunkIndexerCount: + ConstraintDescription: must be a valid number, 3-10 + Default: '3' + Description: How many Splunk indexers to launch. [3-10] + MaxValue: '10' + MinValue: '3' + Type: Number + SplunkIndexerDiskSize: + ConstraintDescription: must be a valid number, 320-16000 + Default: '320' + Description: The size of the attached EBS volume to the Splunk indexers. (in + GB) + MaxValue: '16000' + MinValue: '320' + Type: Number + SplunkSearchHeadDiskSize: + ConstraintDescription: must be a valid number, 320-16000 + Default: '320' + Description: The size of the attached EBS volume to the Splunk search head(s). (in + GB) + MaxValue: '16000' + MinValue: '320' + Type: Number + SplunkLicenseBucket: + Default: '' + Description: Name of private S3 bucket with licenses to be accessed via authenticated + requests + Type: String + SplunkLicensePath: + Default: '' + Description: Path to license file in S3 Bucket (without leading '/') + Type: String + SplunkReplicationFactor: + ConstraintDescription: must be a valid number, 2-4 + Default: '2' + Description: How many copies of data should be stored in the Splunk Indexer Cluster + MaxValue: '4' + MinValue: '2' + Type: Number + SplunkSearchFactor: + ConstraintDescription: must be a valid number, 2-4 + Default: '2' + Description: How many copies of data should be searchable in the Splunk indexer + clusters + MaxValue: '4' + MinValue: '2' + Type: Number + SplunkClusterSecret: + AllowedPattern: (?=^.{6,255}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.* + ConstraintDescription: Must be at least 8 characters containing letters, numbers + and symbols. + Description: Shared cluster secret for Search Head and Indexer clusters. Must + be at least 8 characters containing letters, numbers and symbols. + MaxLength: '32' + MinLength: '6' + NoEcho: 'true' + Type: String + SplunkIndexerDiscoverySecret: + AllowedPattern: (?=^.{6,255}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.* + ConstraintDescription: Must be at least 8 characters containing letters, numbers + and symbols. + Description: >- + Security key used for communication between your forwarders and the cluster + master. This value should also be used by forwarders in order to retrieve list + of available peer nodes from cluster master. Must be at least 8 characters containing + letters, numbers and symbols. + MaxLength: '32' + MinLength: '8' + NoEcho: 'true' + Type: String + VPCCIDR: + AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2}) + ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. + Default: 10.0.0.0/16 + Description: The address space that will be assigned to the entire VPC where Splunk + will reside. (Recommend at least a /16) + MaxLength: '19' + MinLength: '9' + Type: String +Conditions: + Create3AZ: !Equals + - !Ref 'NumberOfAZs' + - '3' + UsingDefaultBucket: !Equals [!Ref QSS3BucketName, 'aws-quickstart'] +Resources: + VPCStack: + Type: AWS::CloudFormation::Stack + Properties: + TemplateURL: + !Sub + - 'https://${S3Bucket}.s3.${S3Region}.${AWS::URLSuffix}/${QSS3KeyPrefix}submodules/quickstart-aws-vpc/templates/aws-vpc.template' + - S3Region: !If [UsingDefaultBucket, !Ref 'AWS::Region', !Ref QSS3BucketRegion] + S3Bucket: !If [UsingDefaultBucket, !Sub '${QSS3BucketName}-${QSS3BucketRegion}', !Ref QSS3BucketName] + Parameters: + AvailabilityZones: !Join + - ',' + - !Ref 'AvailabilityZones' + CreatePrivateSubnets: 'false' + KeyPairName: !Ref 'KeyName' + NumberOfAZs: !Ref 'NumberOfAZs' + PublicSubnet1CIDR: !Ref 'PublicSubnet1CIDR' + PublicSubnet2CIDR: !Ref 'PublicSubnet2CIDR' + PublicSubnet3CIDR: !Ref 'PublicSubnet3CIDR' + VPCCIDR: !Ref 'VPCCIDR' + TimeoutInMinutes: 15 + SplunkStack: + Type: AWS::CloudFormation::Stack + Properties: + TemplateURL: + !Sub + - 'https://${S3Bucket}.s3.${S3Region}.${AWS::URLSuffix}/${QSS3KeyPrefix}templates/splunk-enterprise.template.yaml' + - S3Bucket: !If + - UsingDefaultBucket + - !Sub '${QSS3BucketName}-${QSS3BucketRegion}' + - !Ref 'QSS3BucketName' + S3Region: !If + - UsingDefaultBucket + - !Ref 'AWS::Region' + - !Ref 'QSS3BucketRegion' + Parameters: + VPCID: !GetAtt 'VPCStack.Outputs.VPCID' + VPCCIDR: !GetAtt 'VPCStack.Outputs.VPCCIDR' + PublicSubnet1ID: !GetAtt 'VPCStack.Outputs.PublicSubnet1ID' + PublicSubnet2ID: !GetAtt 'VPCStack.Outputs.PublicSubnet2ID' + PublicSubnet3ID: !If + - Create3AZ + - !GetAtt 'VPCStack.Outputs.PublicSubnet3ID' + - !GetAtt 'VPCStack.Outputs.PublicSubnet2ID' + NumberOfAZs: !Ref 'NumberOfAZs' + IndexerInstanceType: !Ref 'IndexerInstanceType' + SearchHeadInstanceType: !Ref 'SearchHeadInstanceType' + SplunkAdminPassword: !Ref 'SplunkAdminPassword' + SplunkClusterSecret: !Ref 'SplunkClusterSecret' + SplunkIndexerDiscoverySecret: !Ref 'SplunkIndexerDiscoverySecret' + SplunkLicenseBucket: !Ref 'SplunkLicenseBucket' + SplunkLicensePath: !Ref 'SplunkLicensePath' + KeyName: !Ref 'KeyName' + SSHClientLocation: !Ref 'SSHClientLocation' + HECClientLocation: !Ref 'HECClientLocation' + WebClientLocation: !Ref 'WebClientLocation' + SplunkIndexerCount: !Ref 'SplunkIndexerCount' + SHCEnabled: !Ref 'SHCEnabled' + SplunkIndexerDiskSize: !Ref 'SplunkIndexerDiskSize' + SplunkReplicationFactor: !Ref 'SplunkReplicationFactor' + QSS3BucketName: !Ref QSS3BucketName + QSS3BucketRegion: !Ref QSS3BucketRegion + QSS3KeyPrefix: !Ref QSS3KeyPrefix + IndexerApps: !Join + - ',' + - !Ref 'IndexerApps' + SearchHeadApps: !Join + - ',' + - !Ref 'SearchHeadApps' + TimeoutInMinutes: 60 +Outputs: + SearchHeadURL: + Description: Splunk Enterprise - Search Head URL + Value: !GetAtt 'SplunkStack.Outputs.SearchHeadURL' + ClusterMasterURL: + Description: Splunk Enterprise - Cluster Master URL + Value: !GetAtt 'SplunkStack.Outputs.ClusterMasterURL' + ClusterMasterManagementURL: + Description: Splunk Enterprise - Cluster Master Management URL (required for Indexer + Discovery) + Value: !GetAtt 'SplunkStack.Outputs.ClusterMasterManagementURL' + DeployerURL: + Description: Splunk Enterprise - Search Head Cluster Deployer URL + Value: !GetAtt 'SplunkStack.Outputs.DeployerURL' + HttpEventCollectorURL: + Description: HTTP Event Collector URL + Value: !GetAtt 'SplunkStack.Outputs.HttpEventCollectorURL' + HttpEventCollectorToken: + Description: HTTP Event Collector Token + Value: !GetAtt 'SplunkStack.Outputs.HttpEventCollectorToken'