11import { Construct } from "constructs"
22import { Fn , RemovalPolicy } from "aws-cdk-lib"
33import { Architecture , ILayerVersion , LayerVersion } from "aws-cdk-lib/aws-lambda"
4- import { Key } from "aws-cdk-lib/aws-kms"
5- import { Stream } from "aws-cdk-lib/aws-kinesis"
4+ import { IKey , Key } from "aws-cdk-lib/aws-kms"
65import { CfnLogGroup , CfnSubscriptionFilter , LogGroup } from "aws-cdk-lib/aws-logs"
76import {
87 IManagedPolicy ,
8+ IRole ,
99 ManagedPolicy ,
1010 PolicyStatement ,
1111 Role ,
@@ -14,12 +14,20 @@ import {
1414import { NagSuppressions } from "cdk-nag"
1515import { LAMBDA_INSIGHTS_LAYER_ARNS } from "../config"
1616import { addSuppressions } from "../utils/helpers"
17+ import { CfnDeliveryStream } from "aws-cdk-lib/aws-kinesisfirehose"
18+ import { Stream } from "aws-cdk-lib/aws-kinesis"
1719
1820export interface SharedLambdaResourceProps {
1921 readonly functionName : string
2022 readonly logRetentionInDays : number
2123 readonly additionalPolicies : Array < IManagedPolicy >
2224 readonly architecture : Architecture
25+ readonly cloudWatchLogsKmsKey ?: IKey
26+ readonly cloudwatchEncryptionKMSPolicy ?: IManagedPolicy
27+ readonly splunkDeliveryStream ?: CfnDeliveryStream
28+ readonly splunkSubscriptionFilterRole ?: IRole
29+ readonly lambdaInsightsLogGroupPolicy ?: IManagedPolicy
30+ readonly addSplunkSubscriptionFilter ?: boolean
2331}
2432
2533export interface SharedLambdaResources {
@@ -30,28 +38,24 @@ export interface SharedLambdaResources {
3038
3139export const createSharedLambdaResources = (
3240 scope : Construct ,
33- {
41+ props : SharedLambdaResourceProps
42+ ) : SharedLambdaResources => {
43+ const {
3444 functionName,
3545 logRetentionInDays,
3646 additionalPolicies,
37- architecture
38- } : SharedLambdaResourceProps
39- ) : SharedLambdaResources => {
40- const cloudWatchLogsKmsKey = Key . fromKeyArn (
41- scope , "cloudWatchLogsKmsKey" , Fn . importValue ( "account-resources:CloudwatchLogsKmsKeyArn" ) )
42-
43- const cloudwatchEncryptionKMSPolicy = ManagedPolicy . fromManagedPolicyArn (
44- scope , "cloudwatchEncryptionKMSPolicyArn" , Fn . importValue ( "account-resources:CloudwatchEncryptionKMSPolicyArn" ) )
45-
46- const splunkDeliveryStream = Stream . fromStreamArn (
47- scope , "SplunkDeliveryStream" , Fn . importValue ( "lambda-resources:SplunkDeliveryStream" ) )
48-
49- const splunkSubscriptionFilterRole = Role . fromRoleArn (
50- scope , "splunkSubscriptionFilterRole" , Fn . importValue ( "lambda-resources:SplunkSubscriptionFilterRole" ) )
51-
52- const lambdaInsightsLogGroupPolicy = ManagedPolicy . fromManagedPolicyArn (
53- scope , "lambdaInsightsLogGroupPolicy" , Fn . importValue ( "lambda-resources:LambdaInsightsLogGroupPolicy" ) )
54-
47+ architecture,
48+ cloudWatchLogsKmsKey = Key . fromKeyArn (
49+ scope , "cloudWatchLogsKmsKey" , Fn . importValue ( "account-resources:CloudwatchLogsKmsKeyArn" ) ) ,
50+ cloudwatchEncryptionKMSPolicy = ManagedPolicy . fromManagedPolicyArn (
51+ scope , "cloudwatchEncryptionKMSPolicyArn" , Fn . importValue ( "account-resources:CloudwatchEncryptionKMSPolicyArn" ) ) ,
52+ splunkDeliveryStream,
53+ splunkSubscriptionFilterRole = Role . fromRoleArn (
54+ scope , "splunkSubscriptionFilterRole" , Fn . importValue ( "lambda-resources:SplunkSubscriptionFilterRole" ) ) ,
55+ lambdaInsightsLogGroupPolicy = ManagedPolicy . fromManagedPolicyArn (
56+ scope , "lambdaInsightsLogGroupPolicy" , Fn . importValue ( "lambda-resources:LambdaInsightsLogGroupPolicy" ) ) ,
57+ addSplunkSubscriptionFilter = true
58+ } = props
5559 const insightsLambdaLayerArn = architecture === Architecture . ARM_64
5660 ? LAMBDA_INSIGHTS_LAYER_ARNS . arm64
5761 : LAMBDA_INSIGHTS_LAYER_ARNS . x64
@@ -68,12 +72,27 @@ export const createSharedLambdaResources = (
6872 const cfnlogGroup = logGroup . node . defaultChild as CfnLogGroup
6973 addSuppressions ( [ cfnlogGroup ] , [ "CW_LOGGROUP_RETENTION_PERIOD_CHECK" ] )
7074
71- new CfnSubscriptionFilter ( scope , "LambdaLogsSplunkSubscriptionFilter" , {
72- destinationArn : splunkDeliveryStream . streamArn ,
73- filterPattern : "" ,
74- logGroupName : logGroup . logGroupName ,
75- roleArn : splunkSubscriptionFilterRole . roleArn
76- } )
75+ if ( addSplunkSubscriptionFilter ) {
76+ // This is in an if statement to ensure correct value is used
77+ // importing and coercing to cfnDeliveryStream causes issues
78+ if ( splunkDeliveryStream ) {
79+ new CfnSubscriptionFilter ( scope , "LambdaLogsSplunkSubscriptionFilter" , {
80+ destinationArn : splunkDeliveryStream . attrArn ,
81+ filterPattern : "" ,
82+ logGroupName : logGroup . logGroupName ,
83+ roleArn : splunkSubscriptionFilterRole . roleArn
84+ } )
85+ } else {
86+ const splunkDeliveryStreamImport = Stream . fromStreamArn (
87+ scope , "SplunkDeliveryStream" , Fn . importValue ( "lambda-resources:SplunkDeliveryStream" ) )
88+ new CfnSubscriptionFilter ( scope , "LambdaLogsSplunkSubscriptionFilter" , {
89+ destinationArn : splunkDeliveryStreamImport . streamArn ,
90+ filterPattern : "" ,
91+ logGroupName : logGroup . logGroupName ,
92+ roleArn : splunkSubscriptionFilterRole . roleArn
93+ } )
94+ }
95+ }
7796
7897 const putLogsManagedPolicy = new ManagedPolicy ( scope , "LambdaPutLogsManagedPolicy" , {
7998 description : `write to ${ functionName } logs` ,
0 commit comments