27 aug 17 stacks for presentaion - nil41/25aug17 GitHub Wiki

####################### nw stack ####################

{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "VPC with 2 public and private subnets in two availability zones.",

"Parameters": {

"envPrefix": {                                       
  "Description": "Environment name prefix for tagging.",
  "Type": "String",
  "Default": "Test"
},

"vpcCidr": {
  "Description": "VPC CIDR block.",
  "Type": "String",
  "Default": "10.0.0.0/16",
  "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
  "ConstraintDescription": "Must be a valid IP CIDR range of the form x.x.x.x/x."
},

"publicSubnet1Cidr": {
  "Description": "Public subnet 1 CIDR block.",
  "Type": "String",
  "Default": "10.0.0.0/24",
  "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
  "ConstraintDescription": "Must be a valid IP CIDR range of the form x.x.x.x/x and subnet of VPC."
},

"privateSubnet1Cidr": {
  "Description": "Private subnet 1 CIDR block.",
  "Type": "String",
  "Default": "10.0.1.0/24",
  "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
  "ConstraintDescription": "Must be a valid IP CIDR range of the form x.x.x.x/x and subnet of VPC."
},

"publicSubnet2Cidr": {
  "Description": "Public subnet 2 CIDR block.",
  "Type": "String",
  "Default": "10.0.10.0/24",
  "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
  "ConstraintDescription": "Must be a valid IP CIDR range of the form x.x.x.x/x and subnet of VPC."
},

"privateSubnet2Cidr": {
  "Description": "Private subnet 2 CIDR block.",
  "Type": "String",
  "Default": "10.0.11.0/24",
  "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
  "ConstraintDescription": "Must be a valid IP CIDR range of the form x.x.x.x/x and subnet of VPC."
},


"subnet1AZ": {
  "Description": "Subnet 1 availability zone.",
  "Type": "AWS::EC2::AvailabilityZone::Name"
},
"subnet2AZ": {
  "Description": "Subnet 2 availability zone.",
  "Type": "AWS::EC2::AvailabilityZone::Name"
}

},

"Resources": {

"vpc": {
  "Type": "AWS::EC2::VPC",
  "Properties": {
    "CidrBlock": {"Ref": "vpcCidr"},
    "InstanceTenancy": "default",
    "EnableDnsSupport": "true",
    "EnableDnsHostnames": "true",
    "Tags": [
      {
        "Key": "Name",
        "Value": {"Fn::Join" : ["-", [{"Ref" : "envPrefix"}, "VPC"]]}
      }
    ]
  }
},



"publicSubnet1": {
  "Type": "AWS::EC2::Subnet",
  "DependsOn": ["vpc", "attachGateway"],
  "Properties": {
    "CidrBlock": {"Ref": "publicSubnet1Cidr"},
    "AvailabilityZone": {"Ref" : "subnet1AZ"},
    "VpcId": {"Ref": "vpc"},
    "Tags": [
      {
        "Key": "Name",
        "Value": {"Fn::Join" : ["-", [{"Ref" : "envPrefix"}, "Subnet-Public-1"]]}
      }
    ]
  }
},



"privateSubnet1": {
  "Type": "AWS::EC2::Subnet",
  "DependsOn": ["vpc", "attachGateway"],
  "Properties": {
    "CidrBlock": {"Ref": "privateSubnet1Cidr"},
    "AvailabilityZone": {"Ref" : "subnet1AZ"},
    "VpcId": {"Ref": "vpc"},
    "Tags": [
      {
        "Key": "Name",
        "Value": {"Fn::Join" : ["-", [{"Ref" : "envPrefix"}, "Subnet-Private-1"]]}
      }
    ]
  }
},



"publicSubnet2": {
  "Type": "AWS::EC2::Subnet",
  "DependsOn": ["vpc", "attachGateway"],
  "Properties": {
    "CidrBlock": {"Ref": "publicSubnet2Cidr"},
    "AvailabilityZone": {"Ref" : "subnet2AZ"},
    "VpcId": {"Ref": "vpc"},
    "Tags": [
      {
        "Key": "Name",
        "Value": {"Fn::Join" : ["-", [{"Ref" : "envPrefix"}, "Subnet-Public-2"]]}
      }
    ]
  }
},


"privateSubnet2": {
  "Type": "AWS::EC2::Subnet",
  "DependsOn": ["vpc", "attachGateway"],
  "Properties": {
    "CidrBlock": {"Ref": "privateSubnet2Cidr"},
    "AvailabilityZone": {"Ref" : "subnet2AZ"},
    "VpcId": {"Ref": "vpc"},
    "Tags": [
      {
        "Key": "Name",
        "Value": {"Fn::Join" : ["-", [{"Ref" : "envPrefix"}, "Subnet-Private-2"]]}
      }
    ]
  }
},


"inetGateway": {
  "Type": "AWS::EC2::InternetGateway",
  "DependsOn": ["vpc"],
  "Properties": {
    "Tags": [
      {
        "Key": "Name",
        "Value": {"Fn::Join" : ["-", [{"Ref" : "envPrefix"}, "InternetGateway"]]}
      }
    ]
  }
},


"attachGateway": {
  "Type": "AWS::EC2::VPCGatewayAttachment",
  "DependsOn": ["vpc", "inetGateway"],
  "Properties": {
    "VpcId": {"Ref": "vpc"},
    "InternetGatewayId": {"Ref": "inetGateway"}
  }
},



"rtbPublic": {
  "Type": "AWS::EC2::RouteTable",
  "DependsOn": ["vpc", "attachGateway"],
  "Properties": {
    "VpcId": {"Ref": "vpc"},
    "Tags": [
      {
        "Key": "Name",
        "Value": {"Fn::Join" : ["-", [{"Ref" : "envPrefix"}, "RTB-Public"]]}
      }
    ]
  }
},


"routePublic": {
  "Type": "AWS::EC2::Route",
  "DependsOn": ["rtbPublic"],
  "Properties": {
    "DestinationCidrBlock": "0.0.0.0/0",
    "RouteTableId": {"Ref": "rtbPublic"},
    "GatewayId": {"Ref": "inetGateway"}
  },
  "DependsOn": "attachGateway"
},


"subnetRouteTableAssociationPublic1": {
  "Type": "AWS::EC2::SubnetRouteTableAssociation",
  "DependsOn": ["rtbPublic", "publicSubnet1"],
  "Properties": {
    "RouteTableId": {"Ref": "rtbPublic"},
    "SubnetId": {"Ref": "publicSubnet1"}
  }
},


"subnetRouteTableAssociationPublic2": {
  "Type": "AWS::EC2::SubnetRouteTableAssociation",
  "DependsOn": ["rtbPublic", "publicSubnet2"],
  "Properties": {
    "RouteTableId": {"Ref": "rtbPublic"},
    "SubnetId": {"Ref": "publicSubnet2"}
  }
},


"rtbPrivate": {
  "Type": "AWS::EC2::RouteTable",
  "DependsOn": ["vpc"],
  "Properties": {
    "VpcId": {"Ref": "vpc"},
    "Tags": [
      {
        "Key": "Name",
        "Value": {"Fn::Join" : ["-", [{"Ref" : "envPrefix"}, "RTB-Private"]]}
      }
    ]
  }
},


"subnetRouteTableAssociationPrivate1": {
  "Type": "AWS::EC2::SubnetRouteTableAssociation",
  "DependsOn": ["rtbPublic", "privateSubnet1"],
  "Properties": {
    "RouteTableId": {"Ref": "rtbPrivate"},
    "SubnetId": {"Ref": "privateSubnet1"}
  }
},

"subnetRouteTableAssociationPrivate2": {
  "Type": "AWS::EC2::SubnetRouteTableAssociation",
  "DependsOn": ["rtbPublic", "privateSubnet2"],
  "Properties": {
    "RouteTableId": {"Ref": "rtbPrivate"},
    "SubnetId": {"Ref": "privateSubnet2"}
  }
},



"secgroup": {
  "Type": "AWS::EC2::SecurityGroup",
  "DependsOn": ["vpc", "attachGateway"],
  "Properties": {
    "GroupDescription": "Security group with 80 and 22 open for all",
    "VpcId": {"Ref": "vpc"},
    "SecurityGroupIngress": [
      {
        "CidrIp": "0.0.0.0/0",
        "FromPort": 80,
        "IpProtocol": "tcp",
        "ToPort": 80
      },
      {
        "CidrIp": "0.0.0.0/0",
        "FromPort": 22,
        "IpProtocol": "tcp",
        "ToPort": 22
      },
	  {
        "CidrIp": "0.0.0.0/0",
        "FromPort": 3306,
        "IpProtocol": "tcp",
        "ToPort": 3306
      }
    ],
	
    "Tags": [
        {
          "Key": "Name",
          "Value": {"Fn::Join" : ["-", [{"Ref" : "envPrefix"}, "SG-HTTPandSSH"]]}
        }
      ]
    }
}

} }

