-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIAC.yml
More file actions
352 lines (316 loc) · 8.8 KB
/
IAC.yml
File metadata and controls
352 lines (316 loc) · 8.8 KB
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
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Quarkus Video Transcoder: VPC, ALB, Private ASG, and Service Endpoints'
Parameters:
BakedAmiId:
Type: AWS::EC2::Image::Id
Description: The ID of the AMI you just baked (e.g., ami-0xxxxxxx)
Default: # Insert your AMI ID
InstanceType:
Type: String
Default: t3.micro
VpcCidr:
Type: String
Default: 10.0.0.0/16
Resources:
# --- 1. NETWORKING LAYER ---
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcCidr
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: TranscoderVPC
InternetGateway:
Type: AWS::EC2::InternetGateway
VPCGatewayAttachment:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref InternetGateway
# AZ 1 Subnets
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.1.0/24
AvailabilityZone: !Select
- 0
- !GetAZs ''
MapPublicIpOnLaunch: true
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.2.0/24
AvailabilityZone: !Select
- 0
- !GetAZs ''
# AZ 2 Subnets (Required for ALB)
PublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.3.0/24
AvailabilityZone: !Select
- 1
- !GetAZs ''
MapPublicIpOnLaunch: true
PrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.4.0/24
AvailabilityZone: !Select
- 1
- !GetAZs ''
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
DefaultPublicRoute:
Type: AWS::EC2::Route
DependsOn: VPCGatewayAttachment
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
PrivateRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
# Associations
PublicSubnet1Assoc:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet1
RouteTableId: !Ref PublicRouteTable
PublicSubnet2Assoc:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet2
RouteTableId: !Ref PublicRouteTable
PrivateSubnet1Association:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateSubnet1
RouteTableId: !Ref PrivateRouteTable
PrivateSubnet2Association:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PrivateSubnet2
RouteTableId: !Ref PrivateRouteTable
# --- 2. VPC ENDPOINTS (Private Connectivity) ---
S3Endpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Sub com.amazonaws.${AWS::Region}.s3
VpcId: !Ref VPC
VpcEndpointType: Gateway
RouteTableIds:
- !Ref PrivateRouteTable
DynamoDBEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Sub com.amazonaws.${AWS::Region}.dynamodb
VpcId: !Ref VPC
VpcEndpointType: Gateway
RouteTableIds:
- !Ref PrivateRouteTable
SQSEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Sub com.amazonaws.${AWS::Region}.sqs
VpcId: !Ref VPC
VpcEndpointType: Interface
PrivateDnsEnabled: true
SubnetIds:
- !Ref PrivateSubnet1
- !Ref PrivateSubnet2
SecurityGroupIds:
- !Ref SqsEndpointSG
CloudWatchLogsEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Sub com.amazonaws.${AWS::Region}.logs
VpcId: !Ref VPC
VpcEndpointType: Interface
PrivateDnsEnabled: true
SubnetIds:
- !Ref PrivateSubnet1
- !Ref PrivateSubnet2
SecurityGroupIds:
- !Ref CloudWatchEndpointSG
# --- 3. SECURITY GROUPS ---
AlbSG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow HTTP to Load Balancer
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Ec2SG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow ALB to Workers
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 8080
ToPort: 8080
SourceSecurityGroupId: !Ref AlbSG
SqsEndpointSG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow EC2 to SQS Endpoint
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 443
ToPort: 443
SourceSecurityGroupId: !Ref Ec2SG
CloudWatchEndpointSG:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow EC2 to CloudWatch Logs Endpoint
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 443
ToPort: 443
SourceSecurityGroupId: !Ref Ec2SG
# --- 4. LOAD BALANCER ---
ALB:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Subnets:
- !Ref PublicSubnet1
- !Ref PublicSubnet2
SecurityGroups:
- !Ref AlbSG
TargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
VpcId: !Ref VPC
Port: 8080
Protocol: HTTP
TargetType: instance
HealthCheckPath: /q/health
Listener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
LoadBalancerArn: !Ref ALB
Port: 80
Protocol: HTTP
DefaultActions:
- Type: forward
TargetGroupArn: !Ref TargetGroup
# --- 5. COMPUTE & AUTO SCALING ---
LaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateData:
ImageId: !Ref BakedAmiId
InstanceType: !Ref InstanceType
SecurityGroupIds:
- !Ref Ec2SG
IamInstanceProfile:
Arn: !GetAtt Ec2InstanceProfile.Arn
ASG:
Type: AWS::AutoScaling::AutoScalingGroup
DependsOn:
- TranscoderMediaBucket
- TranscoderQueue
- TranscodeTable
Properties:
VPCZoneIdentifier:
- !Ref PrivateSubnet1
- !Ref PrivateSubnet2
LaunchTemplate:
LaunchTemplateId: !Ref LaunchTemplate
Version: !GetAtt LaunchTemplate.LatestVersionNumber
MinSize: '1'
MaxSize: '2'
TargetGroupARNs:
- !Ref TargetGroup
# --- 6. IAM ROLE (The "Key" to services) ---
Ec2InstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Roles:
- !Ref Ec2Role # This links your existing/new role to the profile
Ec2Role:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- ec2.amazonaws.com
Action:
- sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonS3FullAccess
- arn:aws:iam::aws:policy/AmazonSQSFullAccess
- arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess
- arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
# ------- 7. Data layer ------------------
TranscoderDLQ:
Type: AWS::SQS::Queue
Properties:
QueueName: Transcoder-DLQ
TranscoderQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: TranscoderVideoRequestsQ
VisibilityTimeout: 300 # 5 minutes for FFmpeg to finish
RedrivePolicy:
deadLetterTargetArn: !GetAtt TranscoderDLQ.Arn
maxReceiveCount: 3
TranscodeTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: transcoderStats
AttributeDefinitions:
- AttributeName: video_id
AttributeType: S
KeySchema:
- AttributeName: video_id
KeyType: HASH
BillingMode: PAY_PER_REQUEST
S3ToSqsPolicy:
Type: AWS::SQS::QueuePolicy
Properties:
Queues:
- !Ref TranscoderQueue
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: s3.amazonaws.com
Action: sqs:SendMessage
Resource: !GetAtt TranscoderQueue.Arn
Condition:
ArnLike:
aws:SourceArn: !Sub arn:aws:s3:::transcoderprocessingbucket
TranscoderMediaBucket:
Type: AWS::S3::Bucket
DependsOn: S3ToSqsPolicy # Crucial: SQS policy must exist before S3 can validate the trigger
Properties:
BucketName: !Sub transcoderprocessingbucket
NotificationConfiguration:
QueueConfigurations:
- Event: s3:ObjectCreated:*
Queue: !GetAtt TranscoderQueue.Arn
Filter:
S3Key:
Rules:
- Name: prefix
Value: PreProcess/