Agent: "Stwórz szablon CloudFormation dla:
- Architektury trójwarstwowej
- Dystrybucji CloudFront"
# templates/infrastructure.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Infrastruktura aplikacji trójwarstwowej z HA i auto-scaling'
Description: Nazwa prefiksu środowiska
Description: Blok CIDR dla VPC
Description: Bloki CIDR dla publicznych podsieci
Default: "10.0.1.0/24,10.0.2.0/24,10.0.3.0/24"
Description: Bloki CIDR dla prywatnych podsieci
Default: "10.0.11.0/24,10.0.12.0/24,10.0.13.0/24"
Description: Bloki CIDR dla podsieci bazy danych
Default: "10.0.21.0/24,10.0.22.0/24,10.0.23.0/24"
Description: Typ instancji EC2 dla serwerów aplikacji
Description: Typ instancji RDS
Description: Hasło master RDS
Description: Nazwa pary kluczy EC2
Type: AWS::EC2::KeyPair::KeyName
Description: Minimalna liczba instancji
Description: Maksymalna liczba instancji
Description: Pożądana liczba instancji
AWS::CloudFormation::Interface:
default: "Konfiguracja sieci"
default: "Konfiguracja serwera"
default: "Konfiguracja bazy danych"
Value: !Sub ${EnvironmentName}-vpc
Type: AWS::EC2::InternetGateway
Value: !Sub ${EnvironmentName}-igw
InternetGatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
InternetGatewayId: !Ref InternetGateway
AvailabilityZone: !Select [0, !GetAZs '']
CidrBlock: !Select [0, !Ref PublicSubnetCidrs]
MapPublicIpOnLaunch: true
Value: !Sub ${EnvironmentName}-public-subnet-1
- Key: kubernetes.io/role/elb
AvailabilityZone: !Select [1, !GetAZs '']
CidrBlock: !Select [1, !Ref PublicSubnetCidrs]
MapPublicIpOnLaunch: true
Value: !Sub ${EnvironmentName}-public-subnet-2
- Key: kubernetes.io/role/elb
AvailabilityZone: !Select [2, !GetAZs '']
CidrBlock: !Select [2, !Ref PublicSubnetCidrs]
MapPublicIpOnLaunch: true
Value: !Sub ${EnvironmentName}-public-subnet-3
- Key: kubernetes.io/role/elb
DependsOn: InternetGatewayAttachment
DependsOn: InternetGatewayAttachment
Type: AWS::EC2::NatGateway
AllocationId: !GetAtt NatGateway1EIP.AllocationId
SubnetId: !Ref PublicSubnet1
Type: AWS::EC2::NatGateway
AllocationId: !GetAtt NatGateway2EIP.AllocationId
SubnetId: !Ref PublicSubnet2
Type: AWS::EC2::RouteTable
Value: !Sub ${EnvironmentName}-public-routes
DependsOn: InternetGatewayAttachment
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
PublicSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
RouteTableId: !Ref PublicRouteTable
SubnetId: !Ref PublicSubnet1
PublicSubnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
RouteTableId: !Ref PublicRouteTable
SubnetId: !Ref PublicSubnet2
PublicSubnet3RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
RouteTableId: !Ref PublicRouteTable
SubnetId: !Ref PublicSubnet3
AvailabilityZone: !Select [0, !GetAZs '']
CidrBlock: !Select [0, !Ref PrivateSubnetCidrs]
Value: !Sub ${EnvironmentName}-private-subnet-1
- Key: kubernetes.io/role/internal-elb
AvailabilityZone: !Select [1, !GetAZs '']
CidrBlock: !Select [1, !Ref PrivateSubnetCidrs]
Value: !Sub ${EnvironmentName}-private-subnet-2
- Key: kubernetes.io/role/internal-elb
AvailabilityZone: !Select [2, !GetAZs '']
CidrBlock: !Select [2, !Ref PrivateSubnetCidrs]
Value: !Sub ${EnvironmentName}-private-subnet-3
- Key: kubernetes.io/role/internal-elb
# Prywatne tabele routingu
Type: AWS::EC2::RouteTable
Value: !Sub ${EnvironmentName}-private-routes-1
RouteTableId: !Ref PrivateRouteTable1
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId: !Ref NatGateway1
PrivateSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
RouteTableId: !Ref PrivateRouteTable1
SubnetId: !Ref PrivateSubnet1
Type: AWS::EC2::RouteTable
Value: !Sub ${EnvironmentName}-private-routes-2
RouteTableId: !Ref PrivateRouteTable2
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId: !Ref NatGateway2
PrivateSubnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
RouteTableId: !Ref PrivateRouteTable2
SubnetId: !Ref PrivateSubnet2
PrivateSubnet3RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
RouteTableId: !Ref PrivateRouteTable2
SubnetId: !Ref PrivateSubnet3
AvailabilityZone: !Select [0, !GetAZs '']
CidrBlock: !Select [0, !Ref DatabaseSubnetCidrs]
Value: !Sub ${EnvironmentName}-database-subnet-1
AvailabilityZone: !Select [1, !GetAZs '']
CidrBlock: !Select [1, !Ref DatabaseSubnetCidrs]
Value: !Sub ${EnvironmentName}-database-subnet-2
AvailabilityZone: !Select [2, !GetAZs '']
CidrBlock: !Select [2, !Ref DatabaseSubnetCidrs]
Value: !Sub ${EnvironmentName}-database-subnet-3
Type: AWS::EC2::SecurityGroup
GroupName: !Sub ${EnvironmentName}-alb-sg
GroupDescription: Grupa bezpieczeństwa dla Application Load Balancer
Value: !Sub ${EnvironmentName}-alb-sg
Type: AWS::EC2::SecurityGroup
GroupName: !Sub ${EnvironmentName}-webserver-sg
GroupDescription: Grupa bezpieczeństwa dla serwerów web
SourceSecurityGroupId: !Ref ALBSecurityGroup
SourceSecurityGroupId: !Ref ALBSecurityGroup
Value: !Sub ${EnvironmentName}-webserver-sg
Type: AWS::EC2::SecurityGroup
GroupName: !Sub ${EnvironmentName}-database-sg
GroupDescription: Grupa bezpieczeństwa dla bazy danych RDS
SourceSecurityGroupId: !Ref WebServerSecurityGroup
Value: !Sub ${EnvironmentName}-database-sg
Type: AWS::EC2::SecurityGroup
GroupName: !Sub ${EnvironmentName}-cache-sg
GroupDescription: Grupa bezpieczeństwa dla ElastiCache
SourceSecurityGroupId: !Ref WebServerSecurityGroup
Value: !Sub ${EnvironmentName}-cache-sg
# Application Load Balancer
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Name: !Sub ${EnvironmentName}-alb
Value: !Sub ${EnvironmentName}-alb
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Name: !Sub ${EnvironmentName}-tg
HealthCheckProtocol: HTTP
HealthCheckIntervalSeconds: 30
HealthCheckTimeoutSeconds: 5
UnhealthyThresholdCount: 3
Value: !Sub ${EnvironmentName}-tg
Type: AWS::ElasticLoadBalancingV2::Listener
TargetGroupArn: !Ref ALBTargetGroup
LoadBalancerArn: !Ref ApplicationLoadBalancer
Type: AWS::EC2::LaunchTemplate
LaunchTemplateName: !Sub ${EnvironmentName}-lt
ImageId: !Ref LatestAmiId
InstanceType: !Ref InstanceType
KeyName: !Ref KeyPairName
- !Ref WebServerSecurityGroup
Arn: !GetAtt InstanceProfile.Arn
# Instaluj agenta CloudWatch
wget https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
rpm -U ./amazon-cloudwatch-agent.rpm
cat > /var/www/html/index.html <<EOF
<h1>Witaj z ${EnvironmentName}</h1>
<p>ID instancji: $(ec2-metadata --instance-id | cut -d " " -f 2)</p>
<p>Strefa dostępności: $(ec2-metadata --availability-zone | cut -d " " -f 2)</p>
# Konfiguruj logi CloudWatch
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-c file:/opt/aws/amazon-cloudwatch-agent/etc/config.json
Value: !Sub ${EnvironmentName}-instance
Value: !Sub ${EnvironmentName}-volume
Type: AWS::AutoScaling::AutoScalingGroup
AutoScalingGroupName: !Sub ${EnvironmentName}-asg
LaunchTemplateId: !Ref LaunchTemplate
Version: !GetAtt LaunchTemplate.LatestVersionNumber
DesiredCapacity: !Ref DesiredCapacity
HealthCheckGracePeriod: 300
Value: !Sub ${EnvironmentName}-asg-instance
# Parametr store dla najnowszego AMI
Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
Name: !Sub ${EnvironmentName}-VPC-ID
Description: ID publicznych podsieci
Value: !Join [',', [!Ref PublicSubnet1, !Ref PublicSubnet2, !Ref PublicSubnet3]]
Name: !Sub ${EnvironmentName}-PUBLIC-SUBNETS
Description: ID prywatnych podsieci
Value: !Join [',', [!Ref PrivateSubnet1, !Ref PrivateSubnet2, !Ref PrivateSubnet3]]
Name: !Sub ${EnvironmentName}-PRIVATE-SUBNETS
Description: Nazwa DNS Application Load Balancer
Value: !GetAtt ApplicationLoadBalancer.DNSName
Name: !Sub ${EnvironmentName}-ALB-DNS
Description: URL dystrybucji CloudFront
Value: !GetAtt CloudFrontDistribution.DomainName
Name: !Sub ${EnvironmentName}-CLOUDFRONT-URL
Description: Endpoint bazy danych RDS
Value: !GetAtt DatabaseInstance.Endpoint.Address
Name: !Sub ${EnvironmentName}-DATABASE-ENDPOINT
Description: Endpoint ElastiCache
Value: !GetAtt CacheCluster.RedisEndpoint.Address
Name: !Sub ${EnvironmentName}-CACHE-ENDPOINT