in internal/resources/providers/aws_cis/monitoring/monitoring.go [78:134]
func (p *Provider) AggregateResources(ctx context.Context) (*Resource, error) {
trails, err := p.Cloudtrail.DescribeTrails(ctx)
if err != nil {
return nil, err
}
items := make([]MonitoringItem, 0, len(trails))
for _, info := range trails {
if info.Trail.CloudWatchLogsLogGroupArn == nil {
items = append(items, MonitoringItem{
TrailInfo: info,
MetricFilters: []MetricFilter{},
MetricTopicBinding: map[string][]string{},
})
continue
}
logGroup := getLogGroupFromARN(info.Trail.CloudWatchLogsLogGroupArn)
if logGroup == "" {
p.Log.Warnf("cloudwatchlogs log group arn has no log group name %s", *info.Trail.CloudWatchLogsLogGroupArn)
continue
}
metrics, err := p.Cloudwatchlogs.DescribeMetricFilters(ctx, info.Trail.HomeRegion, logGroup)
if err != nil {
p.Log.Errorf("failed to describe metric filters for cloudwatchlog log group arn %s: %v", *info.Trail.CloudWatchLogsLogGroupArn, err)
continue
}
parsedMetrics := p.parserMetrics(metrics)
names := filterNamesFromMetrics(metrics)
if len(names) == 0 {
items = append(items, MonitoringItem{
TrailInfo: info,
MetricFilters: parsedMetrics,
MetricTopicBinding: map[string][]string{},
})
continue
}
bindings := map[string][]string{}
for _, name := range names {
alarms, err := p.Cloudwatch.DescribeAlarms(ctx, info.Trail.HomeRegion, []string{name})
if err != nil {
p.Log.Errorf("failed to describe alarms for cloudwatch filter %v: %v", names, err)
continue
}
topics := p.getSubscriptionForAlarms(ctx, info.Trail.HomeRegion, alarms)
bindings[name] = topics
}
items = append(items, MonitoringItem{
TrailInfo: info,
MetricFilters: parsedMetrics,
MetricTopicBinding: bindings,
})
}
return &Resource{Items: items}, nil
}