cdk-nuxt 2.0.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -19
- package/index.d.ts +2 -1
- package/index.js +3 -3
- package/lib/cli/deploy-server.js +33 -5
- package/lib/cli/destroy-server.js +13 -0
- package/lib/functions/access-logs-analysis/group-by-date/.gitignore +2 -0
- package/lib/functions/access-logs-analysis/group-by-date/build/app/index.d.ts +2 -0
- package/lib/functions/access-logs-analysis/group-by-date/build/app/index.js +57 -0
- package/lib/functions/access-logs-analysis/group-by-date/build/app/index.js.map +1 -0
- package/lib/functions/access-logs-analysis/group-by-date/index.d.ts +2 -0
- package/lib/functions/access-logs-analysis/group-by-date/index.js +57 -0
- package/lib/functions/access-logs-analysis/group-by-date/index.ts +64 -0
- package/lib/functions/access-logs-analysis/group-by-date/package.json +20 -0
- package/lib/functions/access-logs-analysis/group-by-date/tsconfig.json +33 -0
- package/lib/functions/access-logs-analysis/group-by-date/yarn.lock +1203 -0
- package/lib/functions/access-logs-analysis/partitioning/.gitignore +2 -0
- package/lib/functions/access-logs-analysis/partitioning/build/app/create-partition.d.ts +1 -0
- package/lib/functions/access-logs-analysis/partitioning/build/app/create-partition.js +57 -0
- package/lib/functions/access-logs-analysis/partitioning/build/app/create-partition.js.map +1 -0
- package/lib/functions/access-logs-analysis/partitioning/build/app/transform-partition.d.ts +2 -0
- package/lib/functions/access-logs-analysis/partitioning/build/app/transform-partition.js +72 -0
- package/lib/functions/access-logs-analysis/partitioning/build/app/transform-partition.js.map +1 -0
- package/lib/functions/access-logs-analysis/partitioning/build/app/types.d.ts +7 -0
- package/lib/functions/access-logs-analysis/partitioning/build/app/types.js +3 -0
- package/lib/functions/access-logs-analysis/partitioning/build/app/types.js.map +1 -0
- package/lib/functions/access-logs-analysis/partitioning/build/app/util.d.ts +9 -0
- package/lib/functions/access-logs-analysis/partitioning/build/app/util.js +44 -0
- package/lib/functions/access-logs-analysis/partitioning/build/app/util.js.map +1 -0
- package/lib/functions/access-logs-analysis/partitioning/create-partition.d.ts +1 -0
- package/lib/functions/access-logs-analysis/partitioning/create-partition.js +57 -0
- package/lib/functions/access-logs-analysis/partitioning/create-partition.ts +58 -0
- package/lib/functions/access-logs-analysis/partitioning/package.json +20 -0
- package/lib/functions/access-logs-analysis/partitioning/transform-partition.d.ts +2 -0
- package/lib/functions/access-logs-analysis/partitioning/transform-partition.js +72 -0
- package/lib/functions/access-logs-analysis/partitioning/transform-partition.ts +83 -0
- package/lib/functions/access-logs-analysis/partitioning/tsconfig.json +33 -0
- package/lib/functions/access-logs-analysis/partitioning/types.d.ts +7 -0
- package/lib/functions/access-logs-analysis/partitioning/types.js +3 -0
- package/lib/functions/access-logs-analysis/partitioning/types.ts +8 -0
- package/lib/functions/access-logs-analysis/partitioning/util.d.ts +9 -0
- package/lib/functions/access-logs-analysis/partitioning/util.js +44 -0
- package/lib/functions/access-logs-analysis/partitioning/util.ts +52 -0
- package/lib/functions/access-logs-analysis/partitioning/yarn.lock +951 -0
- package/lib/stack/NuxtAppStackProps.js +3 -0
- package/lib/stack/{nuxt-app-static-assets.d.ts → NuxtAppStaticAssets.d.ts} +9 -4
- package/lib/stack/NuxtAppStaticAssets.js +71 -0
- package/lib/stack/{nuxt-app-static-assets.ts → NuxtAppStaticAssets.ts} +30 -23
- package/lib/stack/access-logs-analysis/AccessLogsAnalysis.d.ts +66 -0
- package/lib/stack/access-logs-analysis/AccessLogsAnalysis.js +271 -0
- package/lib/stack/access-logs-analysis/AccessLogsAnalysis.ts +331 -0
- package/lib/stack/access-logs-analysis/AccessLogsAnalysisProps.d.ts +21 -0
- package/lib/stack/access-logs-analysis/AccessLogsAnalysisProps.js +3 -0
- package/lib/stack/access-logs-analysis/AccessLogsAnalysisProps.ts +26 -0
- package/lib/stack/access-logs-analysis/AccessLogsParquetTable.d.ts +9 -0
- package/lib/stack/access-logs-analysis/AccessLogsParquetTable.js +25 -0
- package/lib/stack/access-logs-analysis/AccessLogsParquetTable.ts +23 -0
- package/lib/stack/access-logs-analysis/AccessLogsTableConfig.d.ts +8 -0
- package/lib/stack/access-logs-analysis/AccessLogsTableConfig.js +167 -0
- package/lib/stack/access-logs-analysis/AccessLogsTableConfig.ts +164 -0
- package/lib/stack/access-logs-analysis/AccessLogsTableProps.d.ts +7 -0
- package/lib/stack/access-logs-analysis/AccessLogsTableProps.js +3 -0
- package/lib/stack/access-logs-analysis/AccessLogsTableProps.ts +8 -0
- package/lib/stack/access-logs-analysis/CloudFrontAccessLogsAnalysis.d.ts +36 -0
- package/lib/stack/access-logs-analysis/CloudFrontAccessLogsAnalysis.js +60 -0
- package/lib/stack/access-logs-analysis/CloudFrontAccessLogsAnalysis.ts +73 -0
- package/lib/stack/access-logs-analysis/CloudFrontAccessLogsByDateTable.d.ts +9 -0
- package/lib/stack/access-logs-analysis/CloudFrontAccessLogsByDateTable.js +37 -0
- package/lib/stack/access-logs-analysis/CloudFrontAccessLogsByDateTable.ts +44 -0
- package/lib/stack/server/{nuxt-server-app-stack.d.ts → NuxtServerAppStack.d.ts} +32 -82
- package/lib/stack/server/NuxtServerAppStack.js +506 -0
- package/lib/stack/server/{nuxt-server-app-stack.ts → NuxtServerAppStack.ts} +105 -106
- package/lib/stack/server/NuxtServerAppStackProps.d.ts +85 -0
- package/lib/stack/server/NuxtServerAppStackProps.js +3 -0
- package/lib/stack/server/NuxtServerAppStackProps.ts +100 -0
- package/lib/templates/stack-index-server.ts +108 -15
- package/package.json +3 -1
- package/lib/stack/nuxt-app-stack-props.js +0 -3
- package/lib/stack/nuxt-app-static-assets.js +0 -72
- package/lib/stack/server/nuxt-server-app-stack.js +0 -447
- /package/lib/stack/{nuxt-app-stack-props.d.ts → NuxtAppStackProps.d.ts} +0 -0
- /package/lib/stack/{nuxt-app-stack-props.ts → NuxtAppStackProps.ts} +0 -0
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import {Bucket, EventType, NotificationKeyFilter} from 'aws-cdk-lib/aws-s3';
|
|
2
|
+
import {Construct} from 'constructs';
|
|
3
|
+
import {CfnWorkGroup} from 'aws-cdk-lib/aws-athena';
|
|
4
|
+
import {CloudFrontAccessLogsByDateTable} from './CloudFrontAccessLogsByDateTable';
|
|
5
|
+
import {AccessLogsParquetTable} from './AccessLogsParquetTable';
|
|
6
|
+
import {Architecture, Code, Function, LayerVersion, Runtime} from 'aws-cdk-lib/aws-lambda';
|
|
7
|
+
import {Rule, RuleTargetInput, Schedule} from 'aws-cdk-lib/aws-events';
|
|
8
|
+
import {CfnTag, Duration, RemovalPolicy, Stack} from 'aws-cdk-lib';
|
|
9
|
+
import {Column, Database} from '@aws-cdk/aws-glue-alpha';
|
|
10
|
+
import {S3EventSource} from 'aws-cdk-lib/aws-lambda-event-sources';
|
|
11
|
+
import {RetentionDays} from 'aws-cdk-lib/aws-logs';
|
|
12
|
+
import {Effect, PolicyStatement} from 'aws-cdk-lib/aws-iam';
|
|
13
|
+
import {LambdaFunction} from 'aws-cdk-lib/aws-events-targets';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
import {AccessLogsAnalysisProps} from "./AccessLogsAnalysisProps";
|
|
16
|
+
import {ColumnTransformationRules} from "../../functions/access-logs-analysis/partitioning/types";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Provides the AWS resources to analyze access logs. This construct is derived from the official AWS sample
|
|
20
|
+
* CloudFormation stack:
|
|
21
|
+
* {@link https://github.com/aws-samples/amazon-cloudfront-access-logs-queries/blob/mainline/template.yaml}
|
|
22
|
+
*/
|
|
23
|
+
export abstract class AccessLogsAnalysis extends Construct {
|
|
24
|
+
|
|
25
|
+
protected static readonly ACCESS_LOGS_FOLDER_UNPROCESSED = 'unprocessed';
|
|
26
|
+
protected static readonly ACCESS_LOGS_FOLDER_GROUPED_BY_DATE = 'by-date';
|
|
27
|
+
protected static readonly ACCESS_LOGS_FOLDER_TRANSFORMED = 'transformed';
|
|
28
|
+
protected static readonly ACCESS_LOGS_FOLDER_ATHENA_RESULTS = 'athena-query-results';
|
|
29
|
+
|
|
30
|
+
protected readonly resourceIdPrefix: string;
|
|
31
|
+
protected readonly bucket: Bucket;
|
|
32
|
+
protected readonly workgroup: CfnWorkGroup;
|
|
33
|
+
protected readonly database: Database;
|
|
34
|
+
protected readonly accessLogsByDateTable: CloudFrontAccessLogsByDateTable;
|
|
35
|
+
protected readonly accessLogsParquetTable: AccessLogsParquetTable;
|
|
36
|
+
protected readonly groupByDateLayer: LayerVersion;
|
|
37
|
+
protected readonly groupByDateLambda: Function;
|
|
38
|
+
protected readonly partitioningLayer: LayerVersion;
|
|
39
|
+
protected readonly createPartitionLambda: Function;
|
|
40
|
+
protected readonly transformPartitionLambda: Function;
|
|
41
|
+
protected readonly createPartitionsScheduler: Rule;
|
|
42
|
+
protected readonly transformPartitionsScheduler: Rule;
|
|
43
|
+
|
|
44
|
+
protected constructor(scope: Construct, id: string, props: AccessLogsAnalysisProps) {
|
|
45
|
+
super(scope, id);
|
|
46
|
+
this.resourceIdPrefix = props.resourcePrefix;
|
|
47
|
+
this.bucket = props.bucket;
|
|
48
|
+
this.setupLifecycleRules(props);
|
|
49
|
+
this.workgroup = this.createWorkgroup();
|
|
50
|
+
this.database = this.createGlueDatabase();
|
|
51
|
+
this.accessLogsByDateTable = this.createAccessLogsByDateTable();
|
|
52
|
+
this.accessLogsParquetTable = this.createAccessLogsParquetTable();
|
|
53
|
+
this.groupByDateLayer = this.createGroupByDateLayer();
|
|
54
|
+
this.groupByDateLambda = this.createGroupByDateLambda();
|
|
55
|
+
this.partitioningLayer = this.createPartitioningLayer();
|
|
56
|
+
this.createPartitionLambda = this.createCreatePartitionLambda();
|
|
57
|
+
this.transformPartitionLambda = this.createTransformPartitionLambda();
|
|
58
|
+
this.createPartitionsScheduler = this.createCreatePartitionsScheduler();
|
|
59
|
+
this.transformPartitionsScheduler = this.createTransformPartitionsScheduler(props);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
private setupLifecycleRules(props: AccessLogsAnalysisProps): void {
|
|
63
|
+
// cleanup raw and partitioned access logs after a configurable time range
|
|
64
|
+
|
|
65
|
+
this.bucket.addLifecycleRule({
|
|
66
|
+
id: `${this.resourceIdPrefix}-cleanup-unprocessed`,
|
|
67
|
+
prefix: `${AccessLogsAnalysis.ACCESS_LOGS_FOLDER_UNPROCESSED}/*`,
|
|
68
|
+
expiration: props.expireRawLogsAfter ?? Duration.days(7),
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
this.bucket.addLifecycleRule({
|
|
72
|
+
id: `${this.resourceIdPrefix}-cleanup-grouped`,
|
|
73
|
+
prefix: `${AccessLogsAnalysis.ACCESS_LOGS_FOLDER_GROUPED_BY_DATE}/*`,
|
|
74
|
+
expiration: props.expireIntermediateLogsAfter ?? Duration.days(7),
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
this.bucket.addLifecycleRule({
|
|
78
|
+
id: `${this.resourceIdPrefix}-cleanup-transformed`,
|
|
79
|
+
prefix: `${AccessLogsAnalysis.ACCESS_LOGS_FOLDER_TRANSFORMED}/*`,
|
|
80
|
+
expiration: props.expireTransformedLogsAfter ?? Duration.days(180),
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
/* CHECKME: delete query results after 1 week
|
|
84
|
+
this.bucket.addLifecycleRule({
|
|
85
|
+
id: `${this.resourceIdPrefix}-cleanup-query-results`,
|
|
86
|
+
prefix: `${AccessLogsAnalysis.ACCESS_LOGS_FOLDER_ATHENA_RESULTS}/*`,
|
|
87
|
+
expiration: Duration.days(7),
|
|
88
|
+
});
|
|
89
|
+
*/
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private createWorkgroup(): CfnWorkGroup {
|
|
93
|
+
const workgroupName = `${this.resourceIdPrefix}-workgroup`;
|
|
94
|
+
|
|
95
|
+
// due to a current bug, the tags are not automatically assigned to the workgroup
|
|
96
|
+
// note, that the keys must be converted to lower case
|
|
97
|
+
const tags: CfnTag[] = Stack.of(this)
|
|
98
|
+
.tags.renderTags()
|
|
99
|
+
.map((tag: { Key: string; Value: string }) => ({key: tag.Key, value: tag.Value}));
|
|
100
|
+
|
|
101
|
+
return new CfnWorkGroup(this, workgroupName, {
|
|
102
|
+
name: workgroupName,
|
|
103
|
+
recursiveDeleteOption: true,
|
|
104
|
+
workGroupConfiguration: {
|
|
105
|
+
publishCloudWatchMetricsEnabled: false,
|
|
106
|
+
resultConfiguration: {
|
|
107
|
+
outputLocation: `s3://${this.bucket.bucketName}/${AccessLogsAnalysis.ACCESS_LOGS_FOLDER_ATHENA_RESULTS}`,
|
|
108
|
+
},
|
|
109
|
+
enforceWorkGroupConfiguration: true
|
|
110
|
+
},
|
|
111
|
+
tags,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private createGlueDatabase(): Database {
|
|
116
|
+
const databaseName = `${this.resourceIdPrefix}-database`;
|
|
117
|
+
return new Database(this, databaseName, {
|
|
118
|
+
// Athena doesn't support dashes in database/table names
|
|
119
|
+
databaseName: databaseName.replace(/-/g, '_'),
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
protected abstract createAccessLogsByDateTable(): CloudFrontAccessLogsByDateTable;
|
|
124
|
+
|
|
125
|
+
protected abstract createAccessLogsParquetTable(): CloudFrontAccessLogsByDateTable;
|
|
126
|
+
|
|
127
|
+
private createGroupByDateLayer(): LayerVersion {
|
|
128
|
+
const layerVersionName = `${this.resourceIdPrefix}-group-by-date-dependencies`;
|
|
129
|
+
return new LayerVersion(this, layerVersionName, {
|
|
130
|
+
layerVersionName,
|
|
131
|
+
compatibleArchitectures: [Architecture.ARM_64, Architecture.X86_64],
|
|
132
|
+
compatibleRuntimes: [Runtime.NODEJS_14_X, Runtime.NODEJS_16_X],
|
|
133
|
+
code: Code.fromAsset(path.join(__dirname, '../../functions/access-logs-analysis/group-by-date/build/layer')),
|
|
134
|
+
removalPolicy: RemovalPolicy.DESTROY,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
private createPartitioningLayer(): LayerVersion {
|
|
139
|
+
const layerVersionName = `${this.resourceIdPrefix}-partitioning-dependencies`;
|
|
140
|
+
return new LayerVersion(this, layerVersionName, {
|
|
141
|
+
layerVersionName,
|
|
142
|
+
compatibleArchitectures: [Architecture.ARM_64, Architecture.X86_64],
|
|
143
|
+
compatibleRuntimes: [Runtime.NODEJS_14_X, Runtime.NODEJS_16_X],
|
|
144
|
+
code: Code.fromAsset(path.join(__dirname, '../../functions/access-logs-analysis/partitioning/build/layer')),
|
|
145
|
+
removalPolicy: RemovalPolicy.DESTROY,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* A Lambda function to be triggered whenever a new access log is created.
|
|
151
|
+
* It moves the raw access logs into a sub folder hierarchy by year, month, day and hour.
|
|
152
|
+
*/
|
|
153
|
+
private createGroupByDateLambda(): Function {
|
|
154
|
+
const functionName = `${this.resourceIdPrefix}-group-by-date`;
|
|
155
|
+
|
|
156
|
+
const lambda = new Function(this, functionName, {
|
|
157
|
+
functionName,
|
|
158
|
+
architecture: Architecture.ARM_64,
|
|
159
|
+
runtime: Runtime.NODEJS_16_X,
|
|
160
|
+
code: Code.fromAsset(path.join(__dirname, '../../functions/access-logs-analysis/group-by-date/build/app')),
|
|
161
|
+
memorySize: 512,
|
|
162
|
+
timeout: Duration.seconds(20),
|
|
163
|
+
handler: 'index.handler',
|
|
164
|
+
layers: [this.groupByDateLayer],
|
|
165
|
+
events: [
|
|
166
|
+
new S3EventSource(this.bucket, {
|
|
167
|
+
events: [EventType.OBJECT_CREATED],
|
|
168
|
+
filters: [this.getUnprocessedObjectsFilter()],
|
|
169
|
+
}),
|
|
170
|
+
],
|
|
171
|
+
logRetention: RetentionDays.TWO_WEEKS,
|
|
172
|
+
environment: {
|
|
173
|
+
AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
|
|
174
|
+
NODE_OPTIONS: '--enable-source-maps',
|
|
175
|
+
TARGET_FOLDER: AccessLogsAnalysis.ACCESS_LOGS_FOLDER_GROUPED_BY_DATE,
|
|
176
|
+
RAW_ACCESS_LOG_FILE_PATTERN: this.getRawAccessLogFilePattern().source,
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
this.bucket.grantReadWrite(lambda);
|
|
181
|
+
this.bucket.grantDelete(lambda, `${AccessLogsAnalysis.ACCESS_LOGS_FOLDER_UNPROCESSED}/*`);
|
|
182
|
+
|
|
183
|
+
return lambda;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
protected abstract getUnprocessedObjectsFilter(): NotificationKeyFilter;
|
|
187
|
+
|
|
188
|
+
/** The pattern to identify unprocessed access logs depends on the producing source */
|
|
189
|
+
protected abstract getRawAccessLogFilePattern(): RegExp;
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Creates a new partition for the upcoming hour in the access log database.
|
|
193
|
+
*/
|
|
194
|
+
private createCreatePartitionLambda(): Function {
|
|
195
|
+
const functionName = `${this.resourceIdPrefix}-create-part`;
|
|
196
|
+
|
|
197
|
+
const lambda = new Function(this, functionName, {
|
|
198
|
+
functionName,
|
|
199
|
+
architecture: Architecture.ARM_64,
|
|
200
|
+
runtime: Runtime.NODEJS_16_X,
|
|
201
|
+
code: Code.fromAsset(path.join(__dirname, '../../functions/access-logs-analysis/partitioning/build/app'), {
|
|
202
|
+
exclude: ['transform-partition*', '*.d.ts'],
|
|
203
|
+
}),
|
|
204
|
+
memorySize: 128,
|
|
205
|
+
timeout: Duration.seconds(20),
|
|
206
|
+
handler: 'create-partition.handler',
|
|
207
|
+
layers: [this.partitioningLayer],
|
|
208
|
+
logRetention: RetentionDays.TWO_WEEKS,
|
|
209
|
+
environment: {
|
|
210
|
+
AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
|
|
211
|
+
NODE_OPTIONS: '--enable-source-maps',
|
|
212
|
+
WORKGROUP: this.workgroup.name,
|
|
213
|
+
DATABASE: this.database.databaseName,
|
|
214
|
+
TABLE: this.accessLogsByDateTable.tableName,
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
// grant access to S3 bucket and to execute Athena queries which create new partitions
|
|
219
|
+
this.bucket.grantReadWrite(lambda);
|
|
220
|
+
lambda.addToRolePolicy(
|
|
221
|
+
new PolicyStatement({
|
|
222
|
+
effect: Effect.ALLOW,
|
|
223
|
+
actions: [
|
|
224
|
+
'athena:StartQueryExecution',
|
|
225
|
+
'athena:GetQueryExecution',
|
|
226
|
+
'glue:CreateDatabase',
|
|
227
|
+
'glue:CreatePartition',
|
|
228
|
+
'glue:GetDatabase',
|
|
229
|
+
'glue:GetTable',
|
|
230
|
+
'glue:BatchCreatePartition',
|
|
231
|
+
],
|
|
232
|
+
resources: ['*'],
|
|
233
|
+
})
|
|
234
|
+
);
|
|
235
|
+
|
|
236
|
+
return lambda;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Transforms partitions from the Hive format to Parquet.
|
|
241
|
+
*/
|
|
242
|
+
private createTransformPartitionLambda(): Function {
|
|
243
|
+
const functionName = `${this.resourceIdPrefix}-transform-part`;
|
|
244
|
+
|
|
245
|
+
const lambda = new Function(this, functionName, {
|
|
246
|
+
functionName,
|
|
247
|
+
architecture: Architecture.ARM_64,
|
|
248
|
+
runtime: Runtime.NODEJS_16_X,
|
|
249
|
+
code: Code.fromAsset(path.join(__dirname, '../../functions/access-logs-analysis/partitioning/build/app'), {
|
|
250
|
+
exclude: ['create-partition*', '*.d.ts'],
|
|
251
|
+
}),
|
|
252
|
+
memorySize: 128,
|
|
253
|
+
timeout: Duration.seconds(20),
|
|
254
|
+
handler: 'transform-partition.handler',
|
|
255
|
+
layers: [this.partitioningLayer],
|
|
256
|
+
logRetention: RetentionDays.TWO_WEEKS,
|
|
257
|
+
environment: {
|
|
258
|
+
AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
|
|
259
|
+
NODE_OPTIONS: '--enable-source-maps',
|
|
260
|
+
WORKGROUP: this.workgroup.name,
|
|
261
|
+
DATABASE: this.database.databaseName,
|
|
262
|
+
SOURCE_TABLE: this.accessLogsByDateTable.tableName,
|
|
263
|
+
TARGET_TABLE: this.accessLogsParquetTable.tableName,
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
// grant access to S3 bucket and to execute Athena queries which create new partitions
|
|
268
|
+
this.bucket.grantReadWrite(lambda);
|
|
269
|
+
lambda.addToRolePolicy(
|
|
270
|
+
new PolicyStatement({
|
|
271
|
+
effect: Effect.ALLOW,
|
|
272
|
+
actions: [
|
|
273
|
+
'athena:StartQueryExecution',
|
|
274
|
+
'athena:GetQueryExecution',
|
|
275
|
+
'glue:CreateDatabase',
|
|
276
|
+
'glue:CreatePartition',
|
|
277
|
+
'glue:GetDatabase',
|
|
278
|
+
'glue:GetTable',
|
|
279
|
+
'glue:BatchCreatePartition',
|
|
280
|
+
'glue:GetPartition',
|
|
281
|
+
'glue:GetPartitions',
|
|
282
|
+
'glue:CreateTable',
|
|
283
|
+
'glue:DeleteTable',
|
|
284
|
+
'glue:DeletePartition',
|
|
285
|
+
],
|
|
286
|
+
resources: ['*'],
|
|
287
|
+
})
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
return lambda;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
private createCreatePartitionsScheduler(): Rule {
|
|
294
|
+
const ruleName = `${this.resourceIdPrefix}-create-part-sched`;
|
|
295
|
+
return new Rule(this, ruleName, {
|
|
296
|
+
ruleName,
|
|
297
|
+
schedule: Schedule.cron({minute: '55'}),
|
|
298
|
+
targets: [new LambdaFunction(this.createPartitionLambda, {retryAttempts: 10})],
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
private createTransformPartitionsScheduler(props: AccessLogsAnalysisProps): Rule {
|
|
303
|
+
const ruleName = `${this.resourceIdPrefix}-transform-part-sched`;
|
|
304
|
+
return new Rule(this, ruleName, {
|
|
305
|
+
ruleName,
|
|
306
|
+
schedule: Schedule.cron({minute: '1'}),
|
|
307
|
+
targets: [
|
|
308
|
+
new LambdaFunction(this.transformPartitionLambda, {
|
|
309
|
+
event: this.getTransformPartitionInvocationProps(props),
|
|
310
|
+
retryAttempts: 10,
|
|
311
|
+
}),
|
|
312
|
+
],
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
private getTransformPartitionInvocationProps(props: AccessLogsAnalysisProps): RuleTargetInput {
|
|
317
|
+
return RuleTargetInput.fromObject({
|
|
318
|
+
columnNames: [
|
|
319
|
+
...this.accessLogsParquetTable.columns,
|
|
320
|
+
...(this.accessLogsParquetTable.partitionKeys as Column[]),
|
|
321
|
+
].map(column => column.name),
|
|
322
|
+
columnTransformations: this.getColumnTransformationRules(props),
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Needs to return the log source specific column transformation rules
|
|
328
|
+
* (e.g. to anonymize IP addresses).
|
|
329
|
+
*/
|
|
330
|
+
protected abstract getColumnTransformationRules(props: AccessLogsAnalysisProps): ColumnTransformationRules;
|
|
331
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Bucket } from "aws-cdk-lib/aws-s3";
|
|
2
|
+
import { Duration } from "aws-cdk-lib";
|
|
3
|
+
export interface AccessLogsAnalysisProps {
|
|
4
|
+
/**
|
|
5
|
+
* Expression to prepend to any created resources
|
|
6
|
+
*/
|
|
7
|
+
readonly resourcePrefix: string;
|
|
8
|
+
readonly bucket: Bucket;
|
|
9
|
+
/**
|
|
10
|
+
* Logs in the raw table will be deleted after this period. Default: 7 days.
|
|
11
|
+
*/
|
|
12
|
+
readonly expireRawLogsAfter?: Duration;
|
|
13
|
+
/**
|
|
14
|
+
* Logs in the intermediate date group table will be deleted after this period. Default: 7 days.
|
|
15
|
+
*/
|
|
16
|
+
readonly expireIntermediateLogsAfter?: Duration;
|
|
17
|
+
/**
|
|
18
|
+
* Logs in the transformed table will be deleted after this period. Default: 180 days.
|
|
19
|
+
*/
|
|
20
|
+
readonly expireTransformedLogsAfter?: Duration;
|
|
21
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNjZXNzTG9nc0FuYWx5c2lzUHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBY2Nlc3NMb2dzQW5hbHlzaXNQcm9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtCdWNrZXR9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7RHVyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjY2Vzc0xvZ3NBbmFseXNpc1Byb3BzIHtcbiAgICAvKipcbiAgICAgKiBFeHByZXNzaW9uIHRvIHByZXBlbmQgdG8gYW55IGNyZWF0ZWQgcmVzb3VyY2VzXG4gICAgICovXG4gICAgcmVhZG9ubHkgcmVzb3VyY2VQcmVmaXg6IHN0cmluZztcblxuICAgIHJlYWRvbmx5IGJ1Y2tldDogQnVja2V0O1xuXG4gICAgLyoqXG4gICAgICogTG9ncyBpbiB0aGUgcmF3IHRhYmxlIHdpbGwgYmUgZGVsZXRlZCBhZnRlciB0aGlzIHBlcmlvZC4gRGVmYXVsdDogNyBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4cGlyZVJhd0xvZ3NBZnRlcj86IER1cmF0aW9uO1xuXG4gICAgLyoqXG4gICAgICogTG9ncyBpbiB0aGUgaW50ZXJtZWRpYXRlIGRhdGUgZ3JvdXAgdGFibGUgd2lsbCBiZSBkZWxldGVkIGFmdGVyIHRoaXMgcGVyaW9kLiBEZWZhdWx0OiA3IGRheXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZXhwaXJlSW50ZXJtZWRpYXRlTG9nc0FmdGVyPzogRHVyYXRpb247XG5cbiAgICAvKipcbiAgICAgKiBMb2dzIGluIHRoZSB0cmFuc2Zvcm1lZCB0YWJsZSB3aWxsIGJlIGRlbGV0ZWQgYWZ0ZXIgdGhpcyBwZXJpb2QuIERlZmF1bHQ6IDE4MCBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4cGlyZVRyYW5zZm9ybWVkTG9nc0FmdGVyPzogRHVyYXRpb247XG59Il19
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import {Bucket} from "aws-cdk-lib/aws-s3";
|
|
2
|
+
import {Duration} from "aws-cdk-lib";
|
|
3
|
+
|
|
4
|
+
export interface AccessLogsAnalysisProps {
|
|
5
|
+
/**
|
|
6
|
+
* Expression to prepend to any created resources
|
|
7
|
+
*/
|
|
8
|
+
readonly resourcePrefix: string;
|
|
9
|
+
|
|
10
|
+
readonly bucket: Bucket;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Logs in the raw table will be deleted after this period. Default: 7 days.
|
|
14
|
+
*/
|
|
15
|
+
readonly expireRawLogsAfter?: Duration;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Logs in the intermediate date group table will be deleted after this period. Default: 7 days.
|
|
19
|
+
*/
|
|
20
|
+
readonly expireIntermediateLogsAfter?: Duration;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Logs in the transformed table will be deleted after this period. Default: 180 days.
|
|
24
|
+
*/
|
|
25
|
+
readonly expireTransformedLogsAfter?: Duration;
|
|
26
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Table } from '@aws-cdk/aws-glue-alpha';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { AccessLogsTableProps } from "./AccessLogsTableProps";
|
|
4
|
+
/**
|
|
5
|
+
* Contains the transformed access logs in Apache Parquet format (which is cheaper to query).
|
|
6
|
+
*/
|
|
7
|
+
export declare class AccessLogsParquetTable extends Table {
|
|
8
|
+
constructor(scope: Construct, id: string, props: AccessLogsTableProps);
|
|
9
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AccessLogsParquetTable = void 0;
|
|
4
|
+
const AccessLogsTableConfig_1 = require("./AccessLogsTableConfig");
|
|
5
|
+
const aws_glue_alpha_1 = require("@aws-cdk/aws-glue-alpha");
|
|
6
|
+
/**
|
|
7
|
+
* Contains the transformed access logs in Apache Parquet format (which is cheaper to query).
|
|
8
|
+
*/
|
|
9
|
+
class AccessLogsParquetTable extends aws_glue_alpha_1.Table {
|
|
10
|
+
constructor(scope, id, props) {
|
|
11
|
+
super(scope, id, {
|
|
12
|
+
database: props.database,
|
|
13
|
+
// Athena doesn't support dashes in database/table names
|
|
14
|
+
tableName: id.replace(/-/g, '_'),
|
|
15
|
+
columns: AccessLogsTableConfig_1.AccessLogsTableConfig.getTableColumns(),
|
|
16
|
+
bucket: props.accessLogsBucket,
|
|
17
|
+
description: 'Contains the access logs transformed to Apache Parquet format',
|
|
18
|
+
partitionKeys: AccessLogsTableConfig_1.AccessLogsTableConfig.getPartitionKeys(),
|
|
19
|
+
dataFormat: aws_glue_alpha_1.DataFormat.PARQUET,
|
|
20
|
+
s3Prefix: props.folderName,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.AccessLogsParquetTable = AccessLogsParquetTable;
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNjZXNzTG9nc1BhcnF1ZXRUYWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkFjY2Vzc0xvZ3NQYXJxdWV0VGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUVBQThEO0FBQzlELDREQUEwRDtBQUkxRDs7R0FFRztBQUNILE1BQWEsc0JBQXVCLFNBQVEsc0JBQUs7SUFDL0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEyQjtRQUNuRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4Qix3REFBd0Q7WUFDeEQsU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztZQUNoQyxPQUFPLEVBQUUsNkNBQXFCLENBQUMsZUFBZSxFQUFFO1lBQ2hELE1BQU0sRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1lBQzlCLFdBQVcsRUFBRSwrREFBK0Q7WUFDNUUsYUFBYSxFQUFFLDZDQUFxQixDQUFDLGdCQUFnQixFQUFFO1lBQ3ZELFVBQVUsRUFBRSwyQkFBVSxDQUFDLE9BQU87WUFDOUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxVQUFVO1NBQzNCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWRELHdEQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBY2Nlc3NMb2dzVGFibGVDb25maWd9IGZyb20gJy4vQWNjZXNzTG9nc1RhYmxlQ29uZmlnJztcbmltcG9ydCB7RGF0YUZvcm1hdCwgVGFibGV9IGZyb20gJ0Bhd3MtY2RrL2F3cy1nbHVlLWFscGhhJztcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7QWNjZXNzTG9nc1RhYmxlUHJvcHN9IGZyb20gXCIuL0FjY2Vzc0xvZ3NUYWJsZVByb3BzXCI7XG5cbi8qKlxuICogQ29udGFpbnMgdGhlIHRyYW5zZm9ybWVkIGFjY2VzcyBsb2dzIGluIEFwYWNoZSBQYXJxdWV0IGZvcm1hdCAod2hpY2ggaXMgY2hlYXBlciB0byBxdWVyeSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY2Nlc3NMb2dzUGFycXVldFRhYmxlIGV4dGVuZHMgVGFibGUge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQWNjZXNzTG9nc1RhYmxlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGRhdGFiYXNlOiBwcm9wcy5kYXRhYmFzZSxcbiAgICAgIC8vIEF0aGVuYSBkb2Vzbid0IHN1cHBvcnQgZGFzaGVzIGluIGRhdGFiYXNlL3RhYmxlIG5hbWVzXG4gICAgICB0YWJsZU5hbWU6IGlkLnJlcGxhY2UoLy0vZywgJ18nKSxcbiAgICAgIGNvbHVtbnM6IEFjY2Vzc0xvZ3NUYWJsZUNvbmZpZy5nZXRUYWJsZUNvbHVtbnMoKSxcbiAgICAgIGJ1Y2tldDogcHJvcHMuYWNjZXNzTG9nc0J1Y2tldCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ29udGFpbnMgdGhlIGFjY2VzcyBsb2dzIHRyYW5zZm9ybWVkIHRvIEFwYWNoZSBQYXJxdWV0IGZvcm1hdCcsXG4gICAgICBwYXJ0aXRpb25LZXlzOiBBY2Nlc3NMb2dzVGFibGVDb25maWcuZ2V0UGFydGl0aW9uS2V5cygpLFxuICAgICAgZGF0YUZvcm1hdDogRGF0YUZvcm1hdC5QQVJRVUVULFxuICAgICAgczNQcmVmaXg6IHByb3BzLmZvbGRlck5hbWUsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {AccessLogsTableConfig} from './AccessLogsTableConfig';
|
|
2
|
+
import {DataFormat, Table} from '@aws-cdk/aws-glue-alpha';
|
|
3
|
+
import {Construct} from 'constructs';
|
|
4
|
+
import {AccessLogsTableProps} from "./AccessLogsTableProps";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Contains the transformed access logs in Apache Parquet format (which is cheaper to query).
|
|
8
|
+
*/
|
|
9
|
+
export class AccessLogsParquetTable extends Table {
|
|
10
|
+
constructor(scope: Construct, id: string, props: AccessLogsTableProps) {
|
|
11
|
+
super(scope, id, {
|
|
12
|
+
database: props.database,
|
|
13
|
+
// Athena doesn't support dashes in database/table names
|
|
14
|
+
tableName: id.replace(/-/g, '_'),
|
|
15
|
+
columns: AccessLogsTableConfig.getTableColumns(),
|
|
16
|
+
bucket: props.accessLogsBucket,
|
|
17
|
+
description: 'Contains the access logs transformed to Apache Parquet format',
|
|
18
|
+
partitionKeys: AccessLogsTableConfig.getPartitionKeys(),
|
|
19
|
+
dataFormat: DataFormat.PARQUET,
|
|
20
|
+
s3Prefix: props.folderName,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AccessLogsTableConfig = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Provides the column descriptions for both of the access log tables.
|
|
6
|
+
*/
|
|
7
|
+
const aws_glue_alpha_1 = require("@aws-cdk/aws-glue-alpha");
|
|
8
|
+
class AccessLogsTableConfig {
|
|
9
|
+
static getPartitionKeys() {
|
|
10
|
+
return [
|
|
11
|
+
{
|
|
12
|
+
name: 'year',
|
|
13
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'month',
|
|
17
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'day',
|
|
21
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'hour',
|
|
25
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
static getTableColumns() {
|
|
30
|
+
return [
|
|
31
|
+
{
|
|
32
|
+
name: 'date',
|
|
33
|
+
type: aws_glue_alpha_1.Schema.DATE,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'time',
|
|
37
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'location',
|
|
41
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'bytes',
|
|
45
|
+
type: aws_glue_alpha_1.Schema.BIG_INT,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'request_ip',
|
|
49
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'method',
|
|
53
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'host',
|
|
57
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'uri',
|
|
61
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: 'status',
|
|
65
|
+
type: aws_glue_alpha_1.Schema.INTEGER,
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: 'referrer',
|
|
69
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'user_agent',
|
|
73
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
name: 'query_string',
|
|
77
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'cookie',
|
|
81
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'result_type',
|
|
85
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: 'request_id',
|
|
89
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: 'host_header',
|
|
93
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'request_protocol',
|
|
97
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: 'request_bytes',
|
|
101
|
+
type: aws_glue_alpha_1.Schema.BIG_INT,
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'time_taken',
|
|
105
|
+
type: aws_glue_alpha_1.Schema.FLOAT,
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: 'xforwarded_for',
|
|
109
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'ssl_protocol',
|
|
113
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'ssl_cipher',
|
|
117
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: 'response_result_type',
|
|
121
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: 'http_version',
|
|
125
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: 'fle_status',
|
|
129
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: 'fle_encrypted_fields',
|
|
133
|
+
type: aws_glue_alpha_1.Schema.INTEGER,
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: 'c_port',
|
|
137
|
+
type: aws_glue_alpha_1.Schema.INTEGER,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: 'time_to_first_byte',
|
|
141
|
+
type: aws_glue_alpha_1.Schema.FLOAT,
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: 'x_edge_detailed_result_type',
|
|
145
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: 'sc_content_type',
|
|
149
|
+
type: aws_glue_alpha_1.Schema.STRING,
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
name: 'sc_content_len',
|
|
153
|
+
type: aws_glue_alpha_1.Schema.BIG_INT,
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
name: 'sc_range_start',
|
|
157
|
+
type: aws_glue_alpha_1.Schema.BIG_INT,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: 'sc_range_end',
|
|
161
|
+
type: aws_glue_alpha_1.Schema.BIG_INT,
|
|
162
|
+
},
|
|
163
|
+
];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.AccessLogsTableConfig = AccessLogsTableConfig;
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNjZXNzTG9nc1RhYmxlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQWNjZXNzTG9nc1RhYmxlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsNERBQXVEO0FBRXZELE1BQWEscUJBQXFCO0lBQ3pCLE1BQU0sQ0FBQyxnQkFBZ0I7UUFDNUIsT0FBTztZQUNMO2dCQUNFLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSx1QkFBTSxDQUFDLE1BQU07YUFDcEI7WUFDRDtnQkFDRSxJQUFJLEVBQUUsT0FBTztnQkFDYixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxNQUFNO2FBQ3BCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsSUFBSSxFQUFFLHVCQUFNLENBQUMsTUFBTTthQUNwQjtZQUNEO2dCQUNFLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSx1QkFBTSxDQUFDLE1BQU07YUFDcEI7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLE1BQU0sQ0FBQyxlQUFlO1FBQzNCLE9BQU87WUFDTDtnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxJQUFJO2FBQ2xCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLE1BQU07Z0JBQ1osSUFBSSxFQUFFLHVCQUFNLENBQUMsTUFBTTthQUNwQjtZQUNEO2dCQUNFLElBQUksRUFBRSxVQUFVO2dCQUNoQixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxNQUFNO2FBQ3BCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsSUFBSSxFQUFFLHVCQUFNLENBQUMsT0FBTzthQUNyQjtZQUNEO2dCQUNFLElBQUksRUFBRSxZQUFZO2dCQUNsQixJQUFJLEVBQUUsdUJBQU0sQ0FBQyxNQUFNO2FBQ3BCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsSUFBSSxFQUFFLHVCQUFNLENBQUMsTUFBTTthQUNwQjtZQUNE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QyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJvdmlkZXMgdGhlIGNvbHVtbiBkZXNjcmlwdGlvbnMgZm9yIGJvdGggb2YgdGhlIGFjY2VzcyBsb2cgdGFibGVzLlxuICovXG5pbXBvcnQge0NvbHVtbiwgU2NoZW1hfSBmcm9tICdAYXdzLWNkay9hd3MtZ2x1ZS1hbHBoYSc7XG5cbmV4cG9ydCBjbGFzcyBBY2Nlc3NMb2dzVGFibGVDb25maWcge1xuICBwdWJsaWMgc3RhdGljIGdldFBhcnRpdGlvbktleXMoKTogQ29sdW1uW10ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd5ZWFyJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdtb250aCcsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnZGF5JyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdob3VyJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0VGFibGVDb2x1bW5zKCk6IENvbHVtbltdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnZGF0ZScsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5EQVRFLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3RpbWUnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2xvY2F0aW9uJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdieXRlcycsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5CSUdfSU5ULFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3JlcXVlc3RfaXAnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ21ldGhvZCcsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaG9zdCcsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAndXJpJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzdGF0dXMnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdyZWZlcnJlcicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAndXNlcl9hZ2VudCcsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncXVlcnlfc3RyaW5nJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjb29raWUnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3Jlc3VsdF90eXBlJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdyZXF1ZXN0X2lkJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdob3N0X2hlYWRlcicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncmVxdWVzdF9wcm90b2NvbCcsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncmVxdWVzdF9ieXRlcycsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5CSUdfSU5ULFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3RpbWVfdGFrZW4nLFxuICAgICAgICB0eXBlOiBTY2hlbWEuRkxPQVQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAneGZvcndhcmRlZF9mb3InLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NzbF9wcm90b2NvbCcsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc3NsX2NpcGhlcicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncmVzcG9uc2VfcmVzdWx0X3R5cGUnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2h0dHBfdmVyc2lvbicsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnZmxlX3N0YXR1cycsXG4gICAgICAgIHR5cGU6IFNjaGVtYS5TVFJJTkcsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnZmxlX2VuY3J5cHRlZF9maWVsZHMnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjX3BvcnQnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuSU5URUdFUixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd0aW1lX3RvX2ZpcnN0X2J5dGUnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuRkxPQVQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAneF9lZGdlX2RldGFpbGVkX3Jlc3VsdF90eXBlJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLlNUUklORyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzY19jb250ZW50X3R5cGUnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuU1RSSU5HLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NjX2NvbnRlbnRfbGVuJyxcbiAgICAgICAgdHlwZTogU2NoZW1hLkJJR19JTlQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc2NfcmFuZ2Vfc3RhcnQnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuQklHX0lOVCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzY19yYW5nZV9lbmQnLFxuICAgICAgICB0eXBlOiBTY2hlbWEuQklHX0lOVCxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxufVxuIl19
|