{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "MMGenome audioCaffe CF template v0.1",
  "Parameters": {
    "audioCaffeVPCCIDR": {
      "Description": "CIDR Block for audioCaffe VPC",
      "Type": "String",
      "Default": "10.0.0.0/16",
      "Description" : "IP address range of VPC in CIDR notation"
    },
    "audioCaffePublicSubnetCIDR": {
      "Description": "Public Subnet",
      "Type": "String",
      "Default": "10.0.1.0/24",
      "Description" : "IP address range of subnet in CIDR notation"
    },
    "audioCaffePrivateSubnetCIDR": {
      "Description": "Private Subnet",
      "Type": "String",
      "Default": "10.0.2.0/24",
      "Description" : "IP address range of subnet in CIDR notation"
    },
    "KeyName": {
      "Type": "String",
      "Description": "Keyname for the keypair for EC2 instances",
      "Type" : "String",
      "MinLength": "1",
      "MaxLength": "64",
      "AllowedPattern" : "[-_ a-zA-Z0-9]*",
      "ConstraintDescription" : "can contain only alphanumeric characters, spaces, dashes and underscores."
    },
    "audioCaffeInstanceType": {
      "Type": "String",
      "Description": "audioCaffe EC2 instance type",
      "MinLength": "1",
      "MaxLength": "64",
      "AllowedPattern" : "[. a-zA-Z0-9]*",
      "Default": "m4.large"
    }
  },
  "Mappings" : {
	"AmazonLinuxAMI": {
      "us-east-1": {
        "AMI": "ami-1ecae776"
      },
      "us-west-1": {
        "AMI": "ami-d114f295"
      },
      "us-west-2": {
        "AMI": "ami-e7527ed7"
      },
      "eu-west-1": {
        "AMI": "ami-a10897d6"
      },
      "eu-central-1": {
        "AMI": "ami-a8221fb5"
      },
      "sa-east-1": {
        "AMI": "ami-b52890a8"
      },
      "ap-southeast-1": {
        "AMI": "ami-68d8e93a"
      },
      "ap-southeast-2": {
        "AMI": "ami-fd9cecc7"
      },
      "ap-northeast-1": {
        "AMI": "ami-cbf90ecb"
      }
	 },
  "audioCaffeAMI": {
      "us-east-1": {
        "AMI": "ami-b577c4de"
      },
      "us-west-1": {
        "AMI": "ami-2b1ce56f"
      },
      "us-west-2": {
        "AMI": "ami-4d55427d"
      },
      "eu-west-1": {
        "AMI": "ami-7cc6980b"
      },
      "eu-central-1": {
        "AMI": "ami-f66a6ceb"
      },
      "sa-east-1": {
        "AMI": "ami-2136be3c"
      },
      "ap-southeast-1": {
        "AMI": "ami-36131a64"
      },
      "ap-southeast-2": {
        "AMI": "ami-b9c08283"
      },
      "ap-northeast-1": {
        "AMI": "ami-f4cd4bf4"
      }
   }
  },
  "Resources": {
    "DevVPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "CidrBlock": {
          "Ref": "audioCaffeVPCCIDR"
        },
        "EnableDnsSupport": "true",
        "EnableDnsHostnames": "true",
        "Tags": [
          {
            "Key": "VPC",
            "Value": "audioCaffe VPC"
          },
          {
            "Key": "Name",
            "Value": "audioCaffe VPC"
          }
        ]
      }
    },
    "DevInternetGateway": {
      "Type": "AWS::EC2::InternetGateway",
      "DependsOn": "DevVPC"
    },
    "DevAttachGateway": {
      "Type": "AWS::EC2::VPCGatewayAttachment",
      "DependsOn": ["DevVPC", "DevInternetGateway"],
      "Properties": {
        "VpcId": {"Ref": "DevVPC"},
        "InternetGatewayId": {"Ref": "DevInternetGateway"}
      }
    },
    "DevPublicSubnet": {
      "Type": "AWS::EC2::Subnet",
      "DependsOn": "DevAttachGateway",
      "Properties": {
        "VpcId": {"Ref": "DevVPC"},
        "CidrBlock": {"Ref": "audioCaffePublicSubnetCIDR"},
        "AvailabilityZone": {
          "Fn::Select": [
            "0",
            {
              "Fn::GetAZs": ""
            }
          ]
        },
        "Tags": [
          {
            "Key": "Name",
            "Value": "audioCaffe Public Subnet"
          }
        ]
      }
    },
    "DevPrivateSubnet": {
      "Type": "AWS::EC2::Subnet",
      "DependsOn": "DevAttachGateway",
      "Properties": {
        "VpcId": {"Ref": "DevVPC"},
        "CidrBlock": {"Ref": "audioCaffePrivateSubnetCIDR"},
        "AvailabilityZone": {
          "Fn::Select": [
            "0",
            {
              "Fn::GetAZs": ""
            }
          ]
        },
        "Tags": [
          {
            "Key": "Name",
            "Value": "audioCaffe Private Subnet"
          }
        ]
      }
    },
    "DevPublicRouteTable": {
      "Type": "AWS::EC2::RouteTable",
      "DependsOn": ["DevVPC", "DevAttachGateway"],
      "Properties": {
        "VpcId": {"Ref": "DevVPC"},
        "Tags": [
          {
            "Key": "Name",
            "Value": "audioCaffe Public Route Table"
          }
        ]
      }
    },
    "DevPublicRoute": {
      "Type": "AWS::EC2::Route",
      "DependsOn": ["DevPublicRouteTable", "DevAttachGateway"],
      "Properties": {
        "RouteTableId": {"Ref": "DevPublicRouteTable"},
        "DestinationCidrBlock": "0.0.0.0/0",
        "GatewayId": {"Ref": "DevInternetGateway"}
      }
    },
    "DevPublicSubnetRouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "DependsOn": ["DevPublicRouteTable", "DevPublicSubnet", "DevAttachGateway"],
      "Properties": {
        "SubnetId": {"Ref": "DevPublicSubnet"},
        "RouteTableId": {"Ref": "DevPublicRouteTable"}
      }
    },
    "DevPrivateRouteTable": {
      "Type": "AWS::EC2::RouteTable",
      "DependsOn": "DevAttachGateway",
      "Properties": {
        "VpcId": {"Ref": "DevVPC"},
        "Tags": [
          {
            "Key": "Name",
            "Value": "audioCaffe Private Route Table"
          }
        ]
      }
    },
    "DevPrivateSubnetRouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "DependsOn": ["DevPublicRouteTable", "DevPrivateSubnet", "DevAttachGateway"],
      "Properties": {
        "SubnetId": {"Ref": "DevPrivateSubnet"},
        "RouteTableId": {"Ref": "DevPrivateRouteTable"}
      }
    },
    "DevPrivateNetworkAcl": {
      "Type": "AWS::EC2::NetworkAcl",
      "DependsOn": "DevAttachGateway",
      "Properties": {
        "VpcId": {"Ref": "DevVPC"},
        "Tags": [
          {
            "Key": "Network",
            "Value": "audioCaffe Private NACL"
          }
        ]
      }
    },
    "DevNATInstance": {
      "Type": "AWS::EC2::Instance",
      "DependsOn": ["DevAttachGateway", "DevPublicRoute", "DevPublicSubnet"],
      "Properties": {
        "ImageId": {
          "Fn::FindInMap": [
            "AmazonLinuxAMI",
            {
              "Ref": "AWS::Region"
            },
            "AMI"
          ]
        },
        "KeyName": {
          "Ref": "KeyName"
        },
        "InstanceType": "t2.small",
        "NetworkInterfaces": [
          {
            "DeviceIndex": "0",
            "AssociatePublicIpAddress": "true",
            "SubnetId": {
              "Ref": "DevPublicSubnet"
            },
            "GroupSet": [{"Ref": "DevNATSecurityGroup"}]
          }
        ],
        "SourceDestCheck": "false",
        "Tags": [
          {
            "Key": "Name",
            "Value": "NAT (audioCaffe VPC)"
          }
        ],
        "UserData": {
          "Fn::Base64": {
            "Fn::Join": [
              "\n",
              [
                "#!/bin/bash",
                "yum -y update",
                "echo 1 > /proc/sys/net/ipv4/ip_forward",
                "echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects",
                "/sbin/iptables -t nat -A POSTROUTING -o eth0 -s 0.0.0.0/0 -j MASQUERADE",
                "/sbin/iptables-save > /etc/sysconfig/iptables",
                "mkdir -p /etc/sysctl.d/",
                "cat <<EOF > /etc/sysctl.d/nat.conf",
                "net.ipv4.ip_forward = 1",
                "net.ipv4.conf.eth0.send_redirects = 0",
                "EOF \n"
              ]
            ]
          }
        }
      }
    },
    "DevNATSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "DependsOn": "DevAttachGateway",
      "Properties": {
        "GroupDescription": "Enable internal access to the NAT device",
        "VpcId": {"Ref": "DevVPC"},
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": "0",
            "ToPort": "1024",
            "CidrIp": {
              "Ref": "audioCaffePrivateSubnetCIDR"
            }
          },
          {
            "IpProtocol": "udp",
            "FromPort": "0",
            "ToPort": "1024",
            "CidrIp": {
              "Ref": "audioCaffePrivateSubnetCIDR"
            }
          }
        ],
        "SecurityGroupEgress": [
          {
            "IpProtocol": "tcp",
            "FromPort": "0",
            "ToPort": "65535",
            "CidrIp": "0.0.0.0/0"
          },
          {
            "IpProtocol": "udp",
            "FromPort": "0",
            "ToPort": "65535",
            "CidrIp": "0.0.0.0/0"
          }
        ]
      }
    },
    "DevPrivateRoute": {
      "Type": "AWS::EC2::Route",
      "DependsOn": ["DevNATInstance", "DevPrivateRouteTable"],
      "Properties": {
        "RouteTableId": {"Ref": "DevPrivateRouteTable"},
        "DestinationCidrBlock": "0.0.0.0/0",
        "InstanceId": {"Ref": "DevNATInstance"}
      }
    },
    "audioCaffeSecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "DependsOn": "DevAttachGateway",
      "Properties" : {
         "GroupDescription" : "Security Group for audioCaffe server",
         "VpcId" : {"Ref": "DevVPC"},
         "Tags": [
                {
                  "Key": "Name",
                  "Value": "audioCaffeSecurityGroup"
                }
              ],
         "SecurityGroupEgress": [
               {
                    "IpProtocol": "tcp",
                    "FromPort": "0",
                    "ToPort": "65535",
                    "CidrIp": "0.0.0.0/0"
                },
                {
                    "IpProtocol": "udp",
                    "FromPort": "0",
                    "ToPort": "65535",
                    "CidrIp": "0.0.0.0/0"
                }
            ],
            "SecurityGroupIngress": [
               {
                    "IpProtocol": "tcp",
                    "FromPort": "22",
                    "ToPort": "22",
                    "CidrIp": "0.0.0.0/0"
                },
                {
                    "IpProtocol": "tcp",
                    "FromPort": "80",
                    "ToPort": "80",
                    "CidrIp": "0.0.0.0/0"
                }
            ]
          }
        },
        "audioCaffeInstance": {
            "Type": "AWS::EC2::Instance",
            "DependsOn": ["DevPublicSubnet", "audioCaffeSecurityGroup", "DevAttachGateway"],
            "Properties": {
                "KeyName": {"Ref": "KeyName"},
                "ImageId": {
                    "Fn::FindInMap": [
                        "audioCaffeAMI",
                        {
                            "Ref": "AWS::Region"
                        },
                        "AMI"
                    ]
                },
                "InstanceType": {"Ref": "audioCaffeInstanceType"},
                "NetworkInterfaces": [
                    {
                        "DeviceIndex": "0",
                        "AssociatePublicIpAddress": "true",
                        "SubnetId": { "Ref": "DevPublicSubnet" },
                        "GroupSet": [{ "Ref": "audioCaffeSecurityGroup" }]
                    }
                ],
                "Tags": [
                    {
                        "Key": "Name",
                        "Value": "audioCaffe server"
                    }
								]
        }
    }
},
  "Outputs": {
		"audioCaffeVPC" : {
			"Value" : { "Ref" : "DevVPC" }
		},
		"audioCaffeRegion" : {
			"Value" : { "Ref" : "AWS::Region" }
		},
		"NATinstanceID" : {
			"Value" : { "Ref" : "DevNATInstance" }
		},
		"audioCaffeAMIID" : {
			"Value" :
			    {"Fn::FindInMap": [
						"audioCaffeAMI",
						{
								"Ref": "AWS::Region"
						},
						"AMI"
						]
					}
		},
    "audioCaffeInstanceID" : {
      "Value" : { "Ref" : "audioCaffeInstance" }
    },
    "Connect": {
      "Description": "ssh into audioCaffe EC2 instance",
      "Value": {
        "Fn::Join": [
          "",
          [
            "{",
             "\"ssh -i ",
             { "Ref" : "KeyName" },
             " ubuntu@",
            {
              "Fn::GetAtt": [
                "audioCaffeInstance",
                "PublicIp"
              ]
            },
            "\"}"
          ]
        ]
      }
    }
  }
}