-
Notifications
You must be signed in to change notification settings - Fork 15
/
index.ts
70 lines (56 loc) · 2.14 KB
/
index.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
import _ from 'lodash'
import pino from 'pino'
import { addAlarms, addDashboard, getResourcesByType } from '../core/index'
import { setLogger } from 'slic-watch-core/logging'
import { type SlicWatchConfig, resolveSlicWatchConfig } from 'slic-watch-core/inputs/general-config'
import { type Template } from 'cloudform-types'
const logger = pino({ name: 'macroHandler', level: process.env.DEBUG_LEVEL ?? 'debug' })
setLogger(logger)
interface Event {
requestId: string
fragment: Template
}
interface MacroResponse {
requestId: string
status: string
errorMessage?: string
fragment?: Template
}
/**
* CloudFormation Macro implementation. Accepts the CloudFormation fragment to be transformed
* and generates the transformed teamplte with alarms and dashboard
*/
export async function handler (event: Event): Promise<MacroResponse> {
let status = 'success'
let errorMessage: string | undefined
logger.debug({ event })
const transformedTemplate = event.fragment
let outputFragment: Template | undefined
try {
const slicWatchConfig: SlicWatchConfig = transformedTemplate.Metadata?.slicWatch ?? {}
const config = resolveSlicWatchConfig(slicWatchConfig)
const functionAlarmConfigs = {}
const functionDashboardConfigs = {}
const lambdaResources = getResourcesByType('AWS::Lambda::Function', transformedTemplate)
for (const [funcResourceName, funcResource] of Object.entries(lambdaResources)) {
const funcConfig = funcResource.Metadata?.slicWatch ?? {}
functionAlarmConfigs[funcResourceName] = funcConfig.alarms ?? {}
functionDashboardConfigs[funcResourceName] = funcConfig.dashboard
}
_.merge(transformedTemplate)
addAlarms(config.alarms, functionAlarmConfigs, config.alarmActionsConfig, transformedTemplate)
addDashboard(config.dashboard, functionDashboardConfigs, transformedTemplate)
outputFragment = transformedTemplate
} catch (err) {
logger.error(err)
errorMessage = (err as Error).message
status = 'fail'
}
logger.debug({ outputFragment: transformedTemplate })
return {
status,
errorMessage,
requestId: event.requestId,
fragment: outputFragment
}
}