@@ -63,12 +63,19 @@ export interface TrailProps {
63
63
readonly sendToCloudWatchLogs ?: boolean ;
64
64
65
65
/**
66
- * How long to retain logs in CloudWatchLogs. Ignored if sendToCloudWatchLogs is false
66
+ * How long to retain logs in CloudWatchLogs.
67
+ * Ignored if sendToCloudWatchLogs is false or if cloudWatchLogGroup is set.
67
68
*
68
- * @default logs.RetentionDays.OneYear
69
+ * @default logs.RetentionDays.ONE_YEAR
69
70
*/
70
71
readonly cloudWatchLogsRetention ?: logs . RetentionDays ;
71
72
73
+ /**
74
+ * Log Group to which CloudTrail to push logs to. Ignored if sendToCloudWatchLogs is set to false.
75
+ * @default - a new log group is created and used.
76
+ */
77
+ readonly cloudWatchLogGroup ?: logs . ILogGroup ;
78
+
72
79
/** The AWS Key Management Service (AWS KMS) key ID that you want to use to encrypt CloudTrail logs.
73
80
*
74
81
* @default - No encryption.
@@ -171,6 +178,12 @@ export class Trail extends Resource {
171
178
*/
172
179
public readonly trailSnsTopicArn : string ;
173
180
181
+ /**
182
+ * The CloudWatch log group to which CloudTrail events are sent.
183
+ * `undefined` if `sendToCloudWatchLogs` property is false.
184
+ */
185
+ public readonly logGroup ?: logs . ILogGroup ;
186
+
174
187
private s3bucket : s3 . IBucket ;
175
188
private eventSelectors : EventSelector [ ] = [ ] ;
176
189
@@ -200,19 +213,22 @@ export class Trail extends Resource {
200
213
} ,
201
214
} ) ) ;
202
215
203
- let logGroup : logs . CfnLogGroup | undefined ;
204
216
let logsRole : iam . IRole | undefined ;
205
217
206
218
if ( props . sendToCloudWatchLogs ) {
207
- logGroup = new logs . CfnLogGroup ( this , 'LogGroup' , {
208
- retentionInDays : props . cloudWatchLogsRetention || logs . RetentionDays . ONE_YEAR ,
209
- } ) ;
219
+ if ( props . cloudWatchLogGroup ) {
220
+ this . logGroup = props . cloudWatchLogGroup ;
221
+ } else {
222
+ this . logGroup = new logs . LogGroup ( this , 'LogGroup' , {
223
+ retention : props . cloudWatchLogsRetention ?? logs . RetentionDays . ONE_YEAR ,
224
+ } ) ;
225
+ }
210
226
211
227
logsRole = new iam . Role ( this , 'LogsRole' , { assumedBy : cloudTrailPrincipal } ) ;
212
228
213
229
logsRole . addToPolicy ( new iam . PolicyStatement ( {
214
230
actions : [ 'logs:PutLogEvents' , 'logs:CreateLogStream' ] ,
215
- resources : [ logGroup . attrArn ] ,
231
+ resources : [ this . logGroup . logGroupArn ] ,
216
232
} ) ) ;
217
233
}
218
234
@@ -234,8 +250,8 @@ export class Trail extends Resource {
234
250
kmsKeyId : props . kmsKey && props . kmsKey . keyArn ,
235
251
s3BucketName : this . s3bucket . bucketName ,
236
252
s3KeyPrefix : props . s3KeyPrefix ,
237
- cloudWatchLogsLogGroupArn : logGroup && logGroup . attrArn ,
238
- cloudWatchLogsRoleArn : logsRole && logsRole . roleArn ,
253
+ cloudWatchLogsLogGroupArn : this . logGroup ?. logGroupArn ,
254
+ cloudWatchLogsRoleArn : logsRole ? .roleArn ,
239
255
snsTopicName : props . snsTopic ,
240
256
eventSelectors : this . eventSelectors ,
241
257
} ) ;
0 commit comments