###################################### RDS stack ##########################

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

"Parameters" : {

"VpcId" : {
"Type" : "AWS::EC2::VPC::Id", "Description" : "VPC", "ConstraintDescription" : "Enter VPC Id of an existing Virtual Private Cloud." },

"Subnets" : {
"Type" : "ListAWS::EC2::Subnet::Id", "Description" : "Select SubnetIds in your VPC", "ConstraintDescription" : "must be a list of at least two existing subnets associated with at least two different availability zones. They should be residing in the selected Virtual Private Cloud." },

"DBName": {                        
  "Default": "MyDatabase",
  "Description" : "The database name",
  "Type": "String",
  "MinLength": "1",
  "MaxLength": "64",
  "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*",        
  "ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters."
},

"DBUsername": {                    
  "Default": "admin",              
  "NoEcho": "true",                  
  "Description" : "The database admin account username",   
  "Type": "String",
  "MinLength": "1",
  "MaxLength": "16",
  "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*",
  "ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters."
},

"DBPassword": {                            
  "Default": "password",
  "NoEcho": "true",
  "Description" : "The database admin account password",
  "Type": "String",
  "MinLength": "8",
  "MaxLength": "41",
  "AllowedPattern" : "[a-zA-Z0-9]*",
  "ConstraintDescription" : "must contain only alphanumeric characters."
},

"DBClass" : {                    
  "Default" : "db.t2.micro",          
  "Description" : "Database instance class",
  "Type" : "String",
  "AllowedValues" : [ "db.m1.small", "db.t2.micro", "db.m1.large", "db.m1.xlarge", "db.m2.xlarge", "db.m2.2xlarge", "db.m2.4xlarge" ],
  "ConstraintDescription" : "must select a valid database instance type."
},

"DBAllocatedStorage" : {                  
  "Default": "5",
  "Description" : "The size of the database (Gb)",
  "Type": "Number",
  "MinValue": "5",
  "MaxValue": "1024",
  "ConstraintDescription" : "must be between 5 and 1024Gb."
},

"mysec" : {         
"Description" : "security group IDs",
"Type" : "List<AWS::EC2::SecurityGroup::Id>"

},

"MultiAZ": {
"Default": "false",
"Description" : "Create a multi-AZ RDS database instance", "Type": "String", "AllowedValues" : [ "true", "false" ], "ConstraintDescription" : "must be either true or false." } },

