Skip to content

Commit 473064e

Browse files
committed
coding is hard
1 parent 88d01f0 commit 473064e

File tree

5 files changed

+58
-192
lines changed

5 files changed

+58
-192
lines changed

Diff for: cloudformation/main.yml

+15
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,17 @@ Resources:
258258
FunctionResponseTypes:
259259
- ReportBatchItemFailures
260260

261+
SQSLambdaEventMappingSales:
262+
Type: AWS::Lambda::EventSourceMapping
263+
DependsOn:
264+
- AppSqsLambdaFunction
265+
Properties:
266+
BatchSize: 5
267+
EventSourceArn: !GetAtt AppSQSQueues.Outputs.SalesEmailQueueArn
268+
FunctionName: !Sub ${ApplicationPrefix}-sqs-lambda
269+
FunctionResponseTypes:
270+
- ReportBatchItemFailures
271+
261272
MembershipRecordsTable:
262273
Type: "AWS::DynamoDB::Table"
263274
DeletionPolicy: "Retain"
@@ -765,3 +776,7 @@ Outputs:
765776
CloudfrontDistributionId:
766777
Description: Cloudfront Distribution ID
767778
Value: !GetAtt AppFrontendCloudfrontDistribution.Id
779+
780+
SalesEmailQueueArn:
781+
Description: Sales Email Queue Arn
782+
Value: !GetAtt AppSQSQueues.Outputs.SalesEmailQueueArn

Diff for: cloudformation/sqs.yml

+17
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,17 @@ Resources:
2424
- "AppDLQ"
2525
- "Arn"
2626
maxReceiveCount: 3
27+
SalesEmailQueue:
28+
Type: AWS::SQS::Queue
29+
Properties:
30+
QueueName: !Sub ${QueueName}-sales
31+
VisibilityTimeout: !Ref MessageTimeout
32+
RedrivePolicy:
33+
deadLetterTargetArn:
34+
Fn::GetAtt:
35+
- "AppDLQ"
36+
- "Arn"
37+
maxReceiveCount: 3
2738

2839
Outputs:
2940
MainQueueArn:
@@ -38,3 +49,9 @@ Outputs:
3849
Fn::GetAtt:
3950
- AppDLQ
4051
- Arn
52+
SalesEmailQueueArn:
53+
Description: Sales Email Queue Arn
54+
Value:
55+
Fn::GetAtt:
56+
- SalesEmailQueue
57+
- Arn

Diff for: src/api/sqs/driver.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs";
22
import { environmentConfig, genericConfig } from "common/config.js";
3-
import { parseSQSPayload } from "common/types/sqsMessage.js";
3+
import {
4+
AvailableSQSFunctions,
5+
parseSQSPayload,
6+
} from "common/types/sqsMessage.js";
47

58
const queueUrl = environmentConfig["dev"].SqsQueueUrl;
69
const sqsClient = new SQSClient({
710
region: genericConfig.AwsRegion,
811
});
912

1013
const payload = parseSQSPayload({
11-
function: "ping",
14+
function: AvailableSQSFunctions.Ping,
1215
payload: {},
1316
metadata: {
1417
reqId: "1",

Diff for: src/api/sqs/index.ts

+12
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,16 @@ const handlers: SQSFunctionPayloadTypes = {
4141
export const runEnvironment = process.env.RunEnvironment as RunEnvironment;
4242
export const currentEnvironmentConfig = environmentConfig[runEnvironment];
4343

44+
const restrictedQueues: Record<string, AvailableSQSFunctions[]> = {
45+
"infra-core-api-sqs-sales": [AvailableSQSFunctions.SendSaleEmail],
46+
};
47+
4448
export const handler = middy()
4549
.use(eventNormalizerMiddleware())
4650
.use(sqsPartialBatchFailure())
4751
.handler((event: SQSEvent, _context: Context, { signal: _signal }) => {
4852
const recordsPromises = event.Records.map(async (record, _index) => {
53+
const sourceQueue = record.eventSourceARN.split(":").slice(-1)[0];
4954
try {
5055
let parsedBody = parseSQSPayload(record.body);
5156
if (parsedBody instanceof ZodError) {
@@ -58,6 +63,13 @@ export const handler = middy()
5863
});
5964
}
6065
parsedBody = parsedBody as AnySQSPayload;
66+
if (
67+
restrictedQueues[sourceQueue]?.includes(parsedBody.function) === false
68+
) {
69+
throw new ValidationError({
70+
message: `Queue ${sourceQueue} is not permitted to call the function ${parsedBody.function}!`,
71+
});
72+
}
6173
const childLogger = logger.child({
6274
sqsMessageId: record.messageId,
6375
metadata: parsedBody.metadata,

0 commit comments

Comments
 (0)