{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "QS(0001) - This template creates a VPC infrastructure for a multi-AZ, multi-tier deployment of a Windows based Application infrastructure. It installs 2 Active Directory Domain Controllers into subnets in separate AZs inside a VPC, as well as Remote Desktop Gateway instances and managed NAT gateways into the public subnet for each Availability Zone. The default Domain Administrator password will be the one retrieved from the instance.  For adding members to the domain, ensure that they are launched into the domain member security group created by this template and then configure them to use the AD instances fixed private IP addresses as the DNS server. **WARNING** This template creates Amazon EC2 Windows instance and related resources. You will be billed for the AWS resources used if you create a stack from this template.",
    "Metadata": {
        "AWS::CloudFormation::Interface": {
            "ParameterGroups": [
                {
                    "Label": {
                        "default": "Network Configuration"
                    },
                    "Parameters": [
                        "VPCCIDR",
                        "PrivateSubnet1CIDR",
                        "PrivateSubnet2CIDR",
                        "PublicSubnet1CIDR",
                        "PublicSubnet2CIDR"
                    ]
                },
                {
                    "Label": {
                        "default": "Amazon EC2 Configuration"
                    },
                    "Parameters": [
                        "KeyPairName",
                        "RDGWInstanceType",
                        "ADServer1InstanceType",
                        "ADServer1NetBIOSName",
                        "ADServer1PrivateIP",
                        "ADServer2InstanceType",
                        "ADServer2NetBIOSName",
                        "ADServer2PrivateIP"
                    ]
                },
                {
                    "Label": {
                        "default": "Microsoft Active Directory Configuration"
                    },
                    "Parameters": [
                        "DomainDNSName",
                        "DomainNetBIOSName",
                        "RestoreModePassword",
                        "DomainAdminUser",
                        "DomainAdminPassword"
                    ]
                }
            ],
            "ParameterLabels": {
                "KeyPairName": {
                    "default": "Key Pair Name"
                },
                "ADServer1InstanceType": {
                    "default": "Domain Controller 1 Instance Type"
                },
                "ADServer2InstanceType": {
                    "default": "Domain Controller 2 Instance Type"
                },
                "RDGWInstanceType": {
                    "default": "Remote Desktop Gateway Server Instance Type"
                },
                "DomainDNSName": {
                    "default": "Domain DNS Name"
                },
                "DomainNetBIOSName": {
                    "default": "Domain NetBIOS Name"
                },
                "ADServer1NetBIOSName": {
                    "default": "Domain Controller 1 NetBIOS Name"
                },
                "ADServer2NetBIOSName": {
                    "default": "Domain Controller 2 NetBIOS Name"
                },
                "RestoreModePassword": {
                    "default": "Restore Mode Password"
                },
                "DomainAdminUser": {
                    "default": "Domain Admin User Name"
                },
                "DomainAdminPassword": {
                    "default": "Domain Admin Password"
                },
                "PublicSubnet1CIDR": {
                    "default": "Public Subnet 1 CIDR"
                },
                "PublicSubnet2CIDR": {
                    "default": "Public Subnet 2 CIDR"
                },
                "PrivateSubnet1CIDR": {
                    "default": "Private Subnet 1 CIDR"
                },
                "PrivateSubnet2CIDR": {
                    "default": "Private Subnet 2 CIDR"
                },
                "VPCCIDR": {
                    "default": "VPC CIDR"
                },
                "ADServer1PrivateIP": {
                    "default": "Domain Controller 1 Private IP Address"
                },
                "ADServer2PrivateIP": {
                    "default": "Domain Controller 2 Private IP Address"
                }
            }
        }
    },
    "Parameters": {
        "KeyPairName": {
            "Description": "Public/private key pairs allow you to securely connect to your instance after it launches",
            "Type": "AWS::EC2::KeyPair::KeyName"
        },
        "ADServer1InstanceType": {
            "Description": "Amazon EC2 instance type for the first Active Directory Instance",
            "Type": "String",
            "Default": "m4.xlarge",
            "AllowedValues": [
                "m4.large",
                "m4.xlarge",
                "m4.2xlarge",
                "m4.4xlarge"
            ]
        },
        "ADServer2InstanceType": {
            "Description": "Amazon EC2 instance type for the second Active Directory Instance",
            "Type": "String",
            "Default": "m4.xlarge",
            "AllowedValues": [
                "m4.large",
                "m4.xlarge",
                "m4.2xlarge",
                "m4.4xlarge"
            ]
        },
        "RDGWInstanceType": {
            "Description": "Amazon EC2 instance type for the Remote Desktop Gatweway Instance",
            "Type": "String",
            "Default": "m4.xlarge",
            "AllowedValues": [
                "m4.large",
                "m4.xlarge",
                "m4.2xlarge",
                "m4.4xlarge"
            ]
        },
        "DomainDNSName": {
            "Description": "Fully qualified domain name (FQDN) of the forest root domain e.g. example.com",
            "Type": "String",
            "Default": "example.com",
            "MinLength": "3",
            "MaxLength": "25",
            "AllowedPattern": "[a-zA-Z0-9\\-]+\\..+"
        },
        "DomainNetBIOSName": {
            "Description": "NetBIOS name of the domain (upto 15 characters) for users of earlier versions of Windows e.g. EXAMPLE",
            "Type": "String",
            "Default": "example",
            "MinLength": "1",
            "MaxLength": "15",
            "AllowedPattern": "[a-zA-Z0-9\\-]+"
        },
        "ADServer1NetBIOSName": {
            "Description": "NetBIOS name of the 1st AD Server (upto 15 characters)",
            "Type": "String",
            "Default": "DC1",
            "MinLength": "1",
            "MaxLength": "15",
            "AllowedPattern": "[a-zA-Z0-9\\-]+"
        },
        "ADServer2NetBIOSName": {
            "Description": "NetBIOS name of the 2nd AD Server (upto 15 characters)",
            "Type": "String",
            "Default": "DC2",
            "MinLength": "1",
            "MaxLength": "15",
            "AllowedPattern": "[a-zA-Z0-9\\-]+"
        },
        "RestoreModePassword": {
            "Description": "Password for a separate Administrator account when the domain controller is in Restore Mode. Must be at least 8 characters containing letters, numbers and symbols",
            "Type": "String",
            "MinLength": "8",
            "MaxLength": "32",
            "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]))^.*",
            "NoEcho": "True"
        },
        "DomainAdminUser": {
            "Description": "User name for the account that will be added as Domain Administrator. This is separate from the default \"Administrator\" account",
            "Type": "String",
            "Default": "StackAdmin",
            "MinLength": "5",
            "MaxLength": "25",
            "AllowedPattern": "[a-zA-Z0-9]*"
        },
        "DomainAdminPassword": {
            "Description": "Password for the domain admin user. Must be at least 8 characters containing letters, numbers and symbols",
            "Type": "String",
            "MinLength": "8",
            "MaxLength": "32",
            "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]))^.*",
            "NoEcho": "true"
        },
        "PublicSubnet1CIDR": {
            "Description": "CIDR Block for the Public DMZ Subnet located in AZ1",
            "Type": "String",
            "Default": "10.0.32.0/20",
            "AllowedPattern": "[a-zA-Z0-9]+\\..+"
        },
        "PublicSubnet2CIDR": {
            "Description": "CIDR Block for the Public DMZ Subnet located in AZ2",
            "Type": "String",
            "Default": "10.0.96.0/20",
            "AllowedPattern": "[a-zA-Z0-9]+\\..+"
        },
        "PrivateSubnet1CIDR": {
            "Description": "CIDR Block for Private Subnet 1 located in AZ1",
            "Type": "String",
            "Default": "10.0.0.0/19",
            "AllowedPattern": "[a-zA-Z0-9]+\\..+"
        },
        "PrivateSubnet2CIDR": {
            "Description": "CIDR Block for Private Subnet 2 located in AZ2",
            "Type": "String",
            "Default": "10.0.64.0/19",
            "AllowedPattern": "[a-zA-Z0-9]+\\..+"
        },
        "VPCCIDR": {
            "Description": "CIDR Block for the VPC",
            "Type": "String",
            "Default": "10.0.0.0/16",
            "AllowedPattern": "[a-zA-Z0-9]+\\..+"
        },
        "ADServer1PrivateIP": {
            "Description": "Fixed private IP for the first Active Directory server located in AZ1",
            "Type": "String",
            "Default": "10.0.0.10"
        },
        "ADServer2PrivateIP": {
            "Description": "Fixed private IP for the second Active Directory serverr located in AZ2",
            "Type": "String",
            "Default": "10.0.64.10"
        }
    },
    "Mappings": {
        "AWSAMIRegionMap": {
            "AMI": {
                "WS2012R2": "Windows_Server-2012-R2_RTM-English-64Bit-Base-2019.07.12"
            },
            "ap-northeast-1": {
                "WS2012R2": "ami-06823103be2218b98"
            },
            "ap-northeast-2": {
                "WS2012R2": "ami-050e65d9f2ec90145"
            },
            "ap-south-1": {
                "WS2012R2": "ami-045e1f06f29929467"
            },
            "ap-southeast-1": {
                "WS2012R2": "ami-0c322369af7718803"
            },
            "ap-southeast-2": {
                "WS2012R2": "ami-0813db0de4ddab990"
            },
            "ca-central-1": {
                "WS2012R2": "ami-0850dfaa3ee6f6233"
            },
            "eu-central-1": {
                "WS2012R2": "ami-024652d0a3df40e74"
            },
            "eu-west-1": {
                "WS2012R2": "ami-0d2f69fcc5f00c97a"
            },
            "eu-west-2": {
                "WS2012R2": "ami-0998a91bb1756752d"
            },
            "sa-east-1": {
                "WS2012R2": "ami-044d56b6baa621d7d"
            },
            "us-east-1": {
                "WS2012R2": "ami-094a644f1fb9e4ce3"
            },
            "us-east-2": {
                "WS2012R2": "ami-0a1a54d8690206089"
            },
            "us-west-1": {
                "WS2012R2": "ami-094dcbdb1aa24c8da"
            },
            "us-west-2": {
                "WS2012R2": "ami-0f8967b5f815400c0"
            }
        }
    },
    "Resources": {
        "DHCPOptions": {
            "Type": "AWS::EC2::DHCPOptions",
            "Properties": {
                "DomainName": {
                    "Ref": "DomainDNSName"
                },
                "DomainNameServers": [
                    "AmazonProvidedDNS"
                ],
                "NtpServers": [
                    {
                        "Ref": "ADServer1PrivateIP"
                    }
                ],
                "NetbiosNameServers": [
                    {
                        "Ref": "ADServer1PrivateIP"
                    },
                    {
                        "Ref": "ADServer2PrivateIP"
                    }
                ],
                "NetbiosNodeType": "2",
                "Tags": [
                    {
                        "Key": "Domain",
                        "Value": {
                            "Ref": "DomainDNSName"
                        }
                    }
                ]
            }
        },
        "VPC": {
            "Type": "AWS::EC2::VPC",
            "Properties": {
                "CidrBlock": {
                    "Ref": "VPCCIDR"
                },
                "Tags": [
                    {
                        "Key": "Application",
                        "Value": {
                            "Ref": "AWS::StackName"
                        }
                    },
                    {
                        "Key": "Network",
                        "Value": "Public"
                    }
                ]
            }
        },
        "VPCDHCPOptionsAssociation": {
            "Type": "AWS::EC2::VPCDHCPOptionsAssociation",
            "Properties": {
                "VpcId": {
                    "Ref": "VPC"
                },
                "DhcpOptionsId": {
                    "Ref": "DHCPOptions"
                }
            }
        },
        "PublicSubnet1": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Ref": "PublicSubnet1CIDR"
                },
                "AvailabilityZone": {
                    "Fn::Select": [
                        0,
                        {
                            "Fn::GetAZs": ""
                        }
                    ]
                },
                "Tags": [
                    {
                        "Key": "Application",
                        "Value": {
                            "Ref": "AWS::StackName"
                        }
                    },
                    {
                        "Key": "Network",
                        "Value": "Public"
                    },
                    {
                        "Key": "Role",
                        "Value": "DMZ 1 Subnet"
                    }
                ]
            }
        },
        "PublicSubnet2": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Ref": "PublicSubnet2CIDR"
                },
                "AvailabilityZone": {
                    "Fn::Select": [
                        1,
                        {
                            "Fn::GetAZs": ""
                        }
                    ]
                },
                "Tags": [
                    {
                        "Key": "Application",
                        "Value": {
                            "Ref": "AWS::StackName"
                        }
                    },
                    {
                        "Key": "Network",
                        "Value": "Public"
                    },
                    {
                        "Key": "Role",
                        "Value": "DMZ 2 Subnet"
                    }
                ]
            }
        },
        "PrivateSubnet1": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Ref": "PrivateSubnet1CIDR"
                },
                "AvailabilityZone": {
                    "Fn::Select": [
                        0,
                        {
                            "Fn::GetAZs": ""
                        }
                    ]
                },
                "Tags": [
                    {
                        "Key": "Application",
                        "Value": {
                            "Ref": "AWS::StackName"
                        }
                    },
                    {
                        "Key": "Network",
                        "Value": "Private"
                    },
                    {
                        "Key": "Role",
                        "Value": "AD1 Subnet"
                    }
                ]
            }
        },
        "PrivateSubnet2": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Ref": "PrivateSubnet2CIDR"
                },
                "AvailabilityZone": {
                    "Fn::Select": [
                        1,
                        {
                            "Fn::GetAZs": ""
                        }
                    ]
                },
                "Tags": [
                    {
                        "Key": "Application",
                        "Value": {
                            "Ref": "AWS::StackName"
                        }
                    },
                    {
                        "Key": "Network",
                        "Value": "Private"
                    },
                    {
                        "Key": "Role",
                        "Value": "AD2 Subnet"
                    }
                ]
            }
        },
        "InternetGateway": {
            "Type": "AWS::EC2::InternetGateway",
            "Properties": {
                "Tags": [
                    {
                        "Key": "Application",
                        "Value": {
                            "Ref": "AWS::StackName"
                        }
                    },
                    {
                        "Key": "Network",
                        "Value": "Public"
                    }
                ]
            }
        },
        "VPCGatewayAttachment": {
            "Type": "AWS::EC2::VPCGatewayAttachment",
            "Properties": {
                "VpcId": {
                    "Ref": "VPC"
                },
                "InternetGatewayId": {
                    "Ref": "InternetGateway"
                }
            }
        },
        "PublicRouteTable": {
            "Type": "AWS::EC2::RouteTable",
            "Properties": {
                "VpcId": {
                    "Ref": "VPC"
                },
                "Tags": [
                    {
                        "Key": "Application",
                        "Value": {
                            "Ref": "AWS::StackName"
                        }
                    },
                    {
                        "Key": "Network",
                        "Value": "DMZ"
                    }
                ]
            }
        },
        "PublicRoute": {
            "DependsOn": "VPCGatewayAttachment",
            "Type": "AWS::EC2::Route",
            "Properties": {
                "RouteTableId": {
                    "Ref": "PublicRouteTable"
                },
                "DestinationCidrBlock": "0.0.0.0/0",
                "GatewayId": {
                    "Ref": "InternetGateway"
                }
            }
        },
        "PublicSubnetRouteTableAssociation1": {
            "Type": "AWS::EC2::SubnetRouteTableAssociation",
            "Properties": {
                "SubnetId": {
                    "Ref": "PublicSubnet1"
                },
                "RouteTableId": {
                    "Ref": "PublicRouteTable"
                }
            }
        },
        "PublicSubnetRouteTableAssociation2": {
            "Type": "AWS::EC2::SubnetRouteTableAssociation",
            "Properties": {
                "SubnetId": {
                    "Ref": "PublicSubnet2"
                },
                "RouteTableId": {
                    "Ref": "PublicRouteTable"
                }
            }
        },
        "PrivateRouteTable1": {
            "Type": "AWS::EC2::RouteTable",
            "Properties": {
                "VpcId": {
                    "Ref": "VPC"
                },
                "Tags": [
                    {
                        "Key": "Application",
                        "Value": {
                            "Ref": "AWS::StackName"
                        }
                    },
                    {
                        "Key": "Network",
                        "Value": "AZ1 Private"
                    }
                ]
            }
        },
        "PrivateRoute1": {
            "Type": "AWS::EC2::Route",
            "Properties": {
                "RouteTableId": {
                    "Ref": "PrivateRouteTable1"
                },
                "DestinationCidrBlock": "0.0.0.0/0",
                "NatGatewayId": {
                    "Ref": "NATGateway1"
                }
            }
        },
        "PrivateRouteTable2": {
            "Type": "AWS::EC2::RouteTable",
            "Properties": {
                "VpcId": {
                    "Ref": "VPC"
                },
                "Tags": [
                    {
                        "Key": "Application",
                        "Value": {
                            "Ref": "AWS::StackName"
                        }
                    },
                    {
                        "Key": "Network",
                        "Value": "AZ2 Private"
                    }
                ]
            }
        },
        "PrivateRoute2": {
            "Type": "AWS::EC2::Route",
            "Properties": {
                "RouteTableId": {
                    "Ref": "PrivateRouteTable2"
                },
                "DestinationCidrBlock": "0.0.0.0/0",
                "NatGatewayId": {
                    "Ref": "NATGateway2"
                }
            }
        },
        "PrivateSubnetRouteTableAssociation1": {
            "Type": "AWS::EC2::SubnetRouteTableAssociation",
            "Properties": {
                "SubnetId": {
                    "Ref": "PrivateSubnet1"
                },
                "RouteTableId": {
                    "Ref": "PrivateRouteTable1"
                }
            }
        },
        "PrivateSubnetRouteTableAssociation2": {
            "Type": "AWS::EC2::SubnetRouteTableAssociation",
            "Properties": {
                "SubnetId": {
                    "Ref": "PrivateSubnet2"
                },
                "RouteTableId": {
                    "Ref": "PrivateRouteTable2"
                }
            }
        },
        "RDGW1EIP": {
            "Type": "AWS::EC2::EIP",
            "Properties": {
                "Domain": "vpc",
                "InstanceId": {
                    "Ref": "RDGateway1"
                }
            }
        },
        "RDGW2EIP": {
            "Type": "AWS::EC2::EIP",
            "Properties": {
                "Domain": "vpc",
                "InstanceId": {
                    "Ref": "RDGateway2"
                }
            }
        },
        "NATGateway1EIP": {
            "Type": "AWS::EC2::EIP",
            "Properties": {
                "Domain": "vpc"
            }
        },
        "NATGateway2EIP": {
            "Type": "AWS::EC2::EIP",
            "Properties": {
                "Domain": "vpc"
            }
        },
        "NATGateway1": {
            "DependsOn": "VPCGatewayAttachment",
            "Type": "AWS::EC2::NatGateway",
            "Properties": {
                "AllocationId": {
                    "Fn::GetAtt": [
                        "NATGateway1EIP",
                        "AllocationId"
                    ]
                },
                "SubnetId": {
                    "Ref": "PublicSubnet1"
                }
            }
        },
        "NATGateway2": {
            "DependsOn": "VPCGatewayAttachment",
            "Type": "AWS::EC2::NatGateway",
            "Properties": {
                "AllocationId": {
                    "Fn::GetAtt": [
                        "NATGateway2EIP",
                        "AllocationId"
                    ]
                },
                "SubnetId": {
                    "Ref": "PublicSubnet2"
                }
            }
        },
        "DomainController1": {
            "Type": "AWS::EC2::Instance",
            "DependsOn": "NATGateway1",
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "configSets": {
                        "config": [
                            "setup",
                            "rename",
                            "installADDS",
                            "configureSites",
                            "installADCS",
                            "finalize"
                        ]
                    },
                    "setup": {
                        "files": {
                            "c:\\cfn\\cfn-hup.conf": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[main]\n",
                                            "stack=",
                                            {
                                                "Ref": "AWS::StackName"
                                            },
                                            "\n",
                                            "region=",
                                            {
                                                "Ref": "AWS::Region"
                                            },
                                            "\n"
                                        ]
                                    ]
                                }
                            },
                            "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[cfn-auto-reloader-hook]\n",
                                            "triggers=post.update\n",
                                            "path=Resources.DomainController1.Metadata.AWS::CloudFormation::Init\n",
                                            "action=cfn-init.exe -v -c config -s ",
                                            {
                                                "Ref": "AWS::StackId"
                                            },
                                            " -r DomainController1",
                                            " --region ",
                                            {
                                                "Ref": "AWS::Region"
                                            },
                                            "\n"
                                        ]
                                    ]
                                }
                            },
                            "c:\\cfn\\scripts\\Set-StaticIP.ps1": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "$netip = Get-NetIPConfiguration;",
                                            "$ipconfig = Get-NetIPAddress | ?{$_.IpAddress -eq $netip.IPv4Address.IpAddress};",
                                            "Get-NetAdapter | Set-NetIPInterface -DHCP Disabled;",
                                            "Get-NetAdapter | New-NetIPAddress -AddressFamily IPv4 -IPAddress $netip.IPv4Address.IpAddress -PrefixLength $ipconfig.PrefixLength -DefaultGateway $netip.IPv4DefaultGateway.NextHop;",
                                            "Get-NetAdapter | Set-DnsClientServerAddress -ServerAddresses $netip.DNSServer.ServerAddresses;",
                                            "\n"
                                        ]
                                    ]
                                }
                            },
                            "c:\\cfn\\modules\\AWSQuickStart.zip": {
                                "source": "https://s3.amazonaws.com/aws-quickstart/quickstart-microsoft-activedirectory/submodules/quickstart-microsoft-utilities/modules/AWSQuickStart.zip"
                            },
                            "c:\\cfn\\scripts\\ConvertTo-EnterpriseAdmin.ps1": {
                                "source": "https://s3.amazonaws.com/aws-quickstart/quickstart-microsoft-activedirectory/scripts/ConvertTo-EnterpriseAdmin.ps1"
                            },
                            "c:\\cfn\\scripts\\New-CertificateAuthority.ps1": {
                                "source": "https://s3.amazonaws.com/aws-quickstart/quickstart-microsoft-activedirectory/scripts/New-CertificateAuthority.ps1"
                            },
                            "c:\\cfn\\modules\\xAdcsDeployment_0.1.0.0.zip": {
                                "source": "https://s3.amazonaws.com/aws-quickstart/quickstart-microsoft-activedirectory/scripts/xAdcsDeployment_0.1.0.0.zip"
                            },
                            "c:\\cfn\\scripts\\Unzip-Archive.ps1": {
                                "source": "https://s3.amazonaws.com/aws-quickstart/quickstart-microsoft-activedirectory/submodules/quickstart-microsoft-utilities/scripts/Unzip-Archive.ps1"
                            }
                        },
                        "services": {
                            "windows": {
                                "cfn-hup": {
                                    "enabled": "true",
                                    "ensureRunning": "true",
                                    "files": [
                                        "c:\\cfn\\cfn-hup.conf",
                                        "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf"
                                    ]
                                }
                            }
                        },
                        "commands": {
                            "a-disable-win-fw": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command \"Get-NetFirewallProfile | Set-NetFirewallProfile -Enabled False\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            },
                            "b-set-execution-policy": {
                                "command": "powershell.exe -command Set-ExecutionPolicy RemoteSigned -Force",
                                "waitAfterCompletion": "0"
                            },
                            "c-unpack-dsc-resource": {
                                "command": "powershell.exe -command c:\\cfn\\scripts\\Unzip-Archive.ps1 -Source c:\\cfn\\modules\\xAdcsDeployment_0.1.0.0.zip -Destination 'C:\\Program Files\\WindowsPowerShell\\Modules'",
                                "waitAfterCompletion": "0"
                            },
                            "d-unpack-quickstart-module": {
                                "command": "powershell.exe -Command C:\\cfn\\scripts\\Unzip-Archive.ps1 -Source C:\\cfn\\modules\\AWSQuickStart.zip -Destination 'C:\\Program Files\\WindowsPowerShell\\Modules'",
                                "waitAfterCompletion": "0"
                            }
                        }
                    },
                    "rename": {
                        "commands": {
                            "a-set-static-ip": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -ExecutionPolicy RemoteSigned -Command c:\\cfn\\scripts\\Set-StaticIP.ps1"
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "45"
                            },
                            "b-execute-powershell-script-RenameComputer": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe Rename-Computer -NewName ",
                                            {
                                                "Ref": "ADServer1NetBIOSName"
                                            },
                                            " -Restart"
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "forever"
                            }
                        }
                    },
                    "installADDS": {
                        "commands": {
                            "1-install-prereqs": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command \"Install-WindowsFeature AD-Domain-Services, rsat-adds -IncludeAllSubFeature\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            },
                            "2-install-adds": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command ",
                                            "\"Install-ADDSForest -DomainName ",
                                            {
                                                "Ref": "DomainDNSName"
                                            },
                                            " ",
                                            "-SafeModeAdministratorPassword (ConvertTo-SecureString ",
                                            "'",
                                            {
                                                "Ref": "DomainAdminPassword"
                                            },
                                            "'",
                                            " -AsPlainText -Force) ",
                                            "-DomainMode Win2012R2 ",
                                            "-DomainNetbiosName ",
                                            {
                                                "Ref": "DomainNetBIOSName"
                                            },
                                            " ",
                                            "-ForestMode Win2012R2 ",
                                            "-Confirm:$false ",
                                            "-Force\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "forever"
                            },
                            "3-restart-service": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command Restart-Service NetLogon -EA 0"
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "180"
                            },
                            "4-create-adminuser": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command ",
                                            "\"New-ADUser ",
                                            "-Name ",
                                            {
                                                "Ref": "DomainAdminUser"
                                            },
                                            " ",
                                            "-UserPrincipalName ",
                                            {
                                                "Ref": "DomainAdminUser"
                                            },
                                            "@",
                                            {
                                                "Ref": "DomainDNSName"
                                            },
                                            " ",
                                            "-AccountPassword (ConvertTo-SecureString ",
                                            "'",
                                            {
                                                "Ref": "DomainAdminPassword"
                                            },
                                            "'",
                                            " -AsPlainText -Force) ",
                                            "-Enabled $true ",
                                            "-PasswordNeverExpires $true\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            },
                            "5-update-adminuser": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -ExecutionPolicy RemoteSigned -Command c:\\cfn\\scripts\\ConvertTo-EnterpriseAdmin.ps1 -Members ",
                                            {
                                                "Ref": "DomainAdminUser"
                                            }
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            }
                        }
                    },
                    "configureSites": {
                        "commands": {
                            "a-rename-default-site": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe ",
                                            "\"",
                                            "Get-ADObject -SearchBase (Get-ADRootDSE).ConfigurationNamingContext -filter {Name -eq 'Default-First-Site-Name'} | Rename-ADObject -NewName AZ1",
                                            "\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            },
                            "b-create-site-2": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe New-ADReplicationSite AZ2"
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            },
                            "c-create-publicsubnet-1": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command New-ADReplicationSubnet -Name ",
                                            {
                                                "Ref": "PublicSubnet1CIDR"
                                            },
                                            " -Site AZ1"
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            },
                            "d-create-publicsubnet-2": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command New-ADReplicationSubnet -Name ",
                                            {
                                                "Ref": "PublicSubnet2CIDR"
                                            },
                                            " -Site AZ2"
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            },
                            "e-create-privatesubnet-1": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command New-ADReplicationSubnet -Name ",
                                            {
                                                "Ref": "PrivateSubnet1CIDR"
                                            },
                                            " -Site AZ1"
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            },
                            "f-create-privatesubnet-2": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command New-ADReplicationSubnet -Name ",
                                            {
                                                "Ref": "PrivateSubnet2CIDR"
                                            },
                                            " -Site AZ2"
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            },
                            "g-set-site-link": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command \"",
                                            "Get-ADReplicationSiteLink -Filter * | Set-ADReplicationSiteLink -SitesIncluded @{add='AZ2'} -ReplicationFrequencyInMinutes 15\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            }
                        }
                    },
                    "installADCS": {
                        "commands": {
                            "a-install-ca": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command c:\\cfn\\scripts\\New-CertificateAuthority.ps1 -Username ",
                                            {
                                                "Ref": "DomainAdminUser"
                                            },
                                            " -Password ",
                                            "'",
                                            {
                                                "Ref": "DomainAdminPassword"
                                            },
                                            "'",
                                            " -DomainDNSName ",
                                            {
                                                "Ref": "DomainDNSName"
                                            }
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            }
                        }
                    },
                    "finalize": {
                        "commands": {
                            "a-signal-success": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "cfn-signal.exe -e 0 \"",
                                            {
                                                "Ref": "DomainController1WaitHandle"
                                            },
                                            "\""
                                        ]
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "Properties": {
                "ImageId": {
                    "Fn::FindInMap": [
                        "AWSAMIRegionMap",
                        {
                            "Ref": "AWS::Region"
                        },
                        "WS2012R2"
                    ]
                },
                "InstanceType": {
                    "Ref": "ADServer1InstanceType"
                },
                "SubnetId": {
                    "Ref": "PrivateSubnet1"
                },
                "Tags": [
                    {
                        "Key": "Name",
                        "Value": {
                            "Ref": "ADServer1NetBIOSName"
                        }
                    }
                ],
                "BlockDeviceMappings": [
                    {
                        "DeviceName": "/dev/sda1",
                        "Ebs": {
                            "VolumeSize": "100",
                            "VolumeType": "gp2"
                        }
                    }
                ],
                "SecurityGroupIds": [
                    {
                        "Ref": "DomainController1SG"
                    }
                ],
                "PrivateIpAddress": {
                    "Ref": "ADServer1PrivateIP"
                },
                "KeyName": {
                    "Ref": "KeyPairName"
                },
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": [
                            "",
                            [
                                "\n"
                            ]
                        ]
                    }
                }
            }
        },
        "DomainController2": {
            "Type": "AWS::EC2::Instance",
            "DependsOn": "DomainController1WaitCondition",
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "configSets": {
                        "config": [
                            "setup",
                            "rename",
                            "join",
                            "addDomainController",
                            "installADCS",
                            "finalize"
                        ]
                    },
                    "setup": {
                        "files": {
                            "c:\\cfn\\cfn-hup.conf": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[main]\n",
                                            "stack=",
                                            {
                                                "Ref": "AWS::StackName"
                                            },
                                            "\n",
                                            "region=",
                                            {
                                                "Ref": "AWS::Region"
                                            },
                                            "\n"
                                        ]
                                    ]
                                }
                            },
                            "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[cfn-auto-reloader-hook]\n",
                                            "triggers=post.update\n",
                                            "path=Resources.DomainController2.Metadata.AWS::CloudFormation::Init\n",
                                            "action=cfn-init.exe -v -c config -s ",
                                            {
                                                "Ref": "AWS::StackId"
                                            },
                                            " -r DomainController2",
                                            " --region ",
                                            {
                                                "Ref": "AWS::Region"
                                            },
                                            "\n"
                                        ]
                                    ]
                                }
                            },
                            "c:\\cfn\\scripts\\Set-StaticIP.ps1": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "$netip = Get-NetIPConfiguration;",
                                            "$ipconfig = Get-NetIPAddress | ?{$_.IpAddress -eq $netip.IPv4Address.IpAddress};",
                                            "Get-NetAdapter | Set-NetIPInterface -DHCP Disabled;",
                                            "Get-NetAdapter | New-NetIPAddress -AddressFamily IPv4 -IPAddress $netip.IPv4Address.IpAddress -PrefixLength $ipconfig.PrefixLength -DefaultGateway $netip.IPv4DefaultGateway.NextHop;",
                                            "Get-NetAdapter | Set-DnsClientServerAddress -ServerAddresses ",
                                            {
                                                "Ref": "ADServer1PrivateIP"
                                            },
                                            "\n"
                                        ]
                                    ]
                                }
                            },
                            "c:\\cfn\\modules\\AWSQuickStart.zip": {
                                "source": "https://s3.amazonaws.com/aws-quickstart/quickstart-microsoft-activedirectory/submodules/quickstart-microsoft-utilities/modules/AWSQuickStart.zip"
                            },
                            "c:\\cfn\\scripts\\New-CertificateAuthority.ps1": {
                                "source": "https://s3.amazonaws.com/aws-quickstart/quickstart-microsoft-activedirectory/scripts/New-CertificateAuthority.ps1"
                            },
                            "c:\\cfn\\modules\\xAdcsDeployment_0.1.0.0.zip": {
                                "source": "https://s3.amazonaws.com/aws-quickstart/quickstart-microsoft-activedirectory/scripts/xAdcsDeployment_0.1.0.0.zip"
                            },
                            "c:\\cfn\\scripts\\Unzip-Archive.ps1": {
                                "source": "https://s3.amazonaws.com/aws-quickstart/quickstart-microsoft-activedirectory/submodules/quickstart-microsoft-utilities/scripts/Unzip-Archive.ps1"
                            }
                        },
                        "services": {
                            "windows": {
                                "cfn-hup": {
                                    "enabled": "true",
                                    "ensureRunning": "true",
                                    "files": [
                                        "c:\\cfn\\cfn-hup.conf",
                                        "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf"
                                    ]
                                }
                            }
                        },
                        "commands": {
                            "a-disable-win-fw": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command \"Get-NetFirewallProfile | Set-NetFirewallProfile -Enabled False\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            },
                            "b-set-execution-policy": {
                                "command": "powershell.exe -command Set-ExecutionPolicy RemoteSigned -Force",
                                "waitAfterCompletion": "0"
                            },
                            "c-unpack-dsc-resource": {
                                "command": "powershell.exe -command c:\\cfn\\scripts\\Unzip-Archive.ps1 -Source c:\\cfn\\modules\\xAdcsDeployment_0.1.0.0.zip -Destination 'C:\\Program Files\\WindowsPowerShell\\Modules'",
                                "waitAfterCompletion": "0"
                            },
                            "d-unpack-quickstart-module": {
                                "command": "powershell.exe -Command C:\\cfn\\scripts\\Unzip-Archive.ps1 -Source C:\\cfn\\modules\\AWSQuickStart.zip -Destination 'C:\\Program Files\\WindowsPowerShell\\Modules'",
                                "waitAfterCompletion": "0"
                            }
                        }
                    },
                    "rename": {
                        "commands": {
                            "a-set-static-ip": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -ExecutionPolicy RemoteSigned -Command c:\\cfn\\scripts\\Set-StaticIP.ps1"
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "45"
                            },
                            "b-execute-powershell-script-RenameComputer": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe Rename-Computer -NewName ",
                                            {
                                                "Ref": "ADServer2NetBIOSName"
                                            },
                                            " -Restart"
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "forever"
                            }
                        }
                    },
                    "join": {
                        "commands": {
                            "a-join-domain": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command \"",
                                            "Add-Computer -DomainName ",
                                            {
                                                "Ref": "DomainDNSName"
                                            },
                                            " -Credential ",
                                            "(New-Object System.Management.Automation.PSCredential('",
                                            {
                                                "Ref": "DomainNetBIOSName"
                                            },
                                            "\\",
                                            {
                                                "Ref": "DomainAdminUser"
                                            },
                                            "',",
                                            "(ConvertTo-SecureString ",
                                            "'",
                                            {
                                                "Ref": "DomainAdminPassword"
                                            },
                                            "'",
                                            " -AsPlainText -Force))) ",
                                            "-Restart\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "forever"
                            }
                        }
                    },
                    "addDomainController": {
                        "commands": {
                            "1-install-prereqs": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command \"Install-WindowsFeature AD-Domain-Services, rsat-adds -IncludeAllSubFeature\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            },
                            "2-add-dc": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command \"",
                                            "Install-ADDSDomainController -InstallDns -DomainName ",
                                            {
                                                "Ref": "DomainDNSName"
                                            },
                                            " -Credential ",
                                            "(New-Object System.Management.Automation.PSCredential('",
                                            {
                                                "Ref": "DomainNetBIOSName"
                                            },
                                            "\\",
                                            {
                                                "Ref": "DomainAdminUser"
                                            },
                                            "',",
                                            "(ConvertTo-SecureString ",
                                            "'",
                                            {
                                                "Ref": "DomainAdminPassword"
                                            },
                                            "'",
                                            " -AsPlainText -Force))) ",
                                            "-SafeModeAdministratorPassword ",
                                            "(ConvertTo-SecureString ",
                                            "'",
                                            {
                                                "Ref": "DomainAdminPassword"
                                            },
                                            "'",
                                            " -AsPlainText -Force) ",
                                            "-Confirm:$false -Force\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "forever"
                            }
                        }
                    },
                    "installADCS": {
                        "commands": {
                            "a-install-ca": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command c:\\cfn\\scripts\\New-CertificateAuthority.ps1 -Username ",
                                            {
                                                "Ref": "DomainAdminUser"
                                            },
                                            " -Password ",
                                            "'",
                                            {
                                                "Ref": "DomainAdminPassword"
                                            },
                                            "'",
                                            " -DomainDNSName ",
                                            {
                                                "Ref": "DomainDNSName"
                                            }
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            }
                        }
                    },
                    "finalize": {
                        "commands": {
                            "a-update-dns-servers-dc2": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command \"",
                                            "Get-NetAdapter | Set-DnsClientServerAddress -ServerAddresses ",
                                            {
                                                "Ref": "ADServer1PrivateIP"
                                            },
                                            ",",
                                            {
                                                "Ref": "ADServer2PrivateIP"
                                            },
                                            "\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            },
                            "b-update-dns-servers-dc1": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command ",
                                            "\"Invoke-Command -Scriptblock{ ",
                                            "Get-NetAdapter | Set-DnsClientServerAddress -ServerAddresses ",
                                            {
                                                "Ref": "ADServer2PrivateIP"
                                            },
                                            ",",
                                            {
                                                "Ref": "ADServer1PrivateIP"
                                            },
                                            " } -ComputerName ",
                                            {
                                                "Ref": "ADServer1NetBIOSName"
                                            },
                                            " -Credential ",
                                            "(New-Object System.Management.Automation.PSCredential('",
                                            {
                                                "Ref": "DomainNetBIOSName"
                                            },
                                            "\\",
                                            {
                                                "Ref": "DomainAdminUser"
                                            },
                                            "',",
                                            "(ConvertTo-SecureString ",
                                            "'",
                                            {
                                                "Ref": "DomainAdminPassword"
                                            },
                                            "'",
                                            " -AsPlainText -Force))) ",
                                            "\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "0"
                            },
                            "c-signal-success": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "cfn-signal.exe -e 0 \"",
                                            {
                                                "Ref": "DomainController2WaitHandle"
                                            },
                                            "\""
                                        ]
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "Properties": {
                "ImageId": {
                    "Fn::FindInMap": [
                        "AWSAMIRegionMap",
                        {
                            "Ref": "AWS::Region"
                        },
                        "WS2012R2"
                    ]
                },
                "InstanceType": {
                    "Ref": "ADServer2InstanceType"
                },
                "SubnetId": {
                    "Ref": "PrivateSubnet2"
                },
                "Tags": [
                    {
                        "Key": "Name",
                        "Value": {
                            "Ref": "ADServer2NetBIOSName"
                        }
                    }
                ],
                "BlockDeviceMappings": [
                    {
                        "DeviceName": "/dev/sda1",
                        "Ebs": {
                            "VolumeSize": "100",
                            "VolumeType": "gp2"
                        }
                    }
                ],
                "SecurityGroupIds": [
                    {
                        "Ref": "DomainController2SG"
                    }
                ],
                "PrivateIpAddress": {
                    "Ref": "ADServer2PrivateIP"
                },
                "KeyName": {
                    "Ref": "KeyPairName"
                },
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": [
                            "",
                            [
                                "\n"
                            ]
                        ]
                    }
                }
            }
        },
        "RDGateway1": {
            "Type": "AWS::EC2::Instance",
            "DependsOn": "DomainController2",
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "configSets": {
                        "config": [
                            "setup",
                            "rename",
                            "join",
                            "installRDS",
                            "finalize"
                        ]
                    },
                    "setup": {
                        "files": {
                            "c:\\cfn\\cfn-hup.conf": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[main]\n",
                                            "stack=",
                                            {
                                                "Ref": "AWS::StackName"
                                            },
                                            "\n",
                                            "region=",
                                            {
                                                "Ref": "AWS::Region"
                                            },
                                            "\n"
                                        ]
                                    ]
                                }
                            },
                            "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[cfn-auto-reloader-hook]\n",
                                            "triggers=post.update\n",
                                            "path=Resources.RDGateway1.Metadata.AWS::CloudFormation::Init\n",
                                            "action=cfn-init.exe -v -c config -s ",
                                            {
                                                "Ref": "AWS::StackId"
                                            },
                                            " -r RDGateway1",
                                            " --region ",
                                            {
                                                "Ref": "AWS::Region"
                                            },
                                            "\n"
                                        ]
                                    ]
                                }
                            },
                            "c:\\cfn\\scripts\\Configure-RDGW.ps1": {
                                "source": "https://s3.amazonaws.com/aws-quickstart/quickstart-microsoft-activedirectory/scripts/Configure-RDGW.ps1"
                            }
                        },
                        "services": {
                            "windows": {
                                "cfn-hup": {
                                    "enabled": "true",
                                    "ensureRunning": "true",
                                    "files": [
                                        "c:\\cfn\\cfn-hup.conf",
                                        "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf"
                                    ]
                                }
                            }
                        },
                        "commands": {
                            "a-set-execution-policy": {
                                "command": "powershell.exe -command Set-ExecutionPolicy RemoteSigned -Force",
                                "waitAfterCompletion": "0"
                            }
                        }
                    },
                    "rename": {
                        "commands": {
                            "1-execute-powershell-script-RenameComputer": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command Rename-Computer -NewName RDGW1 -Restart"
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "forever"
                            }
                        }
                    },
                    "join": {
                        "commands": {
                            "a-set-dns-servers": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command \"",
                                            "Get-NetAdapter | Set-DnsClientServerAddress -ServerAddresses ",
                                            {
                                                "Ref": "ADServer1PrivateIP"
                                            },
                                            ",",
                                            {
                                                "Ref": "ADServer2PrivateIP"
                                            },
                                            "\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "30"
                            },
                            "b-join-domain": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command \"",
                                            "Add-Computer -DomainName ",
                                            {
                                                "Ref": "DomainDNSName"
                                            },
                                            " -Credential ",
                                            "(New-Object System.Management.Automation.PSCredential('",
                                            {
                                                "Ref": "DomainNetBIOSName"
                                            },
                                            "\\",
                                            {
                                                "Ref": "DomainAdminUser"
                                            },
                                            "',",
                                            "(ConvertTo-SecureString ",
                                            "'",
                                            {
                                                "Ref": "DomainAdminPassword"
                                            },
                                            "'",
                                            " -AsPlainText -Force))) ",
                                            "-Restart\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "forever"
                            }
                        }
                    },
                    "installRDS": {
                        "commands": {
                            "a-install-rds": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command \"Install-WindowsFeature RDS-Gateway,RSAT-RDS-Gateway\""
                                        ]
                                    ]
                                }
                            },
                            "b-configure-rdgw": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -ExecutionPolicy RemoteSigned",
                                            " C:\\cfn\\scripts\\Configure-RDGW.ps1 -ServerFQDN RDGW1.",
                                            {
                                                "Ref": "DomainDNSName"
                                            },
                                            " -DomainNetBiosName ",
                                            {
                                                "Ref": "DomainNetBIOSName"
                                            },
                                            " -GroupName 'domain admins'"
                                        ]
                                    ]
                                }
                            }
                        }
                    },
                    "finalize": {
                        "commands": {
                            "1-signal-success": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "cfn-signal.exe -e 0 \"",
                                            {
                                                "Ref": "RDGW1WaitHandle"
                                            },
                                            "\""
                                        ]
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "Properties": {
                "ImageId": {
                    "Fn::FindInMap": [
                        "AWSAMIRegionMap",
                        {
                            "Ref": "AWS::Region"
                        },
                        "WS2012R2"
                    ]
                },
                "InstanceType": {
                    "Ref": "RDGWInstanceType"
                },
                "SubnetId": {
                    "Ref": "PublicSubnet1"
                },
                "Tags": [
                    {
                        "Key": "Name",
                        "Value": "RDGW1"
                    }
                ],
                "BlockDeviceMappings": [
                    {
                        "DeviceName": "/dev/sda1",
                        "Ebs": {
                            "VolumeSize": "50",
                            "VolumeType": "gp2"
                        }
                    }
                ],
                "SecurityGroupIds": [
                    {
                        "Ref": "RDGWSecurityGroup"
                    },
                    {
                        "Ref": "DomainMemberSG"
                    }
                ],
                "KeyName": {
                    "Ref": "KeyPairName"
                },
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": [
                            "",
                            [
                                "\n"
                            ]
                        ]
                    }
                }
            }
        },
        "RDGateway2": {
            "Type": "AWS::EC2::Instance",
            "DependsOn": "DomainController2",
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "configSets": {
                        "config": [
                            "setup",
                            "rename",
                            "join",
                            "installRDS",
                            "finalize"
                        ]
                    },
                    "setup": {
                        "files": {
                            "c:\\cfn\\cfn-hup.conf": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[main]\n",
                                            "stack=",
                                            {
                                                "Ref": "AWS::StackName"
                                            },
                                            "\n",
                                            "region=",
                                            {
                                                "Ref": "AWS::Region"
                                            },
                                            "\n"
                                        ]
                                    ]
                                }
                            },
                            "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[cfn-auto-reloader-hook]\n",
                                            "triggers=post.update\n",
                                            "path=Resources.RDGateway2.Metadata.AWS::CloudFormation::Init\n",
                                            "action=cfn-init.exe -v -c config -s ",
                                            {
                                                "Ref": "AWS::StackId"
                                            },
                                            " -r RDGateway2",
                                            " --region ",
                                            {
                                                "Ref": "AWS::Region"
                                            },
                                            "\n"
                                        ]
                                    ]
                                }
                            },
                            "c:\\cfn\\scripts\\Configure-RDGW.ps1": {
                                "source": "https://s3.amazonaws.com/aws-quickstart/quickstart-microsoft-activedirectory/scripts/Configure-RDGW.ps1"
                            }
                        },
                        "services": {
                            "windows": {
                                "cfn-hup": {
                                    "enabled": "true",
                                    "ensureRunning": "true",
                                    "files": [
                                        "c:\\cfn\\cfn-hup.conf",
                                        "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf"
                                    ]
                                }
                            }
                        },
                        "commands": {
                            "a-set-execution-policy": {
                                "command": "powershell.exe -command Set-ExecutionPolicy RemoteSigned -Force",
                                "waitAfterCompletion": "0"
                            }
                        }
                    },
                    "rename": {
                        "commands": {
                            "1-execute-powershell-script-RenameComputer": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command Rename-Computer -NewName RDGW2 -Restart"
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "forever"
                            }
                        }
                    },
                    "join": {
                        "commands": {
                            "a-set-dns-servers": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command \"",
                                            "Get-NetAdapter | Set-DnsClientServerAddress -ServerAddresses ",
                                            {
                                                "Ref": "ADServer2PrivateIP"
                                            },
                                            ",",
                                            {
                                                "Ref": "ADServer1PrivateIP"
                                            },
                                            "\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "30"
                            },
                            "b-join-domain": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command \"",
                                            "Add-Computer -DomainName ",
                                            {
                                                "Ref": "DomainDNSName"
                                            },
                                            " -Credential ",
                                            "(New-Object System.Management.Automation.PSCredential('",
                                            {
                                                "Ref": "DomainNetBIOSName"
                                            },
                                            "\\",
                                            {
                                                "Ref": "DomainAdminUser"
                                            },
                                            "',",
                                            "(ConvertTo-SecureString ",
                                            "'",
                                            {
                                                "Ref": "DomainAdminPassword"
                                            },
                                            "'",
                                            " -AsPlainText -Force))) ",
                                            "-Restart\""
                                        ]
                                    ]
                                },
                                "waitAfterCompletion": "forever"
                            }
                        }
                    },
                    "installRDS": {
                        "commands": {
                            "a-install-rds": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -Command \"Install-WindowsFeature RDS-Gateway,RSAT-RDS-Gateway\""
                                        ]
                                    ]
                                }
                            },
                            "b-configure-rdgw": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "powershell.exe -ExecutionPolicy RemoteSigned",
                                            " C:\\cfn\\scripts\\Configure-RDGW.ps1 -ServerFQDN RDGW2.",
                                            {
                                                "Ref": "DomainDNSName"
                                            },
                                            " -DomainNetBiosName ",
                                            {
                                                "Ref": "DomainNetBIOSName"
                                            },
                                            " -GroupName 'domain admins'"
                                        ]
                                    ]
                                }
                            }
                        }
                    },
                    "finalize": {
                        "commands": {
                            "1-signal-success": {
                                "command": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "cfn-signal.exe -e 0 \"",
                                            {
                                                "Ref": "RDGW2WaitHandle"
                                            },
                                            "\""
                                        ]
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "Properties": {
                "ImageId": {
                    "Fn::FindInMap": [
                        "AWSAMIRegionMap",
                        {
                            "Ref": "AWS::Region"
                        },
                        "WS2012R2"
                    ]
                },
                "InstanceType": {
                    "Ref": "RDGWInstanceType"
                },
                "SubnetId": {
                    "Ref": "PublicSubnet2"
                },
                "Tags": [
                    {
                        "Key": "Name",
                        "Value": "RDGW2"
                    }
                ],
                "BlockDeviceMappings": [
                    {
                        "DeviceName": "/dev/sda1",
                        "Ebs": {
                            "VolumeSize": "50",
                            "VolumeType": "gp2"
                        }
                    }
                ],
                "SecurityGroupIds": [
                    {
                        "Ref": "RDGWSecurityGroup"
                    },
                    {
                        "Ref": "DomainMemberSG"
                    }
                ],
                "KeyName": {
                    "Ref": "KeyPairName"
                },
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": [
                            "",
                            [
                                "\n"
                            ]
                        ]
                    }
                }
            }
        },
        "DomainController1WaitCondition": {
            "Type": "AWS::CloudFormation::WaitCondition",
            "DependsOn": "DomainController1",
            "Properties": {
                "Handle": {
                    "Ref": "DomainController1WaitHandle"
                },
                "Timeout": "3600"
            }
        },
        "DomainController1WaitHandle": {
            "Type": "AWS::CloudFormation::WaitConditionHandle"
        },
        "DomainController2WaitCondition": {
            "Type": "AWS::CloudFormation::WaitCondition",
            "DependsOn": "DomainController2",
            "Properties": {
                "Handle": {
                    "Ref": "DomainController2WaitHandle"
                },
                "Timeout": "3600"
            }
        },
        "DomainController2WaitHandle": {
            "Type": "AWS::CloudFormation::WaitConditionHandle"
        },
        "RDGW1WaitCondition": {
            "Type": "AWS::CloudFormation::WaitCondition",
            "DependsOn": "RDGateway1",
            "Properties": {
                "Handle": {
                    "Ref": "RDGW1WaitHandle"
                },
                "Timeout": "3000"
            }
        },
        "RDGW1WaitHandle": {
            "Type": "AWS::CloudFormation::WaitConditionHandle"
        },
        "RDGW2WaitCondition": {
            "Type": "AWS::CloudFormation::WaitCondition",
            "DependsOn": "RDGateway2",
            "Properties": {
                "Handle": {
                    "Ref": "RDGW2WaitHandle"
                },
                "Timeout": "3000"
            }
        },
        "RDGW2WaitHandle": {
            "Type": "AWS::CloudFormation::WaitConditionHandle"
        },
        "DomainController1SG": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Domain Controller",
                "VpcId": {
                    "Ref": "VPC"
                },
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "5985",
                        "ToPort": "5985",
                        "CidrIp": {
                            "Ref": "VPCCIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "80",
                        "ToPort": "80",
                        "CidrIp": {
                            "Ref": "VPCCIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "123",
                        "ToPort": "123",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "135",
                        "ToPort": "135",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "9389",
                        "ToPort": "9389",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "138",
                        "ToPort": "138",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "445",
                        "ToPort": "445",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "445",
                        "ToPort": "445",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "464",
                        "ToPort": "464",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "464",
                        "ToPort": "464",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "49152",
                        "ToPort": "65535",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "49152",
                        "ToPort": "65535",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "389",
                        "ToPort": "389",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "389",
                        "ToPort": "389",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "636",
                        "ToPort": "636",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3268",
                        "ToPort": "3268",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3269",
                        "ToPort": "3269",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "53",
                        "ToPort": "53",
                        "CidrIp": {
                            "Ref": "VPCCIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "53",
                        "ToPort": "53",
                        "CidrIp": {
                            "Ref": "VPCCIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "9389",
                        "ToPort": "9389",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "88",
                        "ToPort": "88",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "88",
                        "ToPort": "88",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "5355",
                        "ToPort": "5355",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "137",
                        "ToPort": "137",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "139",
                        "ToPort": "139",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "5722",
                        "ToPort": "5722",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "123",
                        "ToPort": "123",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "135",
                        "ToPort": "135",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "9389",
                        "ToPort": "9389",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "138",
                        "ToPort": "138",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "445",
                        "ToPort": "445",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "445",
                        "ToPort": "445",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "464",
                        "ToPort": "464",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "464",
                        "ToPort": "464",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "49152",
                        "ToPort": "65535",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "49152",
                        "ToPort": "65535",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "389",
                        "ToPort": "389",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "389",
                        "ToPort": "389",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "636",
                        "ToPort": "636",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3268",
                        "ToPort": "3268",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3269",
                        "ToPort": "3269",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "88",
                        "ToPort": "88",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "88",
                        "ToPort": "88",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3389",
                        "ToPort": "3389",
                        "CidrIp": {
                            "Ref": "PublicSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3389",
                        "ToPort": "3389",
                        "CidrIp": {
                            "Ref": "PublicSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "icmp",
                        "FromPort": "-1",
                        "ToPort": "-1",
                        "CidrIp": {
                            "Ref": "PublicSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "icmp",
                        "FromPort": "-1",
                        "ToPort": "-1",
                        "CidrIp": {
                            "Ref": "PublicSubnet2CIDR"
                        }
                    }
                ]
            }
        },
        "DomainController2SG": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Domain Controller",
                "VpcId": {
                    "Ref": "VPC"
                },
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "5985",
                        "ToPort": "5985",
                        "CidrIp": {
                            "Ref": "VPCCIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "80",
                        "ToPort": "80",
                        "CidrIp": {
                            "Ref": "VPCCIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "123",
                        "ToPort": "123",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "135",
                        "ToPort": "135",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "9389",
                        "ToPort": "9389",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "138",
                        "ToPort": "138",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "445",
                        "ToPort": "445",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "445",
                        "ToPort": "445",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "464",
                        "ToPort": "464",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "464",
                        "ToPort": "464",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "49152",
                        "ToPort": "65535",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "49152",
                        "ToPort": "65535",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "389",
                        "ToPort": "389",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "389",
                        "ToPort": "389",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "636",
                        "ToPort": "636",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3268",
                        "ToPort": "3268",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3269",
                        "ToPort": "3269",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "53",
                        "ToPort": "53",
                        "CidrIp": {
                            "Ref": "VPCCIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "53",
                        "ToPort": "53",
                        "CidrIp": {
                            "Ref": "VPCCIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "9389",
                        "ToPort": "9389",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "88",
                        "ToPort": "88",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "88",
                        "ToPort": "88",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "5355",
                        "ToPort": "5355",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "137",
                        "ToPort": "137",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "139",
                        "ToPort": "139",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "5722",
                        "ToPort": "5722",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "123",
                        "ToPort": "123",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "135",
                        "ToPort": "135",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "9389",
                        "ToPort": "9389",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "138",
                        "ToPort": "138",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "445",
                        "ToPort": "445",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "445",
                        "ToPort": "445",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "464",
                        "ToPort": "464",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "464",
                        "ToPort": "464",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "49152",
                        "ToPort": "65535",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "49152",
                        "ToPort": "65535",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "389",
                        "ToPort": "389",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "389",
                        "ToPort": "389",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "636",
                        "ToPort": "636",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3268",
                        "ToPort": "3268",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3269",
                        "ToPort": "3269",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "88",
                        "ToPort": "88",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "88",
                        "ToPort": "88",
                        "SourceSecurityGroupId": {
                            "Ref": "DomainMemberSG"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3389",
                        "ToPort": "3389",
                        "CidrIp": {
                            "Ref": "PublicSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3389",
                        "ToPort": "3389",
                        "CidrIp": {
                            "Ref": "PublicSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "icmp",
                        "FromPort": "-1",
                        "ToPort": "-1",
                        "CidrIp": {
                            "Ref": "PublicSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "icmp",
                        "FromPort": "-1",
                        "ToPort": "-1",
                        "CidrIp": {
                            "Ref": "PublicSubnet2CIDR"
                        }
                    }
                ]
            }
        },
        "DomainMemberSG": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Domain Members",
                "VpcId": {
                    "Ref": "VPC"
                },
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "5985",
                        "ToPort": "5985",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "53",
                        "ToPort": "53",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "53",
                        "ToPort": "53",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "49152",
                        "ToPort": "65535",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "49152",
                        "ToPort": "65535",
                        "CidrIp": {
                            "Ref": "PrivateSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "5985",
                        "ToPort": "5985",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "53",
                        "ToPort": "53",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "53",
                        "ToPort": "53",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "49152",
                        "ToPort": "65535",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "udp",
                        "FromPort": "49152",
                        "ToPort": "65535",
                        "CidrIp": {
                            "Ref": "PrivateSubnet2CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3389",
                        "ToPort": "3389",
                        "CidrIp": {
                            "Ref": "PublicSubnet1CIDR"
                        }
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3389",
                        "ToPort": "3389",
                        "CidrIp": {
                            "Ref": "PublicSubnet2CIDR"
                        }
                    }
                ]
            }
        },
        "RDGWSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable RDP access from the Internet",
                "VpcId": {
                    "Ref": "VPC"
                },
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3389",
                        "ToPort": "3389",
                        "CidrIp": "0.0.0.0/0"
                    },
                    {
                        "IpProtocol": "icmp",
                        "FromPort": "-1",
                        "ToPort": "-1",
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            }
        }
    },
    "Outputs": {
        "RDGW1ElasticIP": {
            "Value": {
                "Ref": "RDGW1EIP"
            },
            "Description": "Elastic IP address of the first Remote Desktop Gateway (RDGW1) in AZ1"
        },
        "RootCert1": {
            "Value": "c:\\RDGW1.cer",
            "Description": "Location of the root SSL certificate on the first Remote Desktop Gateway (RDGW1) in AZ1"
        },
        "RDGW2ElasticIP": {
            "Value": {
                "Ref": "RDGW2EIP"
            },
            "Description": "Elastic IP address of the second Remote Desktop Gateway (RDGW2) in AZ2"
        },
        "RootCert2": {
            "Value": "c:\\RDGW2.cer",
            "Description": "Location of the root SSL certificate on the first Remote Desktop Gateway (RDGW2) in AZ2"
        },
        "DomainAdmin": {
            "Value": {
                "Fn::Join": [
                    "",
                    [
                        {
                            "Ref": "DomainNetBIOSName"
                        },
                        "\\",
                        {
                            "Ref": "DomainAdminUser"
                        }
                    ]
                ]
            },
            "Description": "Domain administrator account"
        },
        "VPCID": {
            "Value": {
                "Ref": "VPC"
            },
            "Description": "VPC ID"
        },
        "VPCCIDR": {
            "Value": {
                "Ref": "VPCCIDR"
            },
            "Description": "VPC CIDR"
        },
        "PublicSubnet1ID": {
            "Value": {
                "Ref": "PublicSubnet1"
            },
            "Description": "Public Subnet ID in AZ1"
        },
        "PublicSubnet2ID": {
            "Value": {
                "Ref": "PublicSubnet2"
            },
            "Description": "Public Subnet ID in AZ2"
        },
        "PrivateSubnet1ID": {
            "Value": {
                "Ref": "PrivateSubnet1"
            },
            "Description": "Private Subnet ID in AZ1"
        },
        "PrivateSubnet2ID": {
            "Value": {
                "Ref": "PrivateSubnet2"
            },
            "Description": "Private Subnet ID in AZ2"
        },
        "DomainMemberSGID": {
            "Value": {
                "Ref": "DomainMemberSG"
            },
            "Description": "Domain Member Security Group ID"
        }
    }
}