"Resources" : {

"MyDBSubnetGroup" : {       
  "Type" : "AWS::RDS::DBSubnetGroup",
  "Properties" : {
    "DBSubnetGroupDescription" : "Subnets available for the RDS DB Instance",
    "SubnetIds" : { "Ref" : "Subnets" }   
  }
},


"MyDB" : {                  
  "Type" : "AWS::RDS::DBInstance",
  "Properties" : {
    "DBName" : { "Ref" : "DBName" },       
    "AllocatedStorage" : { "Ref" : "DBAllocatedStorage" },  
    "DBInstanceClass" : { "Ref" : "DBClass" },  
    "Engine" : "MySQL",                  
    "EngineVersion" : "5.7",           
    "MasterUsername" : { "Ref" : "DBUsername" } ,     
    "MasterUserPassword" : { "Ref" : "DBPassword" },  
    "DBSubnetGroupName" : { "Ref" : "MyDBSubnetGroup" },  
	"MultiAZ" : { "Ref" : "MultiAZ" },        
    "VPCSecurityGroups" :  { "Ref" : "mysec" }          
  }
}

},

"Outputs" : {
"RDSEndpoint": {
"Description" : "RDS database endpoint", "Value" : { "Fn::Join": [ "", [ "",
{ "Fn::GetAtt": [ "MyDB", "Endpoint.Address" ] }, ":", { "Fn::GetAtt": [ "MyDB", "Endpoint.Port" ] }

                                   ]]}
}

}
}

################################## ec2 stack #############################

{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "EC2 autoscaling with LB",

"Parameters" : {

"VpcId" : {
  "Type" : "AWS::EC2::VPC::Id",
  "Description" : "VPC",
  "ConstraintDescription" : "VPC Id of an existing Virtual Private Cloud."
},

"Subnets" : {
  "Type" : "List<AWS::EC2::Subnet::Id>",
  "Description" : "Select SubnetIds in your VPC",
  "ConstraintDescription" : "must be a list of at least two existing subnets associated with at least two different availability zones. They should be residing in the selected Virtual Private Cloud."
},

"InstanceType" : {
  "Description" : "EC2 instance type",
  "Type" : "String",
  "Default" : "t2.micro",
  "AllowedValues" : [ "t1.micro", "t2.nano", "t2.micro", "t2.small", "t2.medium", "t2.large", "m1.small", "m1.medium", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "m3.medium", "m3.large", "m3.xlarge", "m3.2xlarge", "m4.large", "m4.xlarge", "m4.2xlarge", "m4.4xlarge", "m4.10xlarge", "c1.medium", "c1.xlarge", "c3.large", "c3.xlarge", "c3.2xlarge", "c3.4xlarge", "c3.8xlarge", "c4.large", "c4.xlarge", "c4.2xlarge", "c4.4xlarge", "c4.8xlarge", "g2.2xlarge", "g2.8xlarge", "r3.large", "r3.xlarge", "r3.2xlarge", "r3.4xlarge", "r3.8xlarge", "i2.xlarge", "i2.2xlarge", "i2.4xlarge", "i2.8xlarge", "d2.xlarge", "d2.2xlarge", "d2.4xlarge", "d2.8xlarge", "hi1.4xlarge", "hs1.8xlarge", "cr1.8xlarge", "cc2.8xlarge", "cg1.4xlarge"],
  "ConstraintDescription" : "must be a valid EC2 instance type."
},

 "SecurityGroupIds": {
  "Description": "Security groups that can be used to access the EC2 instances and LB",
  "Type": "List<AWS::EC2::SecurityGroup::Id>",
  "ConstraintDescription": "must be list of EC2 security group ids"
},

"KeyName" : {
  "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instances",
  "Type" : "AWS::EC2::KeyPair::KeyName",
  "ConstraintDescription" : "must be the name of an existing EC2 KeyPair."
}

},

"Mappings" : {

  "AWSRegionArch2AMI" : {
  "us-east-1" : { "AMI" : "ami-e96134ff" }
  
 }

},

"Resources" : {

"WebServerGroup" : {
  "Type" : "AWS::AutoScaling::AutoScalingGroup",
  "Properties" : {
    "VPCZoneIdentifier" : { "Ref" : "Subnets" }, 
    "LaunchConfigurationName" : { "Ref" : "LaunchConfig" },
    "MinSize" : "2",
    "MaxSize" : "2",
    "TargetGroupARNs" : [ { "Ref" : "ALBTargetGroup" } ]
  },
  
   "UpdatePolicy": {
    "AutoScalingRollingUpdate": {
      "MinInstancesInService": "1",
      "MaxBatchSize": "1"
    }
  }
},

"LaunchConfig" : {
  "Type" : "AWS::AutoScaling::LaunchConfiguration", 	  
  "Properties" : {    
    "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, "AMI" ]},
    "SecurityGroups" : { "Ref" : "SecurityGroupIds" },
    "InstanceType" : { "Ref" : "InstanceType" },
	"AssociatePublicIpAddress" : "true",
    "KeyName" : { "Ref" : "KeyName" }
  }
},


"ApplicationLoadBalancer" : {
  "Type" : "AWS::ElasticLoadBalancingV2::LoadBalancer",
  "Properties" : {
    "Subnets" : { "Ref" : "Subnets"},
	
	"SecurityGroups": {"Ref": "SecurityGroupIds"}
  }
},

"ALBListener" : {
  "Type" : "AWS::ElasticLoadBalancingV2::Listener",
  "Properties" : {
    "DefaultActions" : [{
      "Type" : "forward",
      "TargetGroupArn" : { "Ref" : "ALBTargetGroup" }
    }],
    "LoadBalancerArn" : { "Ref" : "ApplicationLoadBalancer" },
    "Port" : "80",
    "Protocol" : "HTTP"
  }
},

"ALBTargetGroup" : {
  "Type" : "AWS::ElasticLoadBalancingV2::TargetGroup",
  "Properties" : {
    "HealthCheckIntervalSeconds" : 30,
    "HealthCheckTimeoutSeconds" : 5,
    "HealthyThresholdCount" : 3,
    "Port" : 80,
    "Protocol" : "HTTP",
    "UnhealthyThresholdCount" : 5,
    "VpcId" : {"Ref" : "VpcId"}
  }
} 

},

"Outputs" : { "URL" : { "Description" : "URL of the website", "Value" : { "Fn::Join" : [ "", [ "http://", { "Fn::GetAtt" : [ "ApplicationLoadBalancer", "DNSName" ]}]]} } } }

########################################################

this stack creates 1 vpc 2 public subnets 2 private subnets (with 2 different AZ) 1 security group (80,22 open from all) 1 internet gateway

it creates RDS instance in multiple AZ private subnets

this is create autoscaling group with 2 instances health check is not done it creates ????? lb type #############################################################