-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtemplate.yaml
200 lines (200 loc) · 6.23 KB
/
template.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
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: WebSocket-based feature toggle solution.
Parameters:
ConnectionTableName:
Type: String
Default: "feature_toggle_connections"
Description: Feature toggle connections.
MinLength: 3
MaxLength: 50
AllowedPattern: ^[A-Za-z_]+$
ConstraintDescription: "Required. Can be characters and underscore only. No numbers or special characters allowed."
FeatureToggleTableName:
Type: String
Default: "feature_toggle_values"
Description: Feature toggle values.
MinLength: 3
MaxLength: 50
AllowedPattern: ^[A-Za-z_]+$
ConstraintDescription: "Required. Can be characters and underscore only. No numbers or special characters allowed."
Resources:
FeatureFlagWebSocket:
Type: AWS::ApiGatewayV2::Api
Properties:
Name: FeatureFlagWebSocket
ProtocolType: WEBSOCKET
RouteSelectionExpression: "$request.body.action"
ConnectRoute:
Type: AWS::ApiGatewayV2::Route
Properties:
ApiId: !Ref FeatureFlagWebSocket
RouteKey: $connect
AuthorizationType: NONE
OperationName: ConnectRoute
Target: !Join
- "/"
- - "integrations"
- !Ref ConnectIntegration
ConnectIntegration:
Type: AWS::ApiGatewayV2::Integration
Properties:
ApiId: !Ref FeatureFlagWebSocket
Description: Connect Integration
IntegrationType: AWS_PROXY
IntegrationUri:
Fn::Sub:
arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${ConnectionManagerFunction.Arn}/invocations
DisconnectRoute:
Type: AWS::ApiGatewayV2::Route
Properties:
ApiId: !Ref FeatureFlagWebSocket
RouteKey: $disconnect
AuthorizationType: NONE
OperationName: DisconnectRoute
Target: !Join
- "/"
- - "integrations"
- !Ref DisconnectIntegration
DisconnectIntegration:
Type: AWS::ApiGatewayV2::Integration
Properties:
ApiId: !Ref FeatureFlagWebSocket
Description: Disconnect Integration
IntegrationType: AWS_PROXY
IntegrationUri:
Fn::Sub:
arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${ConnectionManagerFunction.Arn}/invocations
Deployment:
Type: AWS::ApiGatewayV2::Deployment
DependsOn:
- ConnectRoute
- DisconnectRoute
Properties:
ApiId: !Ref FeatureFlagWebSocket
Stage:
Type: AWS::ApiGatewayV2::Stage
Properties:
StageName: Sandbox
Description: Sandbox Stage
DeploymentId: !Ref Deployment
ApiId: !Ref FeatureFlagWebSocket
ConnectionsTable:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: "connectionId"
AttributeType: "S"
KeySchema:
- AttributeName: "connectionId"
KeyType: "HASH"
ProvisionedThroughput:
ReadCapacityUnits: 5
WriteCapacityUnits: 5
SSESpecification:
SSEEnabled: True
StreamSpecification:
StreamViewType: NEW_IMAGE
TableName: !Ref ConnectionTableName
FeatureToggleTable:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: "featureId"
AttributeType: "S"
KeySchema:
- AttributeName: "featureId"
KeyType: "HASH"
ProvisionedThroughput:
ReadCapacityUnits: 5
WriteCapacityUnits: 5
SSESpecification:
SSEEnabled: True
StreamSpecification:
StreamViewType: NEW_IMAGE
TableName: !Ref FeatureToggleTableName
ConnectionManagerFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: connection-manager/
Handler: lambda-function.handler
MemorySize: 256
Runtime: python3.8
Environment:
Variables:
CONNECTION_TABLE_NAME: !Ref ConnectionTableName
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref ConnectionTableName
- Statement:
- Effect: Allow
Action:
- "execute-api:ManageConnections"
Resource:
- !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${FeatureFlagWebSocket}/*"
ConnectionManagerFunctionPermission:
Type: AWS::Lambda::Permission
DependsOn:
- FeatureFlagWebSocket
Properties:
Action: lambda:InvokeFunction
FunctionName: !Ref ConnectionManagerFunction
Principal: apigateway.amazonaws.com
NewConnectionFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: new-connection/
Handler: lambda-function.handler
MemorySize: 256
Runtime: python3.8
Environment:
Variables:
FEATURE_TOGGLE_TABLE_NAME: !Ref FeatureToggleTableName
Events:
Stream:
Type: DynamoDB
Properties:
Stream: !GetAtt ConnectionsTable.StreamArn
BatchSize: 10
StartingPosition: TRIM_HORIZON
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref FeatureToggleTableName
- Statement:
- Effect: Allow
Action:
- "execute-api:ManageConnections"
Resource:
- !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${FeatureFlagWebSocket}/*"
OnFeatureToggleMessageFunction:
Type: AWS::Serverless::Function
DependsOn:
- FeatureToggleTable
Properties:
CodeUri: feature-toggle-message/
Handler: lambda-function.handler
MemorySize: 256
Runtime: python3.8
Environment:
Variables:
CONNECTION_TABLE_NAME: !Ref ConnectionTableName
Events:
Stream:
Type: DynamoDB
Properties:
Stream: !GetAtt FeatureToggleTable.StreamArn
BatchSize: 10
StartingPosition: TRIM_HORIZON
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref ConnectionTableName
- Statement:
- Effect: Allow
Action:
- "execute-api:ManageConnections"
Resource:
- !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${FeatureFlagWebSocket}/*"
Outputs:
WebSocketURI:
Description: "The endpoint used to connect to the feature toggle service."
Value: !Join [ '', [ 'wss://', !Ref FeatureFlagWebSocket, '.execute-api.', !Ref 'AWS::Region', '.amazonaws.com/', !Ref 'Stage'] ]