-
Notifications
You must be signed in to change notification settings - Fork 2
/
template.yaml
129 lines (119 loc) · 3.51 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
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Sample SAM Template for service_a
Parameters:
ServiceAMaxRetries:
Type: Number
Default: "2"
Description: Maximum retries for the Service A
Globals:
Function:
Timeout: 5
Resources:
ServiceAFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./service_a/
Handler: app.lambda_handler
Runtime: python3.8
DeadLetterQueue:
TargetArn: !GetAtt ServiceADLQ.Arn
Type: SQS
Policies:
- CloudWatchLogsFullAccess
- DynamoDBReadPolicy:
TableName: !Ref CircuitBreakerStatusDynamoDBTable
- SQSPollerPolicy:
QueueName:
!GetAtt ServiceARetrySQS.QueueName
- SQSSendMessagePolicy:
QueueName:
!GetAtt ServiceADLQ.QueueName
Events:
SQSEvent:
Type: SQS
Properties:
Queue: !GetAtt ServiceARetrySQS.Arn
BatchSize: 1
Enabled: true
EventInvokeConfig:
Type: AWS::Lambda::EventInvokeConfig
Properties:
FunctionName: !Ref ServiceAFunction
Qualifier: "$LATEST"
MaximumRetryAttempts: 0
ServiceADLQ:
Type: AWS::SQS::Queue
ServiceARetrySQS:
Type: AWS::SQS::Queue
Properties:
RedrivePolicy:
deadLetterTargetArn: !GetAtt ServiceADLQ.Arn
maxReceiveCount: 1
ServiceADLQHandlerFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./dlq_handler/
Handler: app.lambda_handler
Runtime: python3.8
Environment:
Variables:
RETRY_QUEUE_URL: !Ref ServiceARetrySQS
MAX_RETRIES: !Ref ServiceAMaxRetries
Layers:
- !Ref ServiceADLQHandlerLayer
Policies:
- CloudWatchLogsFullAccess
- DynamoDBWritePolicy:
TableName: !Ref CircuitBreakerStatusDynamoDBTable
- SQSSendMessagePolicy:
QueueName:
!GetAtt ServiceARetrySQS.QueueName
- SQSPollerPolicy:
QueueName:
!GetAtt ServiceADLQ.QueueName
Events:
SQSEvent:
Type: SQS
Properties:
Queue: !GetAtt ServiceADLQ.Arn
BatchSize: 1
Enabled: true
ServiceADLQHandlerLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: dlq-helper-layer
Description: DLQ Helper Layer
ContentUri: './dlq_helper/'
CompatibleRuntimes:
- python3.8
RetentionPolicy: Delete
CircuitBreakerStatusDynamoDBTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: CircuitBreakerStatus
KeySchema:
- AttributeName: ServiceName
KeyType: HASH
AttributeDefinitions:
- AttributeName: ServiceName
AttributeType: S
BillingMode: PAY_PER_REQUEST
TimeToLiveSpecification:
AttributeName: ExpireTimeStamp
Enabled: true
UpdateReplacePolicy: Delete
DeletionPolicy: Delete
Outputs:
ServiceAFunction:
Description: "Service A Lambda Function ARN"
Value: !GetAtt ServiceAFunction.Arn
ServiceADLQHandlerFunction:
Description: "Service A DLQ Handler Lambda Function ARN"
Value: !GetAtt ServiceADLQHandlerFunction.Arn
ServiceAFunctionIamRole:
Description: "Implicit IAM Role created for Service A function"
Value: !GetAtt ServiceAFunctionRole.Arn
CircuitBreakerStatusDynamoDBTable:
Description: "DynamoDB Circuit Breaker Table"
Value: !GetAtt CircuitBreakerStatusDynamoDBTable.Arn