{
  "AWSTemplateFormatVersion": "2010-09-09",

  "Description": "A load balancer instance running a local HAproxy",

  "Parameters": {

    "KeyName": {
      "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instances",
      "Type": "String"
    },

    "Server1": {
      "Description": "Server1 to load balance <ip:port>",
      "Type": "String"
    },

    "InstanceType": {
      "Description": "HAProxy server EC2 instance type",
      "Default": "m1.small",
      "Type": "String",
      "AllowedValues": [ "t1.micro", "m1.small", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "c1.medium", "c1.xlarge", "cc1.4xlarge" ],
      "ConstraintDescription": "must be a valid EC2 instance type."
    },

    "LinuxDistribution": {
      "Default": "F17",
      "Description" : "Distribution of choice",
      "Type": "String",
      "AllowedValues" : [ "F18", "F17", "U10", "RHEL-6.1", "RHEL-6.2", "RHEL-6.3" ]
    }
  },

  "Mappings" : {
    "AWSInstanceType2Arch" : {
      "t1.micro"    : { "Arch" : "32" },
      "m1.small"    : { "Arch" : "32" },
      "m1.large"    : { "Arch" : "64" },
      "m1.xlarge"   : { "Arch" : "64" },
      "m2.xlarge"   : { "Arch" : "64" },
      "m2.2xlarge"  : { "Arch" : "64" },
      "m2.4xlarge"  : { "Arch" : "64" },
      "c1.medium"   : { "Arch" : "32" },
      "c1.xlarge"   : { "Arch" : "64" },
      "cc1.4xlarge" : { "Arch" : "64" }
    },
    "DistroArch2AMI": {
      "F18"      : { "32" : "F18-i386-cfntools", "64" : "F18-x86_64-cfntools" },
      "F17"      : { "32" : "F17-i386-cfntools", "64" : "F17-x86_64-cfntools" },
      "U10"      : { "32" : "U10-i386-cfntools", "64" : "U10-x86_64-cfntools" },
      "RHEL-6.1" : { "32" : "rhel61-i386-cfntools", "64" : "rhel61-x86_64-cfntools" },
      "RHEL-6.2" : { "32" : "rhel62-i386-cfntools", "64" : "rhel62-x86_64-cfntools" },
      "RHEL-6.3" : { "32" : "rhel63-i386-cfntools", "64" : "rhel63-x86_64-cfntools" }
    }
  },

  "Resources": {
    "LoadBalancerInstance": {
      "Type": "AWS::EC2::Instance",
      "Metadata": {
        "AWS::CloudFormation::Init": {
          "config": {
            "packages": {
              "yum": {
                "haproxy"        : []
              }
            },
            "services": {
              "systemd": {
                "haproxy"   : { "enabled": "true", "ensureRunning": "true" }
              }
            },
            "files": {
              "/etc/haproxy/haproxy.cfg": {
                "content": { "Fn::Join": ["", [
                "    global\n",
                "        daemon\n",
                "        maxconn 256\n",
                "\n",
                "    defaults\n",
                "        mode http\n",
                "        timeout connect 5000ms\n",
                "        timeout client 50000ms\n",
                "        timeout server 50000ms\n",
                "\n",
                "    frontend http-in\n",
                "        bind *:80\n",
                "        default_backend servers\n",
                "\n",
                "    backend servers\n",
                "        balance roundrobin\n",
                "        option http-server-close\n",
                "        option forwardfor\n",
                "        server server1 ", { "Ref" : "Server1" }, "\n"
                ]]},
                "mode": "000644",
                "owner": "root",
                "group": "root"
            }
          }
        }
        }
      },
      "Properties": {
        "ImageId" : {
          "Fn::FindInMap" : [ "DistroArch2AMI",
                              { "Ref" : "LinuxDistribution" },
                              { "Fn::FindInMap" : [ "AWSInstanceType2Arch",
                                                    { "Ref" : "InstanceType" },
                                                    "Arch" ] } ]
        },
        "InstanceType": { "Ref": "InstanceType" },
        "KeyName": { "Ref": "KeyName" },
        "UserData": { "Fn::Base64": { "Fn::Join": ["", [
          "#!/bin/bash -v\n",
          "/opt/aws/bin/cfn-init -s ",
          { "Ref": "AWS::StackName" },
          "    --region ", { "Ref": "AWS::Region" }, "\n"
        ]]}}
      }
    }
  },

  "Outputs": {
    "PublicIp": {
      "Value": { "Fn::GetAtt": [ "LoadBalancerInstance", "PublicIp" ] },
      "Description": "instance IP"
    }
  }
}
