-
Notifications
You must be signed in to change notification settings - Fork 0
/
projeto.yaml
307 lines (285 loc) · 10.8 KB
/
projeto.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
Resources:
# Definição do grupo de segurança que especifica as regras de tráfego permitidas para as instâncias EC2
SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: "Grupo de Seguranca para acesso a aplicacao"
VpcId: !Ref gustavoVPC
SecurityGroupIngress:
- IpProtocol: "tcp"
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0 # Abre a porta 80 para todo o tráfego (HTTP)
- IpProtocol: "tcp"
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0 # Abre a porta 22 para todo o tráfego (SSH)
Tags:
- Key: Name
Value: SecurityGroup
# Configuração da VPC onde todos os recursos da rede serão implantados
gustavoVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: gustavoVPC
# Definição das subnets públicas dentro da VPC cada uma em uma zona diferente
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref gustavoVPC
CidrBlock: 10.0.1.0/24
AvailabilityZone: !Select [0, !GetAZs '']
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: PublicSubnet1
PublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref gustavoVPC
CidrBlock: 10.0.2.0/24
AvailabilityZone: !Select [1, !GetAZs '']
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: PublicSubnet2
# Configuração da IAM Role para permitir que as instâncias EC2 acessem recursos específicos no S3 e DynamoDB (estava dando erro sem isso)
S3AccessRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service: "ec2.amazonaws.com"
Action: "sts:AssumeRole"
Policies:
- PolicyName: "AccessS3BucketAndDynamoDB"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action: "s3:GetObject"
Resource: "arn:aws:s3:::bucket-projeto-gustavo/*"
- Effect: "Allow"
Action:
- "dynamodb:Scan"
- "dynamodb:PutItem"
- "dynamodb:DeleteItem"
- "dynamodb:GetItem"
- "dynamodb:UpdateItem"
Resource: "arn:aws:dynamodb:us-east-1:116979769772:table/Users"
# Instance Profile que associa a IAM Role às instâncias EC2
EC2InstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Roles:
- !Ref S3AccessRole
# Launch Configuration: Define uma configuração de lançamento que especifica uma AMI e configurações de instância, incluindo a instalação de software via UserData.
AppLaunchConfiguration:
Type: AWS::AutoScaling::LaunchConfiguration
Properties:
ImageId: ami-07caf09b362be10b8
InstanceType: t2.micro
SecurityGroups:
- !Ref SecurityGroup
IamInstanceProfile: !Ref EC2InstanceProfile
# userData para colocar a aplicação nas instancias
UserData:
Fn::Base64: !Sub |
#!/bin/bash
# Instalar Python e pip
sudo yum install -y python3-pip python3
#instalar o flask
sudo pip3 install flask
# Instalar AWS SDK para Python (Boto3)
sudo pip3 install boto3
# Criar diretório para a aplicação
mkdir -p /opt/app
cd /opt/app
# Baixar a aplicação do S3
aws s3 cp s3://bucket-projeto-gustavo/aplicacao.py /opt/app/aplicacao.py
# Executar a aplicação (ajustar conforme necessário)
python3 /opt/app/aplicacao.py
# Auto Scaling Group (ASG): Configura um grupo de auto scaling que utiliza o Launch Configuration para escalar automaticamente as instâncias.
AppAutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
LaunchConfigurationName: !Ref AppLaunchConfiguration
MinSize: '1'
MaxSize: '5'
DesiredCapacity: '3'
# Necessario utilizar duas subnets para garantir alta disponibilidade
VPCZoneIdentifier:
- !Ref PublicSubnet1
- !Ref PublicSubnet2
# Integração do ASG com o ALB através do Target Group: ASG está vinculado ao ALB através de um Target Group especificado.
TargetGroupARNs:
- !Ref AppTargetGroup
MetricsCollection:
- Granularity: "1Minute"
#ACHO QUE NAO FUNCIONOU
Tags:
- Key: "Name"
Value: "instances-gustavo"
PropagateAtLaunch: true
- Key: "Environment"
Value: "Production"
PropagateAtLaunch: true
- Key: "Project"
Value: "MyApplication"
PropagateAtLaunch: true
# Alarmes de CloudWatch para monitorar e responder a condições específicas, como alta utilização de CPU (no caso 70%) e utiliza scaling policies para aumentar ou diminuir o número de instâncias.
CPUUtilizationAlarmHigh:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmDescription: "Alarme quando a CPU excede 70%"
Namespace: "AWS/EC2"
MetricName: "CPUUtilization"
Dimensions:
- Name: "AutoScalingGroupName"
Value: !Ref AppAutoScalingGroup
Statistic: Average
Period: 300
EvaluationPeriods: 1 # Número de períodos de avaliação antes de acionar o alarme
Threshold: 70
ComparisonOperator: GreaterThanOrEqualToThreshold
AlarmActions:
- !Ref ScaleOutPolicy
OKActions:
- !Ref ScaleInPolicy
# Políticas de escalabilidade para aumentar ou diminuir o número de instâncias automaticamente
ScaleOutPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
AutoScalingGroupName: !Ref AppAutoScalingGroup
PolicyType: SimpleScaling
AdjustmentType: ChangeInCapacity
ScalingAdjustment: 1
Cooldown: 300
ScaleInPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
AutoScalingGroupName: !Ref AppAutoScalingGroup
PolicyType: SimpleScaling
AdjustmentType: ChangeInCapacity
ScalingAdjustment: -1
Cooldown: 300
# Application Load Balancer, Target Group, and Listener
# Provisionar um ALB: ALB configurado para distribuir o tráfego entre instâncias EC2.
AppLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Type: "application"
Subnets:
- !Ref PublicSubnet1
- !Ref PublicSubnet2
SecurityGroups:
- !Ref SecurityGroup
# Configurar Target Groups: Definição de Target Group para gerenciar as instâncias EC2 com configurações de Health Check.
AppTargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
VpcId: !Ref gustavoVPC
Protocol: HTTP # Define o protocolo usado pelo Target Group
Port: 80
# Health Checks: Implementados no Target Group para garantir que o tráfego seja direcionado apenas para instâncias saudáveis.
HealthCheckProtocol: HTTP
HealthCheckPort: "80"
HealthCheckPath: "/"
HealthCheckIntervalSeconds: 30 # Intervalo entre os health checks
HealthCheckTimeoutSeconds: 5 # Tempo máximo de espera por uma resposta de health check
HealthyThresholdCount: 3 # Número de verificações sucessivas para considerar a instância saudável
UnhealthyThresholdCount: 3 # Número de verificações falhas para considerar a instância não saudável
# Listener para o ALB, que direciona o tráfego recebido para o Target Group
Listener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: forward # Ação padrão para encaminhamento do tráfego para o Target Group
TargetGroupArn: !Ref AppTargetGroup
LoadBalancerArn: !Ref AppLoadBalancer # Referência ao ALB associado
Port: 80
Protocol: HTTP
# Criação do Internet Gateway para permitir comunicação entre a VPC e a internet
InternetGateway:
Type: AWS::EC2::InternetGateway
# Anexação do Internet Gateway à VPC
GatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref gustavoVPC
InternetGatewayId: !Ref InternetGateway
# Tabela de rotas para a VPC que define como o tráfego é direcionado
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref gustavoVPC
# Tabela de rotas para a VPC que define como o tráfego é direcionado
InternetRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0 # Define que a rota aplica-se a todo o tráfego
GatewayId: !Ref InternetGateway
# Associações entre as subnets públicas e a tabela de rotas para garantir que possam acessar a internet
PublicSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet1 # Subnet a ser associada
RouteTableId: !Ref PublicRouteTable
PublicSubnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet2
RouteTableId: !Ref PublicRouteTable
# Provisionar uma instância DynamoDB: Tabela DynamoDB configurada dentro da VPC.
DynamoDBTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: "Users" # Nome da Tabela
AttributeDefinitions:
- AttributeName: "UserID" # Definicao do atributo da chave primaria
AttributeType: "S" # Tipo String
KeySchema:
- AttributeName: "UserID" # Tipo da chave primaria como hash
KeyType: "HASH"
ProvisionedThroughput:
ReadCapacityUnits: 5 # Unidades de capacidade de leitura
WriteCapacityUnits: 5 # Unidades de capacidade de escrita
Tags:
- Key: "Name"
Value: "Users"
# Endpoint VPC para DynamoDB para permitir acesso direto e privado à tabela de dentro da VPC sem necessidade de acesso a internet
DynamoDBVpcEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
VpcId: !Ref gustavoVPC
ServiceName: !Sub "com.amazonaws.${AWS::Region}.dynamodb"
VpcEndpointType: "Interface"
SubnetIds:
- !Ref PublicSubnet1
- !Ref PublicSubnet2
PrivateDnsEnabled: false
SecurityGroupIds:
- !Ref SecurityGroup
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal: "*"
Action: "dynamodb:*"
Resource: "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/Users"
# Output para conseguir pegar o DNS do ALB sem ter que entrar no dashboard
Outputs:
LoadBalancerDNS:
Description: "DNS Name of the Application Load Balancer"
Value: !GetAtt AppLoadBalancer.DNSName
Export:
Name: "LoadBalancerDNSName"