216 lines
5.7 KiB
YAML
216 lines
5.7 KiB
YAML
AWSTemplateFormatVersion: "2010-09-09"
|
|
|
|
Resources:
|
|
VPC:
|
|
Type: AWS::EC2::VPC # or AWS::RDS::DBSubnetGroup
|
|
Properties: # or Properties
|
|
CidrBlock: 10.0.0.0/16 # this is the VPC CIDR block (CIDR = Classless Inter-Domain Routing, it means you can use 0.0.0.0/0 for all IPs)
|
|
EnableDnsSupport: true # Enable DNS hostnames (EnableDnsSupport is true by default)
|
|
EnableDnsHostnames: true # Enable DNS hostnames (EnableDnsHostnames is true by default)
|
|
|
|
SubnetA:
|
|
Type: AWS::EC2::Subnet # this subnet is for the ECS instances (webserver)
|
|
Properties:
|
|
VpcId: !Ref VPC
|
|
CidrBlock: 10.0.0.0/24 # this is the subnet CIDR block it means that you can use 10.0.0.0/24
|
|
AvailabilityZone: eu-central-1a
|
|
|
|
SubnetB:
|
|
Type: AWS::EC2::Subnet # this subnet is for the RDS
|
|
Properties:
|
|
VpcId: !Ref VPC
|
|
CidrBlock: 10.0.1.0/24
|
|
AvailabilityZone: eu-central-1b
|
|
|
|
Nacl:
|
|
Type: AWS::EC2::NetworkAcl
|
|
Properties:
|
|
VpcId: !Ref VPC
|
|
|
|
InboundRuleHttps:
|
|
Type: AWS::EC2::NetworkAclEntry
|
|
Properties:
|
|
NetworkAclId: !Ref Nacl
|
|
RuleNumber: "1"
|
|
Protocol: 6
|
|
RuleAction: allow
|
|
PortRange:
|
|
From: 443
|
|
To: 443
|
|
Egress: false # Egress means outbound
|
|
CidrBlock: 0.0.0.0/0
|
|
|
|
InboundRuleHttp:
|
|
Type: AWS::EC2::NetworkAclEntry
|
|
Properties:
|
|
NetworkAclId: !Ref Nacl
|
|
RuleNumber: "2"
|
|
Protocol: 6
|
|
RuleAction: allow
|
|
PortRange:
|
|
From: 80
|
|
To: 80
|
|
Egress: false # Egress means outbound
|
|
CidrBlock: 0.0.0.0/0
|
|
|
|
OutboundRuleHttps:
|
|
Type: AWS::EC2::NetworkAclEntry
|
|
Properties:
|
|
NetworkAclId: !Ref Nacl
|
|
RuleNumber: "3"
|
|
Protocol: 6
|
|
PortRange:
|
|
From: 443
|
|
To: 443
|
|
RuleAction: allow
|
|
Egress: true
|
|
CidrBlock: 0.0.0.0/0
|
|
|
|
OutboundRuleHttp:
|
|
Type: AWS::EC2::NetworkAclEntry
|
|
Properties:
|
|
NetworkAclId: !Ref Nacl
|
|
RuleNumber: "4"
|
|
Protocol: 6
|
|
PortRange:
|
|
From: 80
|
|
To: 80
|
|
RuleAction: allow
|
|
Egress: true
|
|
CidrBlock: 0.0.0.0/0
|
|
|
|
RDSInstance:
|
|
Type: AWS::RDS::DBInstance
|
|
Properties:
|
|
AllocatedStorage: 20
|
|
DBInstanceClass: db.t2.micro
|
|
Engine: mysql # or postgres
|
|
MasterUsername: root_user
|
|
MasterUserPassword: root_password
|
|
DBName: root_db
|
|
MultiAZ: false
|
|
|
|
ECSCluster:
|
|
Type: AWS::ECS::Cluster # this ECSCluster is to run the ECS tasks
|
|
|
|
ECSTaskDefinition:
|
|
Type: AWS::ECS::TaskDefinition
|
|
Properties:
|
|
NetworkMode: awsvpc
|
|
RequiresCompatibilities:
|
|
- FARGATE
|
|
ExecutionRoleArn: !Ref ExecutionRole
|
|
TaskRoleArn: !Ref TaskRole
|
|
Cpu: 256
|
|
Memory: 0.5GB
|
|
Family: !Ref ECSCluster
|
|
ContainerDefinitions:
|
|
- Name: commit-nginx
|
|
Image: 539634357948.dkr.ecr.eu-central-1.amazonaws.com/commit-nginx:latest
|
|
Memory: 512 # Specify memory here (in MiB)
|
|
PortMappings:
|
|
- ContainerPort: 80
|
|
- ContainerPort: 443
|
|
|
|
ECSService:
|
|
Type: AWS::ECS::Service
|
|
Properties:
|
|
Cluster: !Ref ECSCluster
|
|
LoadBalancers:
|
|
- ContainerName: commit-nginx
|
|
ContainerPort: 80
|
|
LoadBalancerName: !GetAtt LoadBalancer.Name
|
|
TaskDefinition: !Ref ECSTaskDefinition
|
|
DesiredCount: 1
|
|
LaunchType: EC2
|
|
NetworkConfiguration:
|
|
AwsvpcConfiguration:
|
|
Subnets:
|
|
- !Ref SubnetA
|
|
- !Ref SubnetB
|
|
DependsOn:
|
|
- "LoadBalancer"
|
|
|
|
|
|
LoadBalancer:
|
|
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
|
|
Properties:
|
|
Name: "Commit-elb"
|
|
LoadBalancerAttributes:
|
|
# this is the default, but is specified here in case it needs to be changed
|
|
- Key: idle_timeout.timeout_seconds
|
|
Value: 60
|
|
# "internal" is also an option
|
|
Scheme: internet-facing
|
|
Subnets:
|
|
- !Ref SubnetA
|
|
- !Ref SubnetB
|
|
|
|
ExecutionRole:
|
|
Type: AWS::IAM::Role
|
|
Properties:
|
|
RoleName: "Commit-ECSRole"
|
|
AssumeRolePolicyDocument:
|
|
Statement:
|
|
- Effect: Allow
|
|
Principal:
|
|
Service: ecs-tasks.amazonaws.com
|
|
Action: "sts:AssumeRole"
|
|
ManagedPolicyArns:
|
|
- "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
|
|
|
|
TaskRole:
|
|
Type: AWS::IAM::Role
|
|
Properties:
|
|
RoleName: "Commit-TaskRole"
|
|
AssumeRolePolicyDocument:
|
|
Statement:
|
|
- Effect: Allow
|
|
Principal:
|
|
Service: ecs-tasks.amazonaws.com
|
|
Action: "sts:AssumeRole"
|
|
|
|
MyInternetGateway:
|
|
Type: AWS::EC2::InternetGateway
|
|
Properties:
|
|
Tags:
|
|
- Key: stack
|
|
Value: production
|
|
|
|
MyVPCGatewayAttachment:
|
|
Type: AWS::EC2::VPCGatewayAttachment
|
|
Properties:
|
|
InternetGatewayId: !Ref MyInternetGateway
|
|
VpcId: !Ref VPC
|
|
|
|
|
|
|
|
ListenerHTTPS:
|
|
Type: AWS::ElasticLoadBalancingV2::Listener
|
|
Properties:
|
|
DefaultActions:
|
|
- TargetGroupArn: !Ref TargetGroup
|
|
Type: forward
|
|
LoadBalancerArn: !Ref LoadBalancer
|
|
Port: 80
|
|
Protocol: HTTP
|
|
# Certificates:
|
|
# - CertificateArn: "arn:aws:acm:eu-central-1:539634357948:certificate/584cfb24-bc7a-431b-9150-16d47bdb8ea9"
|
|
|
|
TargetGroup:
|
|
Type: AWS::ElasticLoadBalancingV2::TargetGroup
|
|
Properties:
|
|
HealthCheckIntervalSeconds: 10
|
|
# will look for a 200 status code by default unless specified otherwise
|
|
HealthCheckPath: "/"
|
|
HealthCheckTimeoutSeconds: 5
|
|
UnhealthyThresholdCount: 2
|
|
HealthyThresholdCount: 2
|
|
Name: MyTargetGroup
|
|
Port: 80
|
|
Protocol: HTTP
|
|
TargetGroupAttributes:
|
|
- Key: deregistration_delay.timeout_seconds
|
|
Value: 60 # default is 300
|
|
TargetType: ip
|
|
VpcId: !Ref VPC
|