{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "ArcGIS CloudFormation Template: Provisions an ArcGIS for Server site on EC2 instances running Windows. **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-0f1e8569" }, "ap-northeast-2": { "en": "ami-0a7ede64" }, "ap-south-1": { "en": "ami-5f7f2830" }, "ap-southeast-1": { "en": "ami-bc5321c0" }, "ap-southeast-2": { "en": "ami-386b965a" }, "ca-central-1": { "en": "ami-cca124a8" }, "eu-central-1": { "en": "ami-29b82546" }, "eu-west-1": { "en": "ami-a68d10df" }, "eu-west-2": { "en": "ami-6878630c" }, "sa-east-1": { "en": "ami-6c96d400" }, "us-east-1": { "en": "ami-1a507560" }, "us-east-2": { "en": "ami-917b51f4" }, "us-west-1": { "en": "ami-e0c1c280" }, "us-west-2": { "en": "ami-edc87e95" } }, "DBEngineProperties" : { "sqlserver-se" : {"MajorVersion": "13.00", "Version": "13.00.4422.0.v1", "License": "license-included"}, "postgres" : {"MajorVersion": "9.5", "Version": "9.5.2", "License": "postgresql-license"} } }, "Parameters" : { "DeploymentBucket" : { "Description" : "S3 bucket with software authorization and SSL certificate files", "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", "m5.large", "m5.xlarge", "m5.2xlarge", "m5.4xlarge", "m5.12xlarge", "m5.24xlarge", "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", "ConstraintDescription" : "Only C3, C4, M3, and R3 instance types are supported" }, "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", "m5.large", "m5.xlarge", "m5.2xlarge", "m5.4xlarge", "m5.12xlarge", "m5.24xlarge", "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." }, "RunAsUserPassword" : { "Description" : "Password for ArcGIS Server account", "Type" : "String", "NoEcho" : "true", "AllowedPattern": "(?!.*arcgis)(?!.*Arc)(?!.*GIS)(?!.*user)(?!.*account)(?=[^\\\\\\\"]{8,})(?=.*?[^\\w\\s])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*", "ConstraintDescription": "Password must be at least eight characters in length and must contain characters from three of the following four categories: English uppercase characters (A through Z), English lowercase characters (a through z), digits (0 through 9), non-alphabetic characters (for example, !, $, #, %). Password must not contain backslashes (\\) or quotation marks (\"). Password must not contain the user's account name (arcgis) or parts of the user's full name (ArcGIS user account) that exceed two consecutive 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 an existing ELB is used)", "Type": "String", "Default" : "", "ConstraintDescription": "arn:aws:acm:::certificate/" }, "DBEngine": { "Description": "RDS engine", "Type": "String", "AllowedValues": ["none", "sqlserver-se", "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" : { "Description" : "The allocated storage size of RDS instance specified in gigabytes (GB).", "Default" : "200", "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", "RunAsUserPassword" ] } ] } }, "Conditions" : { "CreateDBInstance" : {"Fn::Not" : [{"Fn::Equals" : [{"Ref" : "DBEngine"}, "none"]}]}, "DBEngineSQLServer" : {"Fn::Equals" : [{"Ref" : "DBEngine"}, "sqlserver-se"]}, "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"]}]}, "SSMSupported" : {"Fn::Not" : [{"Fn::Or": [{"Fn::Equals" : [{"Ref" : "AWS::Region"}, "eu-west-2"]}, {"Fn::Equals" : [{"Ref" : "AWS::Region"}, "ap-south-1"]}, {"Fn::Equals" : [{"Ref" : "AWS::Region"}, "ca-central-1"]}]}]}, "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": {"Fn::Join" : ["", [{"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", "Properties" : { "AssumeRolePolicyDocument" : { "Statement" : [ { "Effect" : "Allow", "Principal" : { "Service" : [ "ec2.amazonaws.com", "ssm.amazonaws.com" ] }, "Action" : [ "sts:AssumeRole" ] } ] }, "Path" : "/" } }, "IAMPolicy" : { "Type" : "AWS::IAM::Policy", "DependsOn" : "LambdaExecutionRole", "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": "xvdg", "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" : [ "", [ "\r\n", "try \r\n", "{ \r\n", " if (", {"Fn::If": ["RunPostInstall", "$true", "$false"]}, ") {\r\n", " cfn-init -v -c post-install-script -s ", {"Ref": "AWS::StackName"}, " -r CloudWatchSettings", " --region ", {"Ref": "AWS::Region"}, "\r\n", " } \r\n", " $stackName = '", {"Ref": "AWS::StackName"}, "' \r\n", " $region = '", {"Ref": "AWS::Region"}, "' \r\n", " $waitHandle = '", {"Ref": "FileServerWaitHandle"}, "' \r\n", " $InstanceName = 'FileServerEC2Instance' \r\n", " $NodeJSONPath = 'C:\\\\chef\\\\node.json' \r\n", " $ChefLogFile = 'C:\\\\chef\\\\chef-run.log' \r\n", " $execName = \"cfn-init\" \r\n", " $execArgs = \"-v -s $stackName -r CloudWatchSettings --region $region\" \r\n", " $process = Start-Process $execName -PassThru -Wait -ArgumentList $execArgs.Split(' ') \r\n", " if ($process.ExitCode -ne 0) { \r\n", " throw \"Process 'cfn-init' exit code : $($process.ExitCode)\" \r\n", " } \r\n", " \r\n", " $execArgs = \"-v -s $stackName -r $InstanceName --region $region\" \r\n", " $process = Start-Process $execName -PassThru -Wait -ArgumentList $execArgs.Split(' ') \r\n", " if ($process.ExitCode -ne 0) { \r\n", " throw \"Process 'cfn-init' exit code : $($process.ExitCode)\" \r\n", " } \r\n", " \r\n", " $process = Start-Process chef-solo -PassThru -Wait -ArgumentList (\"-j\", $NodeJSONPath, \"-L\",$ChefLogFile, \"-l\", \"info\") \r\n", " if ($process.ExitCode -ne 0) { \r\n", " throw \"Chef run failed. See 'C:\\\\chef\\\\chef-run.log' for details.\" \r\n", " } \r\n", " \r\n", " $process = Start-Process cfn-signal -PassThru -Wait -ArgumentList $waitHandle \r\n", " if ($process.ExitCode -ne 0) { \r\n", " throw \"Process 'cfn-signal' exit code : $($process.ExitCode)\" \r\n", " } \r\n", "} \r\n", "catch \r\n", "{ \r\n", " Write-Output \"ERROR: $($_.Exception.Message)\" \r\n", " cfn-signal -e 1 -r \"$($_.Exception.Message)\" \"$WaitHandle\" \r\n", "} \r\n", "\r\n" ] ] } } }, "Metadata" : { "AWS::CloudFormation::Authentication" : { "S3AccessCreds" : { "type" : "S3", "buckets" : [ { "Ref" : "DeploymentBucket" } ], "roleName" : { "Ref" : "IAMRole" } } }, "AWS::CloudFormation::Init" : { "config" : { "files" : { "C:\\chef\\node.json" : { "content" : { "Fn::Join" : ["", [ "{\r\n", " \"arcgis\" : {\r\n", " \"run_as_password\" : \"", {"Ref" : "RunAsUserPassword"}, "\",\r\n", " \"post_install_script\" : \"D:\\\\PostInstallScripts\\\\deploy.bat\",\r\n", " \"server\" : {\r\n", " \"local_directories_root\" : \"D:\\\\arcgisserver\"\r\n", " }\r\n", " },\r\n", " \"run_list\" : [\n", " \"recipe[arcgis-enterprise::system]\",\r\n", " \"recipe[arcgis-enterprise::fileserver]\",\r\n", " \"recipe[arcgis-enterprise::post_install]\"]\r\n", "}\r\n"]] } } } } } } }, "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": "xvdg", "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" : [ "", [ "\r\n", "try \r\n", "{\r\n", " if (", {"Fn::If": ["RunPostInstall", "$true", "$false"]}, ") {\r\n", " cfn-init -v -c post-install-script -s ", {"Ref": "AWS::StackName"}, " -r CloudWatchSettings", " --region ", {"Ref": "AWS::Region"}, "\r\n", " }\r\n", " $stackName = '", {"Ref": "AWS::StackName"}, "' \r\n", " $region = '", {"Ref": "AWS::Region"}, "' \r\n", " $waitHandle = '", {"Ref": "PrimaryServerWaitHandle"}, "' \r\n", " $InstanceName = 'PrimaryServerEC2Instance' \r\n", " $NodeJSONPath = 'C:\\\\chef\\\\node.json' \r\n", " $ChefLogFile = 'C:\\\\chef\\\\chef-run.log' \r\n", " $execName = \"cfn-init\" \r\n", " $execArgs = \"-v -s $stackName -r CloudWatchSettings --region $region\" \r\n", " $process = Start-Process $execName -PassThru -Wait -ArgumentList $execArgs.Split(' ') \r\n", " if ($process.ExitCode -ne 0) { \r\n", " throw \"Process 'cfn-init' exit code : $($process.ExitCode)\" \r\n", " }\r\n", "\r\n", " $execArgs = \"-v -s $stackName -r $InstanceName --region $region\" \r\n", " $process = Start-Process $execName -PassThru -Wait -ArgumentList $execArgs.Split(' ') \r\n", " if ($process.ExitCode -ne 0) { \r\n", " throw \"Process 'cfn-init' exit code : $($process.ExitCode)\" \r\n", " }\r\n", "\r\n", " $process = Start-Process chef-solo -PassThru -Wait -ArgumentList (\"-j\", $NodeJSONPath, \"-L\",$ChefLogFile, \"-l\", \"info\") \r\n", " if ($process.ExitCode -ne 0) { \r\n", " throw \"Chef run failed. See 'C:\\\\chef\\\\chef-run.log' for details.\" \r\n", " }\r\n", "\r\n", " $process = Start-Process cfn-signal -PassThru -Wait -ArgumentList $waitHandle \r\n", " if ($process.ExitCode -ne 0) { \r\n", " throw \"Process 'cfn-signal' exit code : $($process.ExitCode)\" \r\n", " }\r\n", "}\r\n", "catch\r\n", "{ \r\n", " Write-Output \"ERROR: $($_.Exception.Message)\"\r\n", " cfn-signal -e 1 -r \"$($_.Exception.Message)\" \"$WaitHandle\"\r\n", "}\r\n", "\r\n" ] ] } } }, "Metadata" : { "AWS::CloudFormation::Authentication" : { "S3AccessCreds" : { "type" : "S3", "buckets" : [ { "Ref" : "DeploymentBucket" } ], "roleName" : { "Ref" : "IAMRole" } } }, "AWS::CloudFormation::Init" : { "config" : { "commands": { "rename-server-license" : { "command": {"Fn::Join": ["", ["move C:\\Temp\\server_license.tmp C:\\Temp\\", {"Ref": "ServerLicenseFile"}]]} } }, "files" : { "C:\\Temp\\server_license.tmp": { "source": {"Fn::GetAtt": [ "ValidateServerLicenseFile", "S3ObjectURL" ]}, "authentication": "S3AccessCreds" }, "C:\\chef\\node.json" : { "content" : { "Fn::Join" : ["", [ "{\r\n", " \"arcgis\" : {\r\n", " \"run_as_password\" : \"", {"Ref" : "RunAsUserPassword"}, "\",\r\n", " \"post_install_script\" : \"D:\\\\PostInstallScripts\\\\deploy.bat\",\r\n", " \"hosts\" : {\r\n", " \"FILESERVER\" : \"", {"Fn::GetAtt" : [ "FileServerEC2Instance", "PrivateIp" ]}, "\"\r\n", " },\r\n", " \"server\" : {\r\n", " \"admin_username\" : \"", {"Ref" : "SiteAdmin"}, "\",\r\n", " \"admin_password\" : \"", {"Ref" : "SiteAdminPassword" }, "\",\r\n", " \"authorization_file\" : \"C:\\\\Temp\\\\", {"Ref": "ServerLicenseFile"}, "\",\r\n", " \"log_level\" : \"WARNING\",\r\n", " \"soc_max_heap_size\" : 64,\r\n", " \"directories_root\" : \"\\\\\\\\FILESERVER\",\r\n", " \"log_dir\" : \"D:\\\\arcgisserver\\\\logs\",\r\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" } ]]}, "\\\\\\\\FILESERVER\\\\config-store"]}, "\"\r\n", " },\r\n", " \"rds\" : {\r\n", " \"engine\" : \"", {"Ref": "DBEngine"}, "\",\r\n", " \"endpoint\" : \"", {"Fn::If": ["CreateDBInstance", {"Fn::GetAtt": [ "DBInstance", "Endpoint.Address" ]}, "" ]}, "\",\r\n", " \"username\" : \"EsriRDSAdmin\",\r\n", " \"password\" : \"", {"Ref" : "SiteAdminPassword" }, "\"\r\n", " }\r\n", " },\r\n", " \"run_list\" : [\r\n", " \"recipe[arcgis-enterprise::system]\",\r\n", " \"recipe[esri-iis]\",\r\n", " \"recipe[arcgis-enterprise::server]\",\r\n", " \"recipe[arcgis-enterprise::sql_alias]\",\r\n", " \"recipe[arcgis-enterprise::rds_egdb]\",\r\n", " \"recipe[arcgis-enterprise::post_install]\"]\r\n", "}\r\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": "xvdg", "Ebs": { "VolumeSize": {"Ref": "DriveSizeData"}, "DeleteOnTermination": true, "VolumeType": "gp2" } }], "UserData" : { "Fn::Base64" : { "Fn::Join" : [ "", [ "\r\n", "try \r\n", "{ \r\n", " if (", {"Fn::If": ["RunPostInstall", "$true", "$false"]}, ") {\r\n", " cfn-init -v -c post-install-script -s ", {"Ref": "AWS::StackName"}, " -r CloudWatchSettings", " --region ", {"Ref": "AWS::Region"}, "\r\n", " } \r\n", " $stackName = '", {"Ref": "AWS::StackName"}, "' \r\n", " $region = '", {"Ref": "AWS::Region"}, "' \r\n", " $waitHandle = '", {"Ref": "AutoScalingGroupWaitHandle"}, "' \r\n", " $InstanceName = 'LaunchConfig' \r\n", " $NodeJSONPath = 'C:\\\\chef\\\\node.json' \r\n", " $ChefLogFile = 'C:\\\\chef\\\\chef-run.log' \r\n", " $execName = \"cfn-init\" \r\n", " $execArgs = \"-v -s $stackName -r CloudWatchSettings --region $region\" \r\n", " $process = Start-Process $execName -PassThru -Wait -ArgumentList $execArgs.Split(' ') \r\n", " if ($process.ExitCode -ne 0) { \r\n", " throw \"Process 'cfn-init' exit code : $($process.ExitCode)\" \r\n", " } \r\n", " \r\n", " $execArgs = \"-v -s $stackName -r $InstanceName --region $region\" \r\n", " $process = Start-Process $execName -PassThru -Wait -ArgumentList $execArgs.Split(' ') \r\n", " if ($process.ExitCode -ne 0) { \r\n", " throw \"Process 'cfn-init' exit code : $($process.ExitCode)\" \r\n", " } \r\n", " \r\n", " $process = Start-Process chef-solo -PassThru -ArgumentList (\"-j\", $NodeJSONPath, \"-L\",$ChefLogFile, \"-l\", \"info\") \r\n", " $handle = $process.Handle\r\n", " $process.WaitForExit()\r\n", " if ($process.ExitCode -ne 0) { \r\n", " throw \"Chef run failed. See 'C:\\\\chef\\\\chef-run.log' for details.\" \r\n", " } \r\n", " \r\n", " $process = Start-Process cfn-signal -PassThru -Wait -ArgumentList $waitHandle \r\n", " if ($process.ExitCode -ne 0) { \r\n", " throw \"Process 'cfn-signal' exit code : $($process.ExitCode)\" \r\n", " } \r\n", "} \r\n", "catch \r\n", "{ \r\n", " Write-Output \"ERROR: $($_.Exception.Message)\" \r\n", " cfn-signal -e 1 -r \"$($_.Exception.Message)\" \"$WaitHandle\" \r\n", "} \r\n", "\r\n" ] ] } } }, "Metadata" : { "AWS::CloudFormation::Authentication" : { "S3AccessCreds" : { "type" : "S3", "buckets" : [ {"Ref" : "DeploymentBucket"} ], "roleName" : {"Ref" : "IAMRole"} } }, "AWS::CloudFormation::Init" : { "config" : { "commands": { "rename-server-license" : { "command": {"Fn::Join": ["", ["move C:\\Temp\\server_license.tmp C:\\Temp\\", {"Ref": "ServerLicenseFile"}]]} } }, "files" : { "C:\\Temp\\server_license.tmp": { "source": {"Fn::GetAtt": [ "ValidateServerLicenseFile", "S3ObjectURL" ]}, "authentication": "S3AccessCreds" }, "C:\\chef\\node.json" : { "content" : { "Fn::Join" : [ "", [ "{\r\n", " \"arcgis\" : {\r\n", " \"run_as_password\" : \"", {"Ref" : "RunAsUserPassword"}, "\",\r\n", " \"post_install_script\" : \"D:\\\\PostInstallScripts\\\\deploy.bat\",\r\n", " \"hosts\" : {\r\n", " \"FILESERVER\" : \"", {"Fn::GetAtt" : [ "FileServerEC2Instance", "PrivateIp" ]}, "\"\r\n", " },\r\n", " \"server\" : {\r\n", " \"admin_username\" : \"", {"Ref" : "SiteAdmin"}, "\",\r\n", " \"admin_password\" : \"", {"Ref" : "SiteAdminPassword" }, "\",\r\n", " \"authorization_file\" : \"C:\\\\Temp\\\\", {"Ref": "ServerLicenseFile"}, "\",\r\n", " \"primary_server_url\" : \"http://", { "Fn::GetAtt" : [ "PrimaryServerEC2Instance", "PrivateIp" ] }, ":6080/arcgis\",\r\n", " \"use_join_site_tool\" : true,\r\n", " \"soc_max_heap_size\" : 64,\r\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" } ]]}, "\\\\\\\\FILESERVER\\\\config-store"]}, "\"\r\n", " },\r\n", " \"rds\" : {\r\n", " \"engine\" : \"sqlserver-se\",\r\n", " \"endpoint\" : \"", {"Fn::If": ["CreateDBInstance", {"Fn::GetAtt": [ "DBInstance", "Endpoint.Address" ]}, ""]}, "\"\r\n", " }\r\n", " },\r\n", " \"run_list\" : [\r\n", " \"recipe[arcgis-enterprise::system]\",\r\n", " \"recipe[esri-iis]\",\r\n", " \"recipe[arcgis-enterprise::sql_alias]\",\r\n", " \"recipe[arcgis-enterprise::server_node]\",\r\n", " \"recipe[arcgis-enterprise::post_install]\"]\r\n", "}\r\n" ] ] } } } } } } }, "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" } }, "DeploymentLogs": { "Type": "AWS::Logs::LogGroup", "Properties": { "RetentionInDays": 7 } }, "CloudWatchSettings" : { "Type" : "AWS::Logs::MetricFilter", "Properties": { "LogGroupName": {"Ref": "DeploymentLogs"}, "FilterPattern": "[level=FATAL, message]", "MetricTransformations": [{ "MetricValue": "1", "MetricNamespace": "ArcGIS/Deployment", "MetricName": "ErrorCount" }] }, "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" : { "D:\\PostInstallScripts" : {"Fn::If": ["RunPostInstall", {"Fn::GetAtt": [ "ValidatePostInstallationScript", "S3ObjectURL" ]}, ""]} } }, "config" : { "sources" : { "C:\\chef" : "https://agsstore6.s3.amazonaws.com/8321/cookbooks/arcgis-3.2.0-cookbooks.zip", "C:\\Program Files\\Amazon\\cfn-bootstrap" : "https://arcgisstore106.s3.amazonaws.com/endpoints.zip" }, "files": { "C:\\Program Files\\Amazon\\SSM\\Plugins\\awsCloudWatch\\AWS.EC2.Windows.CloudWatch.json": { "content": { "Fn::Join" : ["", [ "{\r\n", " \"IsEnabled\" : true,\r\n", " \"EngineConfiguration\": {\r\n", " \"PollInterval\": \"00:00:15\",\r\n", " \"Components\": [\r\n", " {\r\n", " \"Id\": \"CfnInitLogStream\",\r\n", " \"FullName\": \"AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch\",\r\n", " \"Parameters\": {\r\n", " \"Region\": \"", {"Ref" : "AWS::Region"}, "\",\r\n", " \"LogGroup\": \"", {"Ref": "DeploymentLogs"}, "\",\r\n", " \"LogStream\": \"{instance_id}/cfn-init.log\"\r\n", " }\r\n", " },\r\n", " {\r\n", " \"Id\": \"ChefRunLogStream\",\r\n", " \"FullName\": \"AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch\",\r\n", " \"Parameters\": {\r\n", " \"Region\": \"", {"Ref" : "AWS::Region"}, "\",\r\n", " \"LogGroup\": \"", {"Ref": "DeploymentLogs"}, "\",\r\n", " \"LogStream\": \"{instance_id}/chef-run.log\"\r\n", " }\r\n", " },\r\n", " {\r\n", " \"Id\": \"CfnInitLogs\",\r\n", " \"FullName\": \"AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch\",\r\n", " \"Parameters\": {\r\n", " \"LogDirectoryPath\": \"C:\\\\cfn\\\\log\",\r\n", " \"TimestampFormat\": \"yyyy-MM-dd HH:mm:ss,fff\",\r\n", " \"Encoding\": \"UTF-8\",\r\n", " \"Filter\": \"cfn-init.log\",\r\n", " \"CultureName\": \"en-US\",\r\n", " \"TimeZoneKind\": \"Local\",\r\n", " \"LineCount\": \"1\"\r\n", " }\r\n", " },\r\n", " {\r\n", " \"Id\": \"ChefRunLogs\",\r\n", " \"FullName\": \"AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch\",\r\n", " \"Parameters\": {\r\n", " \"LogDirectoryPath\": \"C:\\\\chef\",\r\n", " \"TimestampFormat\": \"[yyyy-MM-ddTHH:mm:sszzz]\",\r\n", " \"Encoding\": \"UTF-8\",\r\n", " \"Filter\": \"chef-run.log\",\r\n", " \"CultureName\": \"en-US\",\r\n", " \"TimeZoneKind\": \"Local\",\r\n", " \"LineCount\": \"1\"\r\n", " }\r\n", " }],\r\n", " \"Flows\": {\r\n", " \"Flows\":[\"CfnInitLogs,CfnInitLogStream\",\"ChefRunLogs,ChefRunLogStream\"]\r\n", " }\r\n", " }\r\n", "}\r\n"]] } } }, "commands": { "0-enableSSM" : { "command" : "powershell.exe -Command \"Set-Service -Name AmazonSSMAgent -StartupType Automatic\" ", "waitAfterCompletion" : "0" }, "1-restartSSM": { "command" : "powershell.exe -Command \"Restart-Service AmazonSSMAgent \"", "waitAfterCompletion" : "30" } } } } } }, "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" } } }