UNPKG

cdk-athena-log

Version:

A CDK construct to create an Athena table for querying ALB logs.

100 lines 18.3 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.AthenaTableForAlb = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const constructs_1 = require("constructs"); /** * A CDK construct to create an AWS Glue table for querying ALB access logs with Athena. * It automatically configures partition projection by date, simplifying log analysis. */ class AthenaTableForAlb extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); const { logBucketName, databaseName, tableName, projectionStartDate, logPrefix } = props; // Add a runtime check for all required properties for extra safety. if (!logBucketName || !databaseName || !tableName || !projectionStartDate) { throw new Error('The `logBucketName`, `databaseName`, `tableName`, and `projectionStartDate` properties are all required.'); } const stack = aws_cdk_lib_1.Stack.of(this); // Build the S3 path to the logs dynamically const s3LocationPrefix = logPrefix ? `${logPrefix}/` : ''; const s3Location = `s3://${logBucketName}/${s3LocationPrefix}AWSLogs/${stack.account}/elasticloadbalancing/${stack.region}/`; this.table = new aws_cdk_lib_1.aws_glue.CfnTable(this, 'Default', { catalogId: stack.account, databaseName: databaseName, tableInput: { name: tableName, description: 'Table for querying ALB access logs', tableType: 'EXTERNAL_TABLE', parameters: { 'projection.enabled': 'true', 'projection.day.type': 'date', 'projection.day.range': `${projectionStartDate},NOW`, 'projection.day.format': 'yyyy/MM/dd', 'projection.day.interval': '1', 'projection.day.interval.unit': 'DAYS', 'storage.location.template': `${s3Location}\${day}/`, 'EXTERNAL': 'TRUE', 'has_encrypted_data': 'false', }, partitionKeys: [{ name: 'day', type: 'string' }], storageDescriptor: { columns: [ { name: 'type', type: 'string' }, { name: 'time', type: 'string' }, { name: 'elb', type: 'string' }, { name: 'client_ip', type: 'string' }, { name: 'client_port', type: 'int' }, { name: 'target_ip', type: 'string' }, { name: 'target_port', type: 'int' }, { name: 'request_processing_time', type: 'double' }, { name: 'target_processing_time', type: 'double' }, { name: 'response_processing_time', type: 'double' }, { name: 'elb_status_code', type: 'int' }, { name: 'target_status_code', type: 'string' }, { name: 'received_bytes', type: 'bigint' }, { name: 'sent_bytes', type: 'bigint' }, { name: 'request_verb', type: 'string' }, { name: 'request_url', type: 'string' }, { name: 'request_proto', type: 'string' }, { name: 'user_agent', type: 'string' }, { name: 'ssl_cipher', type: 'string' }, { name: 'ssl_protocol', type: 'string' }, { name: 'target_group_arn', type: 'string' }, { name: 'trace_id', type: 'string' }, { name: 'domain_name', type: 'string' }, { name: 'chosen_cert_arn', type: 'string' }, { name: 'matched_rule_priority', type: 'string' }, { name: 'request_creation_time', type: 'string' }, { name: 'actions_executed', type: 'string' }, { name: 'redirect_url', type: 'string' }, { name: 'lambda_error_reason', type: 'string' }, { name: 'target_port_list', type: 'string' }, { name: 'target_status_code_list', type: 'string' }, { name: 'classification', type: 'string' }, { name: 'classification_reason', type: 'string' }, { name: 'conn_trace_id', type: 'string' }, ], location: s3Location, inputFormat: 'org.apache.hadoop.mapred.TextInputFormat', outputFormat: 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat', serdeInfo: { serializationLibrary: 'org.apache.hadoop.hive.serde2.RegexSerDe', parameters: { 'serialization.format': '1', 'input.regex': '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) "([^ ]*) (.*) (- |[^ ]*)" "([^"]*)" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) "([^"]*)" "([^"]*)" "([^"]*)" ([-.0-9]*) ([^ ]*) "([^"]*)" "([^"]*)" "([^ ]*)" "([^\\s]+?)" "([^\\s]+)" "([^ ]*)" "([^ ]*)" ?([^ ]*)?( .*)?', }, }, compressed: false, storedAsSubDirectories: false, }, }, }); } } exports.AthenaTableForAlb = AthenaTableForAlb; _a = JSII_RTTI_SYMBOL_1; AthenaTableForAlb[_a] = { fqn: "cdk-athena-log.AthenaTableForAlb", version: "0.0.14" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRoZW5hLXRhYmxlLWZvci1hbGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYXRoZW5hLXRhYmxlLWZvci1hbGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBc0Q7QUFDdEQsMkNBQXVDO0FBb0N2Qzs7O0dBR0c7QUFDSCxNQUFhLGlCQUFrQixTQUFRLHNCQUFTO0lBTTlDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNkI7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBRXpGLG9FQUFvRTtRQUNwRSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMxRSxNQUFNLElBQUksS0FBSyxDQUFDLDBHQUEwRyxDQUFDLENBQUM7UUFDOUgsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTdCLDRDQUE0QztRQUM1QyxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFELE1BQU0sVUFBVSxHQUFHLFFBQVEsYUFBYSxJQUFJLGdCQUFnQixXQUFXLEtBQUssQ0FBQyxPQUFPLHlCQUF5QixLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7UUFFN0gsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLHNCQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDOUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3hCLFlBQVksRUFBRSxZQUFZO1lBQzFCLFVBQVUsRUFBRTtnQkFD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O3dCQUNqRCxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO3dCQUM1QyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTt3QkFDeEMsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTt3QkFDL0MsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTt3QkFDNUMsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTt3QkFDbkQsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTt3QkFDMUMsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTt3QkFDakQsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7cUJBQzFDO29CQUNELFFBQVEsRUFBRSxVQUFVO29CQUNwQixXQUFXLEVBQUUsMENBQTBDO29CQUN2RCxZQUFZLEVBQUUsNERBQTREO29CQUMxRSxTQUFTLEVBQUU7d0JBQ1Qsb0JBQW9CLEVBQUUsMENBQTBDO3dCQUNoRSxVQUFVLEVBQUU7NEJBQ1Ysc0JBQXNCLEVBQUUsR0FBRzs0QkFDM0IsYUFBYSxFQUNYLGlXQUFpVzt5QkFDcFc7cUJBQ0Y7b0JBQ0QsVUFBVSxFQUFFLEtBQUs7b0JBQ2pCLHNCQUFzQixFQUFFLEtBQUs7aUJBQzlCO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztBQTlGSCw4Q0ErRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhd3NfZ2x1ZSBhcyBnbHVlLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIHRoZSBBdGhlbmFUYWJsZUZvckFsYiBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXRoZW5hVGFibGVGb3JBbGJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgUzMgYnVja2V0IHdoZXJlIHRoZSBBTEIgYWNjZXNzIGxvZ3MgYXJlIHN0b3JlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvZ0J1Y2tldE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIEdsdWUgZGF0YWJhc2Ugd2hlcmUgdGhlIHRhYmxlIHdpbGwgYmUgY3JlYXRlZC5cbiAgICogVGhlIHVzZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoaXMgZGF0YWJhc2UgZXhpc3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIGZvciB0aGUgR2x1ZSB0YWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhcnQgZGF0ZSBmb3IgdGhlIHBhcnRpdGlvbiBwcm9qZWN0aW9uLlxuICAgKiBZb3UgbXVzdCBwcm92aWRlIGEgdmFsdWUgaW4gJ1lZWVkvTU0vREQnIGZvcm1hdC5cbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3Rpb25TdGFydERhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByZWZpeCB3aGVyZSBBTEIgYWNjZXNzIGxvZ3MgYXJlIHN0b3JlZCB3aXRoaW4gdGhlIGJ1Y2tldC5cbiAgICogZS5nLiwgaWYgbG9ncyBhcmUgYXQgYHMzOi8vbXktYnVja2V0L215LXByZWZpeC9BV1NMb2dzLy4uLmAsIHNwZWNpZnkgJ215LXByZWZpeCcuXG4gICAqIEBkZWZhdWx0IExvZ3MgYXJlIGV4cGVjdGVkIGF0IHRoZSByb290IGxldmVsIChgczM6Ly9idWNrZXQtbmFtZS9BV1NMb2dzLy4uLmApLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUHJlZml4Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgQ0RLIGNvbnN0cnVjdCB0byBjcmVhdGUgYW4gQVdTIEdsdWUgdGFibGUgZm9yIHF1ZXJ5aW5nIEFMQiBhY2Nlc3MgbG9ncyB3aXRoIEF0aGVuYS5cbiAqIEl0IGF1dG9tYXRpY2FsbHkgY29uZmlndXJlcyBwYXJ0aXRpb24gcHJvamVjdGlvbiBieSBkYXRlLCBzaW1wbGlmeWluZyBsb2cgYW5hbHlzaXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBBdGhlbmFUYWJsZUZvckFsYiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgY3JlYXRlZCBHbHVlIFRhYmxlIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhYmxlOiBnbHVlLkNmblRhYmxlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBBdGhlbmFUYWJsZUZvckFsYlByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHsgbG9nQnVja2V0TmFtZSwgZGF0YWJhc2VOYW1lLCB0YWJsZU5hbWUsIHByb2plY3Rpb25TdGFydERhdGUsIGxvZ1ByZWZpeCB9ID0gcHJvcHM7XG5cbiAgICAvLyBBZGQgYSBydW50aW1lIGNoZWNrIGZvciBhbGwgcmVxdWlyZWQgcHJvcGVydGllcyBmb3IgZXh0cmEgc2FmZXR5LlxuICAgIGlmICghbG9nQnVja2V0TmFtZSB8fCAhZGF0YWJhc2VOYW1lIHx8ICF0YWJsZU5hbWUgfHwgIXByb2plY3Rpb25TdGFydERhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBsb2dCdWNrZXROYW1lYCwgYGRhdGFiYXNlTmFtZWAsIGB0YWJsZU5hbWVgLCBhbmQgYHByb2plY3Rpb25TdGFydERhdGVgIHByb3BlcnRpZXMgYXJlIGFsbCByZXF1aXJlZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHRoaXMpO1xuXG4gICAgLy8gQnVpbGQgdGhlIFMzIHBhdGggdG8gdGhlIGxvZ3MgZHluYW1pY2FsbHlcbiAgICBjb25zdCBzM0xvY2F0aW9uUHJlZml4ID0gbG9nUHJlZml4ID8gYCR7bG9nUHJlZml4fS9gIDogJyc7XG4gICAgY29uc3QgczNMb2NhdGlvbiA9IGBzMzovLyR7bG9nQnVja2V0TmFtZX0vJHtzM0xvY2F0aW9uUHJlZml4fUFXU0xvZ3MvJHtzdGFjay5hY2NvdW50fS9lbGFzdGljbG9hZGJhbGFuY2luZy8ke3N0YWNrLnJlZ2lvbn0vYDtcblxuICAgIHRoaXMudGFibGUgPSBuZXcgZ2x1ZS5DZm5UYWJsZSh0aGlzLCAnRGVmYXVsdCcsIHtcbiAgICAgIGNhdGFsb2dJZDogc3RhY2suYWNjb3VudCxcbiAgICAgIGRhdGFiYXNlTmFtZTogZGF0YWJhc2VOYW1lLFxuICAgICAgdGFibGVJbnB1dDoge1xuICAgICAgICBuYW1lOiB0YWJsZU5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGFibGUgZm9yIHF1ZXJ5aW5nIEFMQiBhY2Nlc3MgbG9ncycsXG4gICAgICAgIHRhYmxlVHlwZTogJ0VYVEVSTkFMX1RBQkxFJyxcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICdwcm9qZWN0aW9uLmVuYWJsZWQnOiAndHJ1ZScsXG4gICAgICAgICAgJ3Byb2plY3Rpb24uZGF5LnR5cGUnOiAnZGF0ZScsXG4gICAgICAgICAgJ3Byb2plY3Rpb24uZGF5LnJhbmdlJzogYCR7cHJvamVjdGlvblN0YXJ0RGF0ZX0sTk9XYCxcbiAgICAgICAgICAncHJvamVjdGlvbi5kYXkuZm9ybWF0JzogJ3l5eXkvTU0vZGQnLFxuICAgICAgICAgICdwcm9qZWN0aW9uLmRheS5pbnRlcnZhbCc6ICcxJyxcbiAgICAgICAgICAncHJvamVjdGlvbi5kYXkuaW50ZXJ2YWwudW5pdCc6ICdEQVlTJyxcbiAgICAgICAgICAnc3RvcmFnZS5sb2NhdGlvbi50ZW1wbGF0ZSc6IGAke3MzTG9jYXRpb259XFwke2RheX0vYCxcbiAgICAgICAgICAnRVhURVJOQUwnOiAnVFJVRScsXG4gICAgICAgICAgJ2hhc19lbmNyeXB0ZWRfZGF0YSc6ICdmYWxzZScsXG4gICAgICAgIH0sXG4gICAgICAgIHBhcnRpdGlvbktleXM6IFt7IG5hbWU6ICdkYXknLCB0eXBlOiAnc3RyaW5nJyB9XSxcbiAgICAgICAgc3RvcmFnZURlc2NyaXB0b3I6IHtcbiAgICAgICAgICBjb2x1bW5zOiBbXG4gICAgICAgICAgICB7IG5hbWU6ICd0eXBlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3RpbWUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnZWxiJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2NsaWVudF9pcCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdjbGllbnRfcG9ydCcsIHR5cGU6ICdpbnQnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICd0YXJnZXRfaXAnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZ2V0X3BvcnQnLCB0eXBlOiAnaW50JyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAncmVxdWVzdF9wcm9jZXNzaW5nX3RpbWUnLCB0eXBlOiAnZG91YmxlJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZ2V0X3Byb2Nlc3NpbmdfdGltZScsIHR5cGU6ICdkb3VibGUnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdyZXNwb25zZV9wcm9jZXNzaW5nX3RpbWUnLCB0eXBlOiAnZG91YmxlJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnZWxiX3N0YXR1c19jb2RlJywgdHlwZTogJ2ludCcgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmdldF9zdGF0dXNfY29kZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdyZWNlaXZlZF9ieXRlcycsIHR5cGU6ICdiaWdpbnQnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdzZW50X2J5dGVzJywgdHlwZTogJ2JpZ2ludCcgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3JlcXVlc3RfdmVyYicsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdyZXF1ZXN0X3VybCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdyZXF1ZXN0X3Byb3RvJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3VzZXJfYWdlbnQnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnc3NsX2NpcGhlcicsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdzc2xfcHJvdG9jb2wnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZ2V0X2dyb3VwX2FybicsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICd0cmFjZV9pZCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdkb21haW5fbmFtZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdjaG9zZW5fY2VydF9hcm4nLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnbWF0Y2hlZF9ydWxlX3ByaW9yaXR5JywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3JlcXVlc3RfY3JlYXRpb25fdGltZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhY3Rpb25zX2V4ZWN1dGVkJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3JlZGlyZWN0X3VybCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdsYW1iZGFfZXJyb3JfcmVhc29uJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ3RhcmdldF9wb3J0X2xpc3QnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAndGFyZ2V0X3N0YXR1c19jb2RlX2xpc3QnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnY2xhc3NpZmljYXRpb24nLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnY2xhc3NpZmljYXRpb25fcmVhc29uJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2Nvbm5fdHJhY2VfaWQnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgbG9jYXRpb246IHMzTG9jYXRpb24sXG4gICAgICAgICAgaW5wdXRGb3JtYXQ6ICdvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuVGV4dElucHV0Rm9ybWF0JyxcbiAgICAgICAgICBvdXRwdXRGb3JtYXQ6ICdvcmcuYXBhY2hlLmhhZG9vcC5oaXZlLnFsLmlvLkhpdmVJZ25vcmVLZXlUZXh0T3V0cHV0Rm9ybWF0JyxcbiAgICAgICAgICBzZXJkZUluZm86IHtcbiAgICAgICAgICAgIHNlcmlhbGl6YXRpb25MaWJyYXJ5OiAnb3JnLmFwYWNoZS5oYWRvb3AuaGl2ZS5zZXJkZTIuUmVnZXhTZXJEZScsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICdzZXJpYWxpemF0aW9uLmZvcm1hdCc6ICcxJyxcbiAgICAgICAgICAgICAgJ2lucHV0LnJlZ2V4JzpcbiAgICAgICAgICAgICAgICAnKFteIF0qKSAoW14gXSopIChbXiBdKikgKFteIF0qKTooWzAtOV0qKSAoW14gXSopWzotXShbMC05XSopIChbLS4wLTldKikgKFstLjAtOV0qKSAoWy0uMC05XSopICh8Wy0wLTldKikgKC18Wy0wLTldKikgKFstMC05XSopIChbLTAtOV0qKSBcIihbXiBdKikgKC4qKSAoLSB8W14gXSopXCIgXCIoW15cIl0qKVwiIChbQS1aMC05LV9dKykgKFtBLVphLXowLTkuLV0qKSAoW14gXSopIFwiKFteXCJdKilcIiBcIihbXlwiXSopXCIgXCIoW15cIl0qKVwiIChbLS4wLTldKikgKFteIF0qKSBcIihbXlwiXSopXCIgXCIoW15cIl0qKVwiIFwiKFteIF0qKVwiIFwiKFteXFxcXHNdKz8pXCIgXCIoW15cXFxcc10rKVwiIFwiKFteIF0qKVwiIFwiKFteIF0qKVwiID8oW14gXSopPyggLiopPycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tcHJlc3NlZDogZmFsc2UsXG4gICAgICAgICAgc3RvcmVkQXNTdWJEaXJlY3RvcmllczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=