Skip to content

Instantly share code, notes, and snippets.

@peteoleary
Created November 1, 2020 19:04
Show Gist options
  • Save peteoleary/fe3e9267d779fac9aa7e93f5d5e5964c to your computer and use it in GitHub Desktop.
Save peteoleary/fe3e9267d779fac9aa7e93f5d5e5964c to your computer and use it in GitHub Desktop.
Cloud Formation Tiered Web App
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Description here.",
"Parameters": {
"SubnetAvailabilityZone1": {
"Description": "Availability Zone for Subnet 1",
"Type": "String",
"Default": "us-west-2a"
},
"SubnetAvailabilityZone2": {
"Description": "Availability Zone for Subnet 2",
"Type": "String",
"Default": "us-west-2b"
},
"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."
},
"InstanceType": {
"Description": "WebServer EC2 instance type",
"Type": "String",
"Default": "t2.small",
"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."
},
"SSHLocation": {
"Description": "The IP address range that can be used to SSH to the EC2 instances",
"Type": "String",
"MinLength": "9",
"MaxLength": "18",
"Default": "0.0.0.0/0",
"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."
},
"WebServerCapacity": {
"Default": "1",
"Description": "The initial number of WebServer instances",
"Type": "Number",
"MinValue": "1",
"MaxValue": "5",
"ConstraintDescription": "must be between 1 and 5 EC2 instances."
},
"AdminAppImage": {
"Description": "Image for App server. Must be in the same region as other Resources",
"Type": "String",
"Default": "ami-07a29e5e945228fa1"
},
"CustomerAppImage": {
"Description": "Image for Customer server. Must be in the same region as other Resources",
"Type": "String",
"Default": "ami-07a29e5e945228fa1"
},
"APIServerImage": {
"Description": "Image for API server. Must be in the same region as other Resources",
"Type": "String",
"Default": "ami-07a29e5e945228fa1"
}
},
"Resources": {
"AppLoadBalancer": {
"Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
"Properties": {
"Subnets": [
{
"Ref": "AppSubnet1"
},
{
"Ref": "AppSubnet2"
}
]
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "54377670-4b84-49f7-9546-d6836316a4ac"
}
}
},
"CustomerAppTargetGroup": {
"Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
"Properties": {
"VpcId" : {"Ref": "VPC"},
"Port" : 80,
"Protocol" : "HTTP",
"Targets": [
]
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "3e79f579-6393-47b9-84a7-9c6a2aac6ede"
}
}
},
"APITargetGroup": {
"Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
"Properties": {
"VpcId" : {"Ref": "VPC"},
"Port" : 8080,
"Protocol" : "TCP",
"Targets": [
]
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "67f75b3d-ed07-480a-8dbc-26d79af8df7d"
}
}
},
"APILoadBalancer": {
"Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
"Properties": {
"Type": "network",
"Subnets": [
{
"Ref": "APISubnet1"
},
{
"Ref": "APISubnet2"
}
]
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "0eeadd9d-05ed-4784-abc0-642e5120c005"
}
}
},
"AdminAppTargetGroup": {
"Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
"Properties": {
"VpcId" : {"Ref": "VPC"},
"Port" : 80,
"Protocol" : "HTTP",
"Targets": [
]
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "45800956-4c26-48ba-8237-274ab5065908"
}
}
},
"AppHTTPListener": {
"Type": "AWS::ElasticLoadBalancingV2::Listener",
"Properties": {
"Protocol" : "HTTP",
"Port": 80,
"DefaultActions": [
{
"Order": 1,
"Type": "forward",
"TargetGroupArn": {
"Ref": "CustomerAppTargetGroup"
}
}
],
"LoadBalancerArn": {
"Ref": "AppLoadBalancer"
}
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "9eeaa1f3-b9d0-4fb0-bf0b-6a875b07d4b0"
}
}
},
"APIListener": {
"Type": "AWS::ElasticLoadBalancingV2::Listener",
"Properties": {
"Protocol": "TCP",
"Port": 8080,
"DefaultActions": [
{
"Order": 1,
"Type": "forward",
"TargetGroupArn": {
"Ref": "APITargetGroup"
}
}
],
"LoadBalancerArn": {
"Ref": "APILoadBalancer"
}
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "9eeaa1f3-b9d0-4fb0-bf0b-6a875b07d4b0"
}
}
},
"AppSubnet1": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "VPC"
},
"AvailabilityZone": {
"Ref": "SubnetAvailabilityZone1"
},
"CidrBlock": "10.0.0.0/24"
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "34277c6f-ff64-4031-bc13-228abe0a77e4"
}
}
},
"AppSubnet2": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "VPC"
},
"AvailabilityZone": {
"Ref": "SubnetAvailabilityZone2"
},
"CidrBlock": "10.0.1.0/24"
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "bdcb12bc-7bfb-4368-9fba-0469501d29df"
}
}
},
"APISubnet1": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "VPC"
},
"AvailabilityZone": {
"Ref": "SubnetAvailabilityZone1"
},
"CidrBlock": "10.0.2.0/24"
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "333c1bc0-0e62-49cf-b182-53272caadb9f"
}
}
},
"APISubnet2": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "VPC"
},
"AvailabilityZone": {
"Ref": "SubnetAvailabilityZone2"
},
"CidrBlock": "10.0.3.0/24"
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "5620a319-357e-49cc-9ce9-85c9dd7d0879"
}
}
},
"APISecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription": "Open database for access",
"SecurityGroupIngress": [
{
"IpProtocol": "tcp",
"FromPort": "3306",
"ToPort": "3306",
"SourceSecurityGroupId": {
"Ref": "AppSecurityGroup"
}
}
],
"VpcId": {
"Ref": "VPC"
}
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "b8052b79-4c51-4834-ba8c-c8d04a37ed85"
}
}
},
"AppSecurityGroup": {
"Type": "AWS::EC2::SecurityGroup",
"Properties": {
"GroupDescription": "Enable HTTP access via port 80 locked down to the load balancer + SSH access",
"SecurityGroupIngress": [
{
"IpProtocol": "tcp",
"FromPort": "80",
"ToPort": "80"
},
{
"IpProtocol": "tcp",
"FromPort": "22",
"ToPort": "22",
"CidrIp": {
"Ref": "SSHLocation"
}
}
],
"VpcId": {
"Ref": "VPC"
}
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "f5f84b37-fb34-41b6-9bb6-b51df725ad21"
}
}
},
"AdminAppServer": {
"Type": "AWS::EC2::Instance",
"Properties": {
"ImageId" : {"Ref": "AdminAppImage"},
"NetworkInterfaces": [
{
"SubnetId": {
"Ref": "AppSubnet1"
},
"DeviceIndex": "0",
"GroupSet": [
{
"Ref": "AppSecurityGroup"
}
]
}
]
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "03fbe94d-c140-41df-9d89-d216e45f2e58"
}
}
},
"APIServer": {
"Type": "AWS::EC2::Instance",
"Properties": {
"ImageId" : {"Ref": "APIServerImage"},
"NetworkInterfaces": [
{
"SubnetId": {
"Ref": "APISubnet1"
},
"DeviceIndex": "0",
"GroupSet": [
{
"Ref": "APISecurityGroup"
}
]
}
]
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "ef121cd7-4268-4c9c-8b2f-5f97f027f9d3"
}
}
},
"CustomerAppServer": {
"Type": "AWS::EC2::Instance",
"Properties": {
"ImageId" : {"Ref": "CustomerAppImage"},
"NetworkInterfaces": [
{
"SubnetId": {
"Ref": "AppSubnet1"
},
"DeviceIndex": "0",
"GroupSet": [
{
"Ref": "AppSecurityGroup"
}
]
}
]
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "1cdfad39-a270-43d2-9242-f19b02054873"
}
}
},
"VPC": {
"Type": "AWS::EC2::VPC",
"Properties": {
"CidrBlock": "10.0.0.0/16"
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "2160bcaf-c7df-44b5-ba08-ea9b9b39d56c"
}
}
},
"InternetGateway": {
"Type": "AWS::EC2::InternetGateway",
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "b292bd84-f885-4496-ba1d-7b852d2199e7"
}
}
},
"InternetGatewayAttachment": {
"Type": "AWS::EC2::VPCGatewayAttachment",
"Properties": {
"InternetGatewayId": {
"Ref": "InternetGateway"
},
"VpcId": {
"Ref": "VPC"
}
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"id": "2f39b3a4-0672-49c2-aa74-994c07ae5f9c"
}
}
}
},
"Metadata": {
"AWS::CloudFormation::Designer": {
"f5f84b37-fb34-41b6-9bb6-b51df725ad21": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 480,
"y": 90
},
"z": 1,
"embeds": [],
"iscontainedinside": [
"2160bcaf-c7df-44b5-ba08-ea9b9b39d56c"
]
},
"b8052b79-4c51-4834-ba8c-c8d04a37ed85": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 480,
"y": 210
},
"z": 1,
"embeds": [],
"iscontainedinside": [
"2160bcaf-c7df-44b5-ba08-ea9b9b39d56c"
]
},
"5620a319-357e-49cc-9ce9-85c9dd7d0879": {
"size": {
"width": 150,
"height": 150
},
"position": {
"x": 1290,
"y": 300
},
"z": 1,
"embeds": [],
"iscontainedinside": [
"2160bcaf-c7df-44b5-ba08-ea9b9b39d56c"
]
},
"333c1bc0-0e62-49cf-b182-53272caadb9f": {
"size": {
"width": 150,
"height": 150
},
"position": {
"x": 1110,
"y": 270
},
"z": 1,
"embeds": [],
"iscontainedinside": [
"2160bcaf-c7df-44b5-ba08-ea9b9b39d56c"
]
},
"bdcb12bc-7bfb-4368-9fba-0469501d29df": {
"size": {
"width": 150,
"height": 150
},
"position": {
"x": 1290,
"y": 90
},
"z": 1,
"embeds": [],
"iscontainedinside": [
"2160bcaf-c7df-44b5-ba08-ea9b9b39d56c"
]
},
"34277c6f-ff64-4031-bc13-228abe0a77e4": {
"size": {
"width": 150,
"height": 150
},
"position": {
"x": 900,
"y": 90
},
"z": 1,
"embeds": [],
"iscontainedinside": [
"2160bcaf-c7df-44b5-ba08-ea9b9b39d56c"
]
},
"45800956-4c26-48ba-8237-274ab5065908": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 480,
"y": 330
},
"z": 1,
"embeds": []
},
"0eeadd9d-05ed-4784-abc0-642e5120c005": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 480,
"y": 450
},
"z": 1,
"embeds": [],
"iscontainedinside": [
"333c1bc0-0e62-49cf-b182-53272caadb9f",
"5620a319-357e-49cc-9ce9-85c9dd7d0879"
]
},
"67f75b3d-ed07-480a-8dbc-26d79af8df7d": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 60,
"y": 510
},
"z": 1,
"embeds": []
},
"3e79f579-6393-47b9-84a7-9c6a2aac6ede": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 180,
"y": 510
},
"z": 1,
"embeds": []
},
"54377670-4b84-49f7-9546-d6836316a4ac": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 300,
"y": 510
},
"z": 1,
"embeds": [],
"iscontainedinside": [
"34277c6f-ff64-4031-bc13-228abe0a77e4",
"bdcb12bc-7bfb-4368-9fba-0469501d29df"
]
},
"9eeaa1f3-b9d0-4fb0-bf0b-6a875b07d4b0": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 540,
"y": 570
},
"z": 1,
"embeds": [],
"isassociatedwith": [
"54377670-4b84-49f7-9546-d6836316a4ac"
]
},
"8547030b-1911-458d-95b5-ebd841124ced": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 600,
"y": 90
},
"z": 1,
"embeds": [],
"isassociatedwith": [
"54377670-4b84-49f7-9546-d6836316a4ac"
]
},
"03fbe94d-c140-41df-9d89-d216e45f2e58": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 750,
"y": 330
},
"z": 1,
"embeds": [],
"isassociatedwith": [
"f5f84b37-fb34-41b6-9bb6-b51df725ad21"
],
"iscontainedinside": [
"34277c6f-ff64-4031-bc13-228abe0a77e4"
]
},
"ef121cd7-4268-4c9c-8b2f-5f97f027f9d3": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 930,
"y": 390
},
"z": 1,
"embeds": [],
"isassociatedwith": [
"b8052b79-4c51-4834-ba8c-c8d04a37ed85"
],
"iscontainedinside": [
"333c1bc0-0e62-49cf-b182-53272caadb9f"
]
},
"1cdfad39-a270-43d2-9242-f19b02054873": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 660,
"y": 240
},
"z": 1,
"embeds": [],
"isassociatedwith": [
"f5f84b37-fb34-41b6-9bb6-b51df725ad21"
],
"iscontainedinside": [
"34277c6f-ff64-4031-bc13-228abe0a77e4"
]
},
"2160bcaf-c7df-44b5-ba08-ea9b9b39d56c": {
"size": {
"width": 150,
"height": 150
},
"position": {
"x": 1140,
"y": 120
},
"z": 1,
"embeds": []
},
"b292bd84-f885-4496-ba1d-7b852d2199e7": {
"size": {
"width": 60,
"height": 60
},
"position": {
"x": 60,
"y": 90
},
"z": 1,
"embeds": []
},
"2f39b3a4-0672-49c2-aa74-994c07ae5f9c": {
"source": {
"id": "2160bcaf-c7df-44b5-ba08-ea9b9b39d56c"
},
"target": {
"id": "b292bd84-f885-4496-ba1d-7b852d2199e7"
},
"z": 0
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment