-
Notifications
You must be signed in to change notification settings - Fork 33
/
Copy pathcreate-targets.ts
118 lines (100 loc) · 2.92 KB
/
create-targets.ts
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
import {
EventBridgeClient,
EventBus,
Rule,
Target,
} from '@aws-sdk/client-eventbridge';
import { CloudFormationResources } from 'serverless/aws';
import {
ServerlessResourceTypes,
filterResources,
} from '../../../utils/serverless';
import { Config } from '../../../config/interfaces/config-interface';
import {
RoleResourceTarget,
createRuleTargets,
listRuleTargets,
} from '../utils';
import { snsTargetHandler } from './target-handlers/sns-target-handler';
export interface CreateTargetsParams {
resources: CloudFormationResources;
config: Config;
eventBridgeClient: EventBridgeClient;
rule: Rule;
bus: EventBus;
logDebug: (message: string) => void;
}
export async function createTargets({
resources,
config,
eventBridgeClient,
rule,
bus,
logDebug,
}: CreateTargetsParams) {
const eventBridgeMaxTargets = 5;
const eventRulesResources = filterResources(
resources,
ServerlessResourceTypes.EVENTS_RULE
);
const existingTargetsForRule = await listRuleTargets({
client: eventBridgeClient,
ruleName: rule.Name as string,
eventBusName: rule.EventBusName,
});
const definedRuleTargets: Array<RoleResourceTarget> =
(eventRulesResources.find(
(ruleResource) =>
rule.Name === ruleResource.resourceDefinition.Properties['Name']
)?.resourceDefinition.Properties['Targets'] as Array<RoleResourceTarget>) ||
[];
const notExistingTargets = definedRuleTargets.reduce<Set<RoleResourceTarget>>(
(accumulator, targetResource) => {
const targetId = targetResource.Id;
const doesNotExist = !existingTargetsForRule.some(
(existingTarget) => existingTarget.Id === targetId
);
if (doesNotExist) {
accumulator.add(targetResource);
}
return accumulator;
},
new Set()
);
logDebug(`Not existing targets: ${JSON.stringify([...notExistingTargets])}`);
if (
notExistingTargets.size > 0 &&
existingTargetsForRule.length >= eventBridgeMaxTargets
) {
throw new Error(
`Max targets for rule: ${bus.Name} reached. Can not create new targets. Max targets: ${eventBridgeMaxTargets}`
);
}
const ruleTargets = [...notExistingTargets].map((resourceTarget) => {
let Arn: string;
const targetResource = resources[resourceTarget.Arn.Ref];
switch (targetResource.Type) {
case ServerlessResourceTypes.SNS_TOPIC: {
Arn = snsTargetHandler({
targetResource,
awsConfig: config?.awsConfig,
}).arn;
break;
}
default: {
throw new Error(
`Resource type ${targetResource.Type} not implemented.`
);
}
}
const result: Target = { Id: resourceTarget.Id, Arn };
return result;
});
await createRuleTargets({
client: eventBridgeClient,
ruleName: rule.Name as string,
eventBusName: rule.EventBusName,
targets: ruleTargets,
});
return { ruleName: rule.Name, createdTargets: ruleTargets };
}