{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "ArcGIS CloudFormation Template: Provisions an ArcGIS for Server site on EC2 instances running Ubuntu LTS 16.04. **WARNING** You will be billed by AWS for the AWS resources if you create a stack from this template.", "Mappings" : { "RegionMap" : { "ap-northeast-1": { "en": "ami-c4ac37a2" }, "ap-northeast-2": { "en": "ami-6c74d402" }, "ap-south-1": { "en": "ami-574b1c38" }, "ap-southeast-1": { "en": "ami-fd087a81" }, "ap-southeast-2": { "en": "ami-fe7b869c" }, "ca-central-1": { "en": "ami-e39c1987" }, "eu-central-1": { "en": "ami-f9e87596" }, "eu-west-1": { "en": "ami-47de433e" }, "eu-west-2": { "en": "ami-c2445fa6" }, "sa-east-1": { "en": "ami-5d8bc931" }, "us-east-1": { "en": "ami-f6a0fa8c" }, "us-east-2": { "en": "ami-f4664c91" }, "us-west-1": { "en": "ami-33303353" }, "us-west-2": { "en": "ami-52fa4c2a" } }, "DBEngineProperties" : { "postgres" : {"MajorVersion": "9.5", "Version": "9.5.2", "License": "postgresql-license"} } }, "Parameters" : { "DeploymentBucket" : { "Description" : "S3 bucket with ArcGIS Server authorization file", "Type" : "String", "AllowedPattern" : "^([a-z]|(\\d(?!\\d{0,2}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})))([a-z\\d]|(\\.(?!(\\.|-)))|(-(?!\\.))){1,61}[a-z\\d\\.]$", "ConstraintDescription" : "A Bucket's name can be between 6 and 63 characters long, containing lowercase characters, numbers, periods, and dashes and it must start with a lowercase letter or number." }, "DriveSizeRoot" : { "Default" : "100", "Description" : "The size of the C: Drive in GB.", "Type" : "Number", "MinValue" : "100", "MaxValue" : "1024", "ConstraintDescription" : "Must be between 100 and 1024 GB." }, "DriveSizeData" : { "Default" : "100", "Description" : "The size of the D: Drive in GB.", "Type" : "Number", "MinValue" : "10", "MaxValue" : "1024", "ConstraintDescription" : "Must be between 10 and 1024 GB." }, "FSInstanceType": { "Description": "The file server EC2 instance type", "Type": "String", "AllowedValues": [ "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "c5.large", "c5.xlarge", "c5.2xlarge", "c5.4xlarge", "c5.9xlarge", "c5.18xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "r4.large", "r4.xlarge", "r4.2xlarge", "r4.4xlarge", "r4.8xlarge", "r4.16xlarge", "t2.large", "t2.xlarge", "t2.2xlarge", "x1.16xlarge", "x1.32xlarge" ], "Default": "c4.large" }, "ASInstanceType": { "Description": "The ArcGIS Server EC2 instance type", "Type": "String", "AllowedValues": [ "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "c5.large", "c5.xlarge", "c5.2xlarge", "c5.4xlarge", "c5.9xlarge", "c5.18xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "r4.large", "r4.xlarge", "r4.2xlarge", "r4.4xlarge", "r4.8xlarge", "r4.16xlarge", "t2.large", "t2.xlarge", "t2.2xlarge", "x1.16xlarge", "x1.32xlarge" ], "Default": "m4.large" }, "SecondaryInstances" : { "Description" : "Number of secondary ArcGIS Server EC2 instances launched by AutoScaling", "Type" : "Number", "Default" : "1" }, "KeyName" : { "Description" : "EC2 Key Pair to allow RemoteDesktop access to the instances", "Type" : "AWS::EC2::KeyPair::KeyName" }, "StoreType": { "Description": "ArcGIS Server config store type", "Type": "String", "AllowedValues": ["CloudStore", "FileSystem"], "Default": "FileSystem" }, "ServerLicenseFile": { "Description": "ArcGIS for Server authorization file (must be uploaded to DeploymentBucket)", "Type": "String", "AllowedPattern": "^([\\w\\-\\.]+)+\\.(ecp|prvc)$", "ConstraintDescription": "License file name must be alphanumeric. It can contain dash ('-'), dot ('.'), and underscore ('_') characters. The file name must end with '.ecp' or '.prvc'." }, "SiteAdmin" : { "Description" : "User name for ArcGIS Server site admin account", "Type" : "String", "Default" : "admin", "AllowedPattern": "^[a-zA-Z][a-zA-Z0-9_]{4,}$", "ConstraintDescription": "User name must be 4 or more alphanumeric or underscore (_) characters and must start with a letter." }, "SiteAdminPassword" : { "Description" : "Password for the site admin account", "Type" : "String", "NoEcho" : "true", "AllowedPattern": "^[a-zA-Z0-9_\\.@]{8,}$", "ConstraintDescription": "Password must be 8 or more alphanumeric, underscore (_), at ('@'), or dot (.) characters." }, "ELBName": { "Description": "Name of an existing ELB or 'NEW_ELB' to create and use a new one.", "Type": "String", "Default" : "NEW_ELB" }, "SSLCertificateARN": { "Description": "ARN of the SSL certificate issued to the site domain (not required if in existing ELB is used)", "Type": "String", "Default" : "", "ConstraintDescription": "arn:aws:acm:::certificate/" }, "DBEngine": { "Description": "RDS engine", "Type": "String", "AllowedValues": ["none", "postgres"], "Default": "none" }, "DBInstanceClass": { "Description": "The RDS instance class", "Type": "String", "AllowedValues": [ "db.m3.medium", "db.m3.large", "db.m3.xlarge", "db.m3.2xlarge", "db.m4.large", "db.m4.xlarge", "db.m4.2xlarge", "db.m4.4xlarge", "db.m4.10xlarge", "db.r3.large", "db.r3.xlarge", "db.r3.2xlarge", "db.r3.4xlarge", "db.r3.8xlarge", "db.t2.micro", "db.t2.small", "db.t2.medium", "db.t2.large" ], "Default": "db.m4.large" }, "DBAllocatedStorage" : { "Default" : "200", "Description" : "The allocated storage size of RDS instance specified in gigabytes (GB).", "Type" : "Number", "MinValue" : "200", "MaxValue" : "4096", "ConstraintDescription" : "Must be between 200 and 4096." }, "VPCId" : { "Description" : "VPC ID", "Type" : "AWS::EC2::VPC::Id" }, "Subnet1" : { "Description" : "Subnet 1", "Type": "AWS::EC2::Subnet::Id" }, "Subnet2" : { "Description" : "Subnet 2", "Type": "AWS::EC2::Subnet::Id" }, "PostInstallationScript": { "Description": "ZIP archive file with custom post installation script (must be uploaded to DeploymentBucket).", "Type": "String", "AllowedPattern": "[^\"]{1,1024}", "ConstraintDescription": "S3 object key name must be between 1 and 1024 characters.", "Default": "none" } }, "Metadata" : { "AWS::CloudFormation::Interface" : { "ParameterGroups" : [ { "Label" : { "default" : "Network Configuration" }, "Parameters" : [ "VPCId", "Subnet1", "Subnet2", "ELBName", "SSLCertificateARN" ] }, { "Label" : { "default":"Amazon EC2 Configuration" }, "Parameters" : [ "FSInstanceType", "ASInstanceType", "SecondaryInstances", "DriveSizeRoot", "DriveSizeData", "KeyName", "DBEngine", "DBInstanceClass", "DBAllocatedStorage" ] }, { "Label" : { "default":"ArcGIS Enterprise Configuration" }, "Parameters" : [ "DeploymentBucket", "ServerLicenseFile", "StoreType", "SiteAdmin", "SiteAdminPassword" ] } ] } }, "Conditions" : { "CreateDBInstance" : {"Fn::Not" : [{"Fn::Equals" : [{"Ref" : "DBEngine"}, "none"]}]}, "DBEnginePostgres" : {"Fn::Equals" : [{"Ref" : "DBEngine"}, "postgres"]}, "CreateDHCPOptions" : {"Fn::Equals" : [{"Ref" : "AWS::Region"}, "us-east-1"]}, "UseCloudStore" : {"Fn::Equals" : [{"Ref" : "StoreType"}, "CloudStore"]}, "RunPostInstall" : {"Fn::Not" : [{"Fn::Equals" : [{"Ref" : "PostInstallationScript"}, "none"]}]}, "NewELB" : {"Fn::Equals" : [{"Ref" : "ELBName"}, "NEW_ELB"]} }, "Resources" : { "ValidateParametersFunction": { "Type": "AWS::Lambda::Function", "DependsOn": "IAMRole", "Properties": { "Code": { "S3Bucket": {"Fn::Join" : ["", ["agsstore6", "-", {"Ref": "AWS::Region"}]]}, "S3Key": "8321/lambda/arcgis-cfn-lambda.zip" }, "Handler": "parameters.handler", "Runtime": "python2.7", "Timeout": "300", "Role": { "Fn::GetAtt" : ["LambdaExecutionRole", "Arn"] } } }, "StopStackFunction": { "Type": "AWS::Lambda::Function", "DependsOn": "IAMRole", "Properties": { "Code": { "S3Bucket": {"Fn::Join" : ["", ["agsstore6", "-", {"Ref": "AWS::Region"}]]}, "S3Key": "8321/lambda/arcgis-cfn-lambda.zip" }, "Environment" : { "Variables" : { "StackName" : {"Ref" : "AWS::StackName"} } }, "Handler": "stop_start.stop_server_stack", "Runtime": "python2.7", "Timeout": "300", "Role": {"Fn::GetAtt" : ["LambdaExecutionRole", "Arn"]}, "Description" : "Stops all EC2 instances of the CloudFormation stack" } }, "StartStackFunction": { "Type": "AWS::Lambda::Function", "DependsOn": "IAMRole", "Properties": { "Code": { "S3Bucket": {"Fn::Join" : ["", ["agsstore6", "-", {"Ref": "AWS::Region"}]]}, "S3Key": "8321/lambda/arcgis-cfn-lambda.zip" }, "Environment" : { "Variables" : { "StackName" : {"Ref" : "AWS::StackName"} } }, "Handler": "stop_start.start_server_stack", "Runtime": "python2.7", "Timeout": "300", "Role": {"Fn::GetAtt" : ["LambdaExecutionRole", "Arn"]}, "Description" : "Starts all EC2 instances of the CloudFormation stack" } }, "GetELBAttributesFunction": { "Type": "AWS::Lambda::Function", "DependsOn": "IAMRole", "Properties": { "Code": { "S3Bucket": {"Fn::Join" : ["", ["agsstore6", "-", {"Ref": "AWS::Region"}]]}, "S3Key": "8321/lambda/arcgis-cfn-lambda.zip" }, "Handler": "elb_attributes.handler", "Runtime": "python2.7", "Timeout": "300", "Role": {"Fn::GetAtt" : ["LambdaExecutionRole", "Arn"]}, "Description" : "Retrieves DNSName and source security group name for the specified ELB" } }, "ELBAttributes": { "Type": "Custom::ELBAttributes", "Properties": { "ServiceToken": {"Fn::GetAtt": ["GetELBAttributesFunction", "Arn"]}, "ELBName" : {"Fn::If": ["NewELB", {"Ref" : "ELB"}, {"Ref" :"ELBName"}]}, "ELBTemplate" : "server", "ELBSubnets" : [ {"Ref" : "Subnet1"}, {"Ref" : "Subnet2"} ] } }, "ELBInstanceFunction": { "Type": "AWS::Lambda::Function", "DependsOn": "IAMRole", "Properties": { "Code": { "S3Bucket": {"Fn::Join" : ["", ["agsstore6", "-", {"Ref": "AWS::Region"}]]}, "S3Key": "8321/lambda/arcgis-cfn-lambda.zip" }, "Handler": "elb_instance.handler", "Runtime": "python2.7", "Timeout": "300", "Role": {"Fn::GetAtt" : ["LambdaExecutionRole", "Arn"]}, "Description" : "Registers EC2 instance with the specified ELB" } }, "ELBInstance": { "Type": "Custom::ELBInstance", "Properties": { "ServiceToken": {"Fn::GetAtt": ["ELBInstanceFunction", "Arn"]}, "ELBName" : {"Fn::If": ["NewELB", {"Ref" : "ELB"}, {"Ref" :"ELBName"}]}, "InstanceId" : {"Ref" : "PrimaryServerEC2Instance"} } }, "LambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": {"Service": ["lambda.amazonaws.com"]}, "Action": ["sts:AssumeRole"] }] }, "Path": "/", "Policies": [{ "PolicyName": "root", "PolicyDocument": { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"], "Resource": "*" }, { "Effect": "Allow", "Action": ["dynamodb:*"], "Resource": "*" }, { "Effect": "Allow", "Action": ["s3:*"], "Resource": "*" }, { "Effect": "Allow", "Action": ["ec2:*"], "Resource": "*" }, { "Effect": "Allow", "Action": ["cloudformation:*"], "Resource": "*" }, { "Effect": "Allow", "Action": ["autoscaling:*"], "Resource": "*" }, { "Effect": "Allow", "Action": ["elasticloadbalancing:*"], "Resource": "*" }] } }] } }, "ValidateServerLicenseFile": { "Type": "Custom::ValidateParameters", "Properties": { "ServiceToken": {"Fn::GetAtt": ["ValidateParametersFunction", "Arn"]}, "DeploymentBucket": {"Ref": "DeploymentBucket"}, "S3Key": {"Ref": "ServerLicenseFile"} } }, "ValidatePostInstallationScript": { "Type": "Custom::ValidateParameters", "Condition": "RunPostInstall", "Properties": { "ServiceToken": {"Fn::GetAtt": ["ValidateParametersFunction", "Arn"]}, "DeploymentBucket": {"Ref": "DeploymentBucket"}, "S3Key": {"Ref": "PostInstallationScript"} } }, "ServerConfigStoreFunction": { "Type": "AWS::Lambda::Function", "DependsOn": "IAMRole", "Properties": { "Code": { "S3Bucket": {"Fn::Join" : ["", ["agsstore6", "-", {"Ref": "AWS::Region"}]]}, "S3Key": "8321/lambda/arcgis-cfn-lambda.zip" }, "Handler": "server_config_store.handler", "Runtime": "python2.7", "Timeout": "30", "Role": { "Fn::GetAtt" : ["LambdaExecutionRole", "Arn"] } } }, "ServerConfigStore": { "Type": "Custom::ServerConfigStore", "Properties": { "ServiceToken": {"Fn::GetAtt": ["ServerConfigStoreFunction", "Arn"]}, "Namespace": {"Ref" : "AWS::StackName"} } }, "DeploymentLogs": { "Type": "AWS::Logs::LogGroup", "DependsOn": "LambdaExecutionRole", "Properties": { "RetentionInDays": 7 } }, "ELB" : { "Type" : "AWS::ElasticLoadBalancing::LoadBalancer", "Condition": "NewELB", "Properties" : { "Subnets" : [ {"Ref" : "Subnet1"}, {"Ref" : "Subnet2"} ], "SecurityGroups" : [ {"Ref" : "ELBSecurityGroup"} ], "Scheme" : "internet-facing", "Listeners" : [ { "LoadBalancerPort" : "80", "InstancePort" : "6080", "Protocol" : "HTTP" }, { "LoadBalancerPort" : "443", "InstancePort" : "6443", "Protocol" : "HTTPS", "InstanceProtocol" : "HTTPS", "SSLCertificateId" : {"Ref" : "SSLCertificateARN"} } ], "HealthCheck" : { "Target" : "HTTP:6080/arcgis/rest/info/healthcheck", "HealthyThreshold" : "3", "UnhealthyThreshold" : "5", "Interval" : "30", "Timeout" : "5" } } }, "IAMRole" : { "Type" : "AWS::IAM::Role", "DependsOn": "LambdaExecutionRole", "Properties" : { "AssumeRolePolicyDocument" : { "Statement" : [ { "Effect" : "Allow", "Principal" : { "Service" : [ "ec2.amazonaws.com" ] }, "Action" : [ "sts:AssumeRole" ] } ] }, "Path" : "/" } }, "IAMPolicy" : { "Type" : "AWS::IAM::Policy", "Properties" : { "PolicyName" : "IAMRole", "PolicyDocument" : { "Statement" : [ { "Action" : [ "s3:*", "dynamodb:*", "cloudformation:*", "logs:*", "ssm:*", "ec2messages:*" ], "Effect" : "Allow", "Resource" : "*" } ] }, "Roles" : [ { "Ref" : "IAMRole" } ] } }, "IAMInstanceProfile" : { "Type" : "AWS::IAM::InstanceProfile", "Properties" : { "Path" : "/", "Roles" : [ { "Ref" : "IAMRole" } ] } }, "ELBSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Condition": "NewELB", "Properties" : { "GroupDescription" : {"Ref" : "AWS::StackName"}, "VpcId" : {"Ref" : "VPCId"}, "SecurityGroupIngress" : [ { "IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0" }, { "IpProtocol" : "tcp", "FromPort" : "443", "ToPort" : "443", "CidrIp" : "0.0.0.0/0" } ] } }, "SecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : {"Ref" : "AWS::StackName"}, "VpcId" : {"Ref" : "VPCId"}, "SecurityGroupIngress" : [ { "IpProtocol" : "tcp", "FromPort" : "6080", "ToPort" : "6080", "SourceSecurityGroupId" : {"Fn::If": ["NewELB", {"Ref" : "ELBSecurityGroup"}, {"Fn::GetAtt" : ["ELBAttributes", "SourceSecurityGroupId"]}]} }, { "IpProtocol" : "tcp", "FromPort" : "6443", "ToPort" : "6443", "SourceSecurityGroupId" : {"Fn::If": ["NewELB", {"Ref" : "ELBSecurityGroup"}, {"Fn::GetAtt" : ["ELBAttributes", "SourceSecurityGroupId"]}]} } ] } }, "SecurityGroupIngress" : { "Type" : "AWS::EC2::SecurityGroupIngress", "Properties" : { "GroupId" : {"Ref" : "SecurityGroup"}, "IpProtocol" : "tcp", "FromPort" : "0", "ToPort" : "65535", "SourceSecurityGroupId" : {"Ref" : "SecurityGroup"} } }, "FileServerEC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : {"Fn::FindInMap" : ["RegionMap", {"Ref":"AWS::Region"}, "en"]}, "InstanceType" : {"Ref":"FSInstanceType"}, "KeyName" : {"Ref":"KeyName"}, "IamInstanceProfile" : {"Ref":"IAMInstanceProfile"}, "Monitoring" : true, "BlockDeviceMappings": [ { "DeviceName": "/dev/sda1", "Ebs": { "VolumeSize": {"Ref": "DriveSizeRoot"}, "DeleteOnTermination": true, "VolumeType": "gp2" } }, { "DeviceName": "/dev/sdx", "Ebs": { "VolumeSize": {"Ref": "DriveSizeData"}, "DeleteOnTermination": true, "VolumeType": "gp2" } }, {"DeviceName": "xvdca", "NoDevice": {}}, {"DeviceName": "xvdcb", "NoDevice": {}}, {"DeviceName": "xvdcc", "NoDevice": {}}, {"DeviceName": "xvdcd", "NoDevice": {}}, {"DeviceName": "xvdce", "NoDevice": {}}, {"DeviceName": "xvdcf", "NoDevice": {}}, {"DeviceName": "xvdcg", "NoDevice": {}}, {"DeviceName": "xvdch", "NoDevice": {}}, {"DeviceName": "xvdci", "NoDevice": {}}, {"DeviceName": "xvdcj", "NoDevice": {}}, {"DeviceName": "xvdck", "NoDevice": {}}, {"DeviceName": "xvdcl", "NoDevice": {}}, {"DeviceName": "xvdcm", "NoDevice": {}}, {"DeviceName": "xvdcn", "NoDevice": {}}, {"DeviceName": "xvdco", "NoDevice": {}}, {"DeviceName": "xvdcp", "NoDevice": {}}, {"DeviceName": "xvdcq", "NoDevice": {}}, {"DeviceName": "xvdcr", "NoDevice": {}}, {"DeviceName": "xvdcs", "NoDevice": {}}, {"DeviceName": "xvdct", "NoDevice": {}}, {"DeviceName": "xvdcu", "NoDevice": {}}, {"DeviceName": "xvdcv", "NoDevice": {}}, {"DeviceName": "xvdcw", "NoDevice": {}}, {"DeviceName": "xvdcx", "NoDevice": {}}, {"DeviceName": "xvdcy", "NoDevice": {}}, {"DeviceName": "xvdcz", "NoDevice": {}} ], "Tags" : [{"Key" : "Name", "Value" : {"Fn::Join" : ["", [{"Ref" : "AWS::StackName"}, "-fileserver"]]}}], "NetworkInterfaces" : [{ "GroupSet" : [{"Ref" : "SecurityGroup"}], "AssociatePublicIpAddress" : "true", "DeviceIndex" : "0", "DeleteOnTermination" : "true", "SubnetId" : {"Ref" : "Subnet1"}}], "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -v\n", "cfn-init -v -s ", {"Ref": "AWS::StackName"}, " -r FileServerEC2Instance", " --region ", {"Ref": "AWS::Region"}, "\n", "exitcode=$?\n", "wget https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py\n", "while pgrep unattended-upgr > /dev/null; do sleep 1; done\n", "sudo python awslogs-agent-setup.py -n -r ", {"Ref": "AWS::Region"}, " -c /tmp/cwlogs/cwlogs.conf || error_exit 'Failed to run CloudWatch Logs agent setup'\n", "if [ $exitcode -ne 0 ]; then\n", " cfn-signal -e $exitcode -r 'cfn-init failed. See /var/log/cfn-init.log for details.' '", {"Ref": "FileServerWaitHandle"}, "'\n", " exit $exitcode\n", "fi\n", "if ", {"Fn::If": ["RunPostInstall", "true", "false"]}, "; then\n", " cfn-init -v -c post-install-script -s ", {"Ref": "AWS::StackName"}, " -r FileServerEC2Instance", " --region ", {"Ref": "AWS::Region"}, "\n", "fi\n", "chmod 777 /mnt\n", "export arcgis_cloud_platform=aws\n", "chef-solo -j /tmp/node.json -r https://agsstore6.s3.amazonaws.com/8321/cookbooks/arcgis-3.2.0-cookbooks.tar.gz -L /var/log/chef-run.log -l info\n", "exitcode=$?\n", "if [ $exitcode -ne 0 ]; then\n", " cfn-signal -e $exitcode -r 'Chef run failed. See /var/log/chef-run.log for details.' '", {"Ref": "FileServerWaitHandle"}, "'\n", " exit $exitcode\n", "fi\n", "cfn-signal -e 0 -r 'Setup complete' '", {"Ref": "FileServerWaitHandle"}, "'\n"]] } } }, "Metadata": { "AWS::CloudFormation::Authentication": { "S3AccessCreds": { "type": "S3", "buckets": [{"Ref": "DeploymentBucket"} ], "roleName": {"Ref": "IAMRole"} } }, "AWS::CloudFormation::Init": { "configSets" : { "default": ["config"], "post-install-script": ["post-install-config"] }, "post-install-config": { "sources" : { "/arcgis/postinstallscripts" : {"Fn::If": ["RunPostInstall", {"Fn::GetAtt": [ "ValidatePostInstallationScript", "S3ObjectURL" ]}, ""]} } }, "config": { "files": { "/tmp/cwlogs/cwlogs.conf": { "content": { "Fn::Join": ["", [ "[general]\n", "state_file= /var/awslogs/agent-state\n", "[/var/log/cfn-init.log]\n", "file = /var/log/cfn-init.log\n", "log_group_name = ", {"Ref": "DeploymentLogs"}, "\n", "log_stream_name = {instance_id}/cfn-init.log\n", "datetime_format = %d/%b/%Y:%H:%M:%S\n", "[/var/log/chef-run.log]\n", "file = /var/log/chef-run.log\n", "log_group_name = ", {"Ref": "DeploymentLogs"}, "\n", "log_stream_name = {instance_id}/chef-run.log\n", "datetime_format = %Y-%m-%dT%H:%M:%S%z\n", "[/var/lib/tomcat7/logs/catalina.out]\n", "file = /var/lib/tomcat7/logs/catalina.out\n", "log_group_name = ", {"Ref": "DeploymentLogs"}, "\n", "log_stream_name = {instance_id}/catalina.out\n", "datetime_format = %d/%b/%Y:%H:%M:%S"]] }, "mode" : "000755" }, "/tmp/node.json": { "content" : { "Fn::Join" : ["", [ "{\n", " \"arcgis\" : {\n", " \"post_install_script\" : \"/arcgis/postinstallscripts/deploy.sh\",\n", " \"server\" : {\n", " \"local_directories_root\" : \"/gisdata/arcgisserver\"\n", " }\n", " },\n", " \"run_list\" : [\n", " \"recipe[arcgis-enterprise::system]\",\n", " \"recipe[arcgis-enterprise::fileserver]\",\n", " \"recipe[arcgis-enterprise::post_install]\"]\n", "}\n"]] }, "mode" : "000755" } } } } } }, "FileServerRecoveryAlarm" : { "Type" : "AWS::CloudWatch::Alarm", "Properties" : { "AlarmDescription" : "Trigger a recovery when instance status check fails for 5 consecutive minutes.", "MetricName" : "StatusCheckFailed_System", "Namespace" : "AWS/EC2", "Statistic" : "Minimum", "Period" : "60", "EvaluationPeriods" : "5", "Threshold" : "0", "ComparisonOperator" : "GreaterThanThreshold", "AlarmActions" : [ {"Fn::Join" : ["", ["arn:", {"Ref" : "AWS::Partition"}, ":automate:", { "Ref" : "AWS::Region" }, ":ec2:recover" ]]} ], "Dimensions" : [ { "Name" : "InstanceId", "Value" : {"Ref" : "FileServerEC2Instance"} } ] } }, "PrimaryServerEC2Instance" : { "Type" : "AWS::EC2::Instance", "DependsOn" : "FileServerWaitCondition", "Properties" : { "ImageId" : {"Fn::FindInMap" : ["RegionMap", {"Ref":"AWS::Region"}, "en"]}, "InstanceType" : {"Ref":"ASInstanceType"}, "KeyName" : {"Ref":"KeyName"}, "IamInstanceProfile" : {"Ref":"IAMInstanceProfile"}, "Monitoring" : true, "BlockDeviceMappings": [ { "DeviceName": "/dev/sda1", "Ebs": { "VolumeSize": {"Ref": "DriveSizeRoot"}, "DeleteOnTermination": true, "VolumeType": "gp2" } }, { "DeviceName": "/dev/sdx", "Ebs": { "VolumeSize": {"Ref": "DriveSizeData"}, "DeleteOnTermination": true, "VolumeType": "gp2" } }, {"DeviceName": "xvdca", "NoDevice": {}}, {"DeviceName": "xvdcb", "NoDevice": {}}, {"DeviceName": "xvdcc", "NoDevice": {}}, {"DeviceName": "xvdcd", "NoDevice": {}}, {"DeviceName": "xvdce", "NoDevice": {}}, {"DeviceName": "xvdcf", "NoDevice": {}}, {"DeviceName": "xvdcg", "NoDevice": {}}, {"DeviceName": "xvdch", "NoDevice": {}}, {"DeviceName": "xvdci", "NoDevice": {}}, {"DeviceName": "xvdcj", "NoDevice": {}}, {"DeviceName": "xvdck", "NoDevice": {}}, {"DeviceName": "xvdcl", "NoDevice": {}}, {"DeviceName": "xvdcm", "NoDevice": {}}, {"DeviceName": "xvdcn", "NoDevice": {}}, {"DeviceName": "xvdco", "NoDevice": {}}, {"DeviceName": "xvdcp", "NoDevice": {}}, {"DeviceName": "xvdcq", "NoDevice": {}}, {"DeviceName": "xvdcr", "NoDevice": {}}, {"DeviceName": "xvdcs", "NoDevice": {}}, {"DeviceName": "xvdct", "NoDevice": {}}, {"DeviceName": "xvdcu", "NoDevice": {}}, {"DeviceName": "xvdcv", "NoDevice": {}}, {"DeviceName": "xvdcw", "NoDevice": {}}, {"DeviceName": "xvdcx", "NoDevice": {}}, {"DeviceName": "xvdcy", "NoDevice": {}}, {"DeviceName": "xvdcz", "NoDevice": {}} ], "Tags" : [{"Key" : "Name", "Value" : {"Fn::Join" : ["", [{"Ref" : "AWS::StackName"}, "-primary"]]}}], "NetworkInterfaces" : [{ "GroupSet" : [{"Ref" : "SecurityGroup"}], "AssociatePublicIpAddress" : "true", "DeviceIndex" : "0", "DeleteOnTermination" : "true", "SubnetId" : {"Ref" : "Subnet1"}}], "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -v\n", "for i in {1..60}; do ping -c1 $(hostname); if [ $? -eq 0 ]; then break; fi; sleep 10; done\n", "ping -c1 $(hostname)\n", "exitcode=$?\n", "if [ $exitcode -ne 0 ]; then\n", " cfn-signal -e $exitcode -r 'Failed to resolve the host name. Check the VPC settings.' '", {"Ref": "PrimaryServerWaitHandle"}, "'\n", " exit $exitcode\n", "fi\n", "if ", {"Fn::If": ["RunPostInstall", "true", "false"]}, "; then\n", " cfn-init -v -c post-install-script -s ", {"Ref": "AWS::StackName"}, " -r PrimaryServerEC2Instance", " --region ", {"Ref": "AWS::Region"}, "\n", "fi\n", "cfn-init -v -c firstpass -s ", {"Ref": "AWS::StackName"}, " -r PrimaryServerEC2Instance", " --region ", {"Ref": "AWS::Region"}, "\n", "cfn-init -v -c secondpass -s ", {"Ref": "AWS::StackName"}, " -r PrimaryServerEC2Instance", " --region ", {"Ref": "AWS::Region"}, "\n", "exitcode=$?\n", "wget https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py\n", "while pgrep unattended-upgr > /dev/null; do sleep 1; done\n", "sudo python awslogs-agent-setup.py -n -r ", {"Ref": "AWS::Region"}, " -c /tmp/cwlogs/cwlogs.conf || error_exit 'Failed to run CloudWatch Logs agent setup'\n", "if [ $exitcode -ne 0 ]; then\n", " cfn-signal -e $exitcode -r 'cfn-init failed. See /var/log/cfn-init.log for details.' '", {"Ref": "PrimaryServerWaitHandle"}, "'\n", " exit $exitcode\n", "fi\n", "chmod 777 /mnt\n", "export arcgis_cloud_platform=aws\n", "chef-solo -j /tmp/node.json -r https://agsstore6.s3.amazonaws.com/8321/cookbooks/arcgis-3.2.0-cookbooks.tar.gz -L /var/log/chef-run.log -l info\n", "exitcode=$?\n", "if [ $exitcode -ne 0 ]; then\n", " cfn-signal -e $exitcode -r 'Chef run failed. See /var/log/chef-run.log for details.' '", {"Ref": "PrimaryServerWaitHandle"}, "'\n", " exit $exitcode\n", "fi\n", "cfn-signal -e 0 -r 'Setup complete' '", {"Ref": "PrimaryServerWaitHandle"}, "'\n"]] } } }, "Metadata": { "AWS::CloudFormation::Authentication": { "S3AccessCreds": { "type": "S3", "buckets": [{"Ref": "DeploymentBucket"} ], "roleName": {"Ref": "IAMRole"} } }, "AWS::CloudFormation::Init": { "configSets" : { "firstpass" : [ "config1" ], "secondpass" : [ "config2" ], "post-install-script": ["post-install-config"] }, "post-install-config": { "sources" : { "/arcgis/postinstallscripts" : {"Fn::If": ["RunPostInstall", {"Fn::GetAtt": [ "ValidatePostInstallationScript", "S3ObjectURL" ]}, ""]} } }, "config1": { "sources": { "/usr/local/lib/python2.7/dist-packages/cfnbootstrap/resources/documents" : "https://arcgisstore106.s3.amazonaws.com/endpoints.tar.gz" } }, "config2": { "commands": { "rename-server-license": { "command": {"Fn::Join": ["", ["mv /tmp/server_license.tmp /tmp/", {"Ref": "ServerLicenseFile"}]]} } }, "files": { "/tmp/cwlogs/cwlogs.conf": { "content": {"Fn::Join": ["", [ "[general]\n", "state_file= /var/awslogs/agent-state\n", "[/var/log/cfn-init.log]\n", "file = /var/log/cfn-init.log\n", "log_group_name = ", {"Ref": "DeploymentLogs"}, "\n", "log_stream_name = {instance_id}/cfn-init.log\n", "datetime_format = %d/%b/%Y:%H:%M:%S\n", "[/var/log/chef-run.log]\n", "file = /var/log/chef-run.log\n", "log_group_name = ", {"Ref": "DeploymentLogs"}, "\n", "log_stream_name = {instance_id}/chef-run.log\n", "datetime_format = %Y-%m-%dT%H:%M:%S%z\n", "[/var/lib/tomcat7/logs/catalina.out]\n", "file = /var/lib/tomcat7/logs/catalina.out\n", "log_group_name = ", {"Ref": "DeploymentLogs"}, "\n", "log_stream_name = {instance_id}/catalina.out\n", "datetime_format = %d/%b/%Y:%H:%M:%S"]] }, "mode" : "000755" }, "/tmp/server_license.tmp": { "source": {"Fn::GetAtt": [ "ValidateServerLicenseFile", "S3ObjectURL" ]}, "authentication": "S3AccessCreds", "mode" : "000755" }, "/tmp/node.json": { "content" : { "Fn::Join" : ["", [ "{\n", " \"arcgis\" : {\n", " \"post_install_script\" : \"/arcgis/postinstallscripts/deploy.sh\",\n", " \"hosts\" : {\r", " \"FILESERVER\" : \"", {"Fn::GetAtt" : [ "FileServerEC2Instance", "PrivateIp" ]}, "\"\n", " },\r", " \"server\" : {\n", " \"admin_username\" : \"", {"Ref" : "SiteAdmin"}, "\",\n", " \"admin_password\" : \"", {"Ref" : "SiteAdminPassword" }, "\",\n", " \"authorization_file\" : \"/tmp/", {"Ref": "ServerLicenseFile"}, "\",\n", " \"log_level\" : \"WARNING\",\n", " \"directories_root\" : \"/net/FILESERVER/gisdata/arcgisserver\",\n", " \"log_dir\" : \"/gisdata/arcgisserver/logs/\",\n", " \"config_store_type\" : \"", {"Fn::If": ["UseCloudStore", "AMAZON", "FILESYSTEM"]}, "\",\r\n", " \"config_store_connection_string\" : \"", {"Fn::If": ["UseCloudStore", {"Fn::Join" : ["", ["NAMESPACE=", {"Ref" : "AWS::StackName"}, ";REGION=", { "Ref" : "AWS::Region" } ]]}, "/net/FILESERVER/gisdata/arcgisserver/config-store"]}, "\",\n", " \"install_system_requirements\" : false,\n", " \"soc_max_heap_size\" : 64\n", " },\n", " \"rds\" : {\n", " \"engine\" : \"postgres\",\n", " \"endpoint\" : \"", {"Fn::If": ["CreateDBInstance", {"Fn::GetAtt": [ "DBInstance", "Endpoint.Address" ]}, ""]}, "\",\n", " \"username\" : \"EsriRDSAdmin\",\n", " \"password\" : \"", {"Ref" : "SiteAdminPassword" }, "\"\n", " }\n", " },\n", " \"run_list\" : [\n", " \"recipe[arcgis-enterprise::system]\",\n", " \"recipe[arcgis-enterprise::server]\",\n", " \"recipe[arcgis-enterprise::rds_egdb]\",\n", " \"recipe[arcgis-enterprise::post_install]\"]\n", "}\n"]] } } } } } } }, "PrimaryServerRecoveryAlarm" : { "Type" : "AWS::CloudWatch::Alarm", "Properties" : { "AlarmDescription" : "Trigger a recovery when instance status check fails for 5 consecutive minutes.", "MetricName" : "StatusCheckFailed_System", "Namespace" : "AWS/EC2", "Statistic" : "Minimum", "Period" : "60", "EvaluationPeriods" : "5", "Threshold" : "0", "ComparisonOperator" : "GreaterThanThreshold", "AlarmActions" : [ {"Fn::Join" : ["", ["arn:", {"Ref" : "AWS::Partition"}, ":automate:", { "Ref" : "AWS::Region" }, ":ec2:recover" ]]} ], "Dimensions" : [ { "Name" : "InstanceId", "Value" : {"Ref" : "PrimaryServerEC2Instance"} } ] } }, "LaunchConfig" : { "Type" : "AWS::AutoScaling::LaunchConfiguration", "DependsOn" : "PrimaryServerWaitCondition", "Properties" : { "AssociatePublicIpAddress" : true, "ImageId" : {"Fn::FindInMap" : ["RegionMap", {"Ref":"AWS::Region"}, "en"]}, "InstanceType" : {"Ref" : "ASInstanceType"}, "KeyName" : {"Ref" : "KeyName"}, "IamInstanceProfile" : {"Ref" : "IAMInstanceProfile"}, "SecurityGroups" : [ {"Ref" : "SecurityGroup"} ], "InstanceMonitoring" : true, "BlockDeviceMappings": [ { "DeviceName": "/dev/sda1", "Ebs": { "VolumeSize": {"Ref": "DriveSizeRoot"}, "DeleteOnTermination": true, "VolumeType": "gp2" } }, { "DeviceName": "/dev/sdx", "Ebs": { "VolumeSize": {"Ref": "DriveSizeData"}, "DeleteOnTermination": true, "VolumeType": "gp2" } }], "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "#!/bin/bash -v\n", "for i in {1..60}; do ping -c1 $(hostname); if [ $? -eq 0 ]; then break; fi; sleep 10; done\n", "ping -c1 $(hostname)\n", "exitcode=$?\n", "if [ $exitcode -ne 0 ]; then\n", " cfn-signal -e $exitcode -r 'Failed to resolve the host name. Check the VPC settings.' '", {"Ref": "AutoScalingGroupWaitHandle"}, "'\n", " exit $exitcode\n", "fi\n", "if ", {"Fn::If": ["RunPostInstall", "true", "false"]}, "; then\n", " cfn-init -v -c post-install-script -s ", {"Ref": "AWS::StackName"}, " -r LaunchConfig", " --region ", {"Ref": "AWS::Region"}, "\n", "fi\n", "cfn-init -v -c firstpass -s ", {"Ref": "AWS::StackName"}, " -r LaunchConfig", " --region ", {"Ref": "AWS::Region"}, "\n", "cfn-init -v -c secondpass -s ", {"Ref": "AWS::StackName"}, " -r LaunchConfig", " --region ", {"Ref": "AWS::Region"}, "\n", "exitcode=$?\n", "wget https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py\n", "while pgrep unattended-upgr > /dev/null; do sleep 1; done\n", "sudo python awslogs-agent-setup.py -n -r ", {"Ref": "AWS::Region"}, " -c /tmp/cwlogs/cwlogs.conf || error_exit 'Failed to run CloudWatch Logs agent setup'\n", "if [ $exitcode -ne 0 ]; then\n", " cfn-signal -e $exitcode -r 'cfn-init failed. See /var/log/cfn-init.log for details.' '", {"Ref": "AutoScalingGroupWaitHandle"}, "'\n", " exit $exitcode\n", "fi\n", "chmod 777 /mnt\n", "export arcgis_cloud_platform=aws\n", "chef-solo -j /tmp/node.json -r https://agsstore6.s3.amazonaws.com/8321/cookbooks/arcgis-3.2.0-cookbooks.tar.gz -L /var/log/chef-run.log -l info\n", "exitcode=$?\n", "if [ $exitcode -ne 0 ]; then\n", " cfn-signal -e $exitcode -r 'Chef run failed. See /var/log/chef-run.log for details.' '", {"Ref": "AutoScalingGroupWaitHandle"}, "'\n", " exit $exitcode\n", "fi\n", "cfn-signal -e 0 -r 'Setup complete' '", {"Ref": "AutoScalingGroupWaitHandle"}, "'\n"] ] } } }, "Metadata" : { "AWS::CloudFormation::Authentication" : { "S3AccessCreds" : { "type" : "S3", "buckets" : [ {"Ref" : "DeploymentBucket"} ], "roleName" : {"Ref" : "IAMRole"} } }, "AWS::CloudFormation::Init" : { "configSets" : { "firstpass" : [ "config1" ], "secondpass" : [ "config2" ], "post-install-script": [ "post-install-config" ] }, "post-install-config": { "sources" : { "/arcgis/postinstallscripts" : {"Fn::If": ["RunPostInstall", {"Fn::GetAtt": [ "ValidatePostInstallationScript", "S3ObjectURL" ]}, ""]} } }, "config1": { "sources": { "/usr/local/lib/python2.7/dist-packages/cfnbootstrap/resources/documents" : "https://arcgisstore106.s3.amazonaws.com/endpoints.tar.gz" } }, "config2": { "commands": { "rename-server-license": { "command": {"Fn::Join": ["", ["mv /tmp/server_license.tmp /tmp/", {"Ref": "ServerLicenseFile"}]]} } }, "files": { "/tmp/cwlogs/cwlogs.conf": { "content": { "Fn::Join": ["", [ "[general]\n", "state_file= /var/awslogs/agent-state\n", "[/var/log/cfn-init.log]\n", "file = /var/log/cfn-init.log\n", "log_group_name = ", {"Ref": "DeploymentLogs"}, "\n", "log_stream_name = {instance_id}/cfn-init.log\n", "datetime_format = %d/%b/%Y:%H:%M:%S\n", "[/var/log/chef-run.log]\n", "file = /var/log/chef-run.log\n", "log_group_name = ", {"Ref": "DeploymentLogs"}, "\n", "log_stream_name = {instance_id}/chef-run.log\n", "datetime_format = %Y-%m-%dT%H:%M:%S%z\n", "[/var/lib/tomcat7/logs/catalina.out]\n", "file = /var/lib/tomcat7/logs/catalina.out\n", "log_group_name = ", {"Ref": "DeploymentLogs"}, "\n", "log_stream_name = {instance_id}/catalina.out\n", "datetime_format = %d/%b/%Y:%H:%M:%S"]] }, "mode" : "000755" }, "/tmp/server_license.tmp": { "source": {"Fn::GetAtt": [ "ValidateServerLicenseFile", "S3ObjectURL" ]}, "authentication": "S3AccessCreds", "mode" : "000755" }, "/tmp/node.json": { "content" : { "Fn::Join" : [ "", [ "{\n", " \"arcgis\" : {\n", " \"post_install_script\" : \"/arcgis/postinstallscripts/deploy.sh\",\n", " \"hosts\" : {\r", " \"FILESERVER\" : \"", {"Fn::GetAtt" : [ "FileServerEC2Instance", "PrivateIp" ]}, "\"\n", " },\r", " \"server\" : {\n", " \"admin_username\" : \"", {"Ref" : "SiteAdmin"}, "\",\n", " \"admin_password\" : \"", {"Ref" : "SiteAdminPassword" }, "\",\n", " \"authorization_file\" : \"/tmp/", {"Ref": "ServerLicenseFile"}, "\",\n", " \"primary_server_url\" : \"http://", { "Fn::GetAtt" : [ "PrimaryServerEC2Instance", "PrivateIp" ] }, ":6080/arcgis\",\n", " \"use_join_site_tool\" : true,\n", " \"config_store_type\" : \"", {"Fn::If": ["UseCloudStore", "AMAZON", "FILESYSTEM"]}, "\",\r\n", " \"config_store_connection_string\" : \"", {"Fn::If": ["UseCloudStore", {"Fn::Join" : ["", ["NAMESPACE=", {"Ref" : "AWS::StackName"}, ";REGION=", { "Ref" : "AWS::Region" } ]]}, "/net/FILESERVER/gisdata/arcgisserver/config-store"]}, "\",\n", " \"install_system_requirements\" : false,\n", " \"soc_max_heap_size\" : 64\n", " }\n", " },\n", " \"run_list\" : [\n", " \"recipe[arcgis-enterprise::system]\",\n", " \"recipe[arcgis-enterprise::server_node]\",\n", " \"recipe[arcgis-enterprise::post_install]\"]\n", "}\n" ] ] }, "mode" : "000755" } } } } } }, "AutoScalingGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "DependsOn" : "FileServerEC2Instance", "Properties" : { "VPCZoneIdentifier" : [ {"Ref" : "Subnet2"} ], "Cooldown" : "300", "MaxSize" : {"Ref" : "SecondaryInstances"}, "MinSize" : {"Ref" : "SecondaryInstances"}, "LaunchConfigurationName" : {"Ref" : "LaunchConfig"}, "HealthCheckType" : "EC2", "HealthCheckGracePeriod" : "3600", "LoadBalancerNames" : [ {"Fn::If": ["NewELB", {"Ref" : "ELB"}, {"Ref" :"ELBName"}]} ], "Tags" : [ { "Key" : "Name", "Value" : {"Fn::Join" : ["", [{"Ref" : "AWS::StackName"}, "-secondary"]]}, "PropagateAtLaunch" : true } ] }, "UpdatePolicy": { "AutoScalingReplacingUpdate": { "WillReplace": "true" } } }, "FileServerWaitHandle" : { "Type" : "AWS::CloudFormation::WaitConditionHandle", "Properties" : {} }, "FileServerWaitCondition" : { "Type" : "AWS::CloudFormation::WaitCondition", "Properties" : { "Count" : "1", "Handle" : {"Ref" : "FileServerWaitHandle"}, "Timeout" : "7200" } }, "PrimaryServerWaitHandle" : { "Type" : "AWS::CloudFormation::WaitConditionHandle", "Properties" : {} }, "PrimaryServerWaitCondition" : { "Type" : "AWS::CloudFormation::WaitCondition", "Properties" : { "Count" : "1", "Handle" : {"Ref" : "PrimaryServerWaitHandle"}, "Timeout" : "10800" } }, "AutoScalingGroupWaitHandle" : { "Type" : "AWS::CloudFormation::WaitConditionHandle", "Properties" : {} }, "AutoScalingGroupWaitCondition" : { "Type" : "AWS::CloudFormation::WaitCondition", "Properties" : { "Count" : {"Ref" : "SecondaryInstances"}, "Handle" : {"Ref" : "AutoScalingGroupWaitHandle"}, "Timeout" : "10800" } }, "CloudWatchSettings" : { "Type" : "AWS::Logs::MetricFilter", "Properties": { "LogGroupName": {"Ref": "DeploymentLogs"}, "FilterPattern": "[level=FATAL, message]", "MetricTransformations": [{ "MetricValue": "1", "MetricNamespace": "ArcGIS/Deployment", "MetricName": "ErrorCount" }] } }, "DBSubnetGroup" : { "Type" : "AWS::RDS::DBSubnetGroup", "Condition": "CreateDBInstance", "Properties" : { "DBSubnetGroupDescription" : "DB subnet group", "SubnetIds" : [ {"Ref": "Subnet1"}, {"Ref": "Subnet2"} ], "Tags" : [{"Key" : "Name", "Value" : {"Fn::Join" : ["", [{"Ref" : "AWS::StackName"}, "-db"]]}}] } }, "DBInstance" : { "Type" : "AWS::RDS::DBInstance", "Condition": "CreateDBInstance", "Properties" : { "AllocatedStorage" : {"Ref": "DBAllocatedStorage"}, "DBInstanceClass" : {"Ref" : "DBInstanceClass"}, "Engine" : {"Ref": "DBEngine"}, "EngineVersion" : {"Fn::FindInMap" : ["DBEngineProperties", {"Ref": "DBEngine"}, "Version"]}, "LicenseModel": {"Fn::FindInMap" : ["DBEngineProperties", {"Ref": "DBEngine"}, "License"]}, "MultiAZ" : {"Fn::If": ["DBEnginePostgres", "true", {"Ref": "AWS::NoValue"}]}, "DBSubnetGroupName": {"Ref": "DBSubnetGroup"}, "VPCSecurityGroups": [{"Ref": "SecurityGroup"}], "StorageType": "gp2", "MasterUsername" : "EsriRDSAdmin", "MasterUserPassword" : { "Ref" : "SiteAdminPassword" }, "Tags" : [{"Key" : "Name", "Value" : {"Fn::Join" : ["", [{"Ref" : "AWS::StackName"}, "-db"]]}}] } } }, "Outputs" : { "ManagerURL" : { "Value" : {"Fn::Join" : [ "", [ "https://", {"Fn::GetAtt" : ["ELBAttributes", "DNSName"]}, "/arcgis/manager" ]]}, "Description" : "ArcGIS Server Manager URL" }, "RestURL" : { "Value" : {"Fn::Join" : [ "", [ "https://", {"Fn::GetAtt" : ["ELBAttributes", "DNSName"]}, "/arcgis/rest" ]]}, "Description" : "ArcGIS REST Services Directory URL" }, "LogsURL" : { "Value" : {"Fn::Join" : [ "", [ "https://console.aws.amazon.com/cloudwatch/home?region=", {"Ref" : "AWS::Region"}, "#logStream:group=", {"Ref" : "DeploymentLogs"}]]}, "Description" : "Deployment Logs" }, "DNSName" : { "Description" : "Elastic load balancer DNS name", "Value" : {"Fn::GetAtt" : ["ELBAttributes", "DNSName"]} }, "StopStackFunction": { "Value" : {"Fn::Join": ["", [ "https://console.aws.amazon.com/lambda/home?region=", {"Ref": "AWS::Region"}, "#/functions/", {"Ref": "StopStackFunction"} ] ]}, "Description" : "Lambda function used to stop all EC2 instances in the stack." }, "StartStackFunction": { "Value" : {"Fn::Join": ["", [ "https://console.aws.amazon.com/lambda/home?region=", {"Ref": "AWS::Region"}, "#/functions/", {"Ref": "StartStackFunction"} ] ]}, "Description" : "Lambda function used to start all EC2 instances in the stack." }, "VPCId" : { "Value" : {"Ref" : "VPCId"}, "Description" : "VPC ID" }, "Subnet1" : { "Value" : {"Ref" : "Subnet1"}, "Description" : "VPC subnet 1" }, "Subnet2" : { "Value" : {"Ref" : "Subnet2"}, "Description" : "VPC subnet 2" }, "DeploymentBucket" : { "Value" : {"Ref" : "DeploymentBucket"}, "Description" : "Deployment S3 bucket" }, "SecurityGroup" : { "Value" : {"Ref" : "SecurityGroup"}, "Description" : "Security group" }, "ELBName" : { "Value" : {"Fn::If": ["NewELB", {"Ref" : "ELB"}, {"Ref" :"ELBName"}]}, "Description" : "ELB name" }, "FileServerEC2InstancePrivateIp" : { "Value" : { "Fn::GetAtt" : [ "FileServerEC2Instance", "PrivateIp" ] }, "Description" : "Private IP address of the file server EC2 instance" }, "StoreType" : { "Value" : {"Ref" : "StoreType" }, "Description" : "ArcGIS Server config store type" } } }