UNPKG

@pepperize/cdk-dynamodb-backup

Version:

Backup and restore AWS DynamoDB Table to AWS S3 Bucket with AWS Data Pipeline.

316 lines 36 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.DataPipelineBackup = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const cdk_private_bucket_1 = require("@pepperize/cdk-private-bucket"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const datapipeline = require("aws-cdk-lib/aws-datapipeline"); const iam = require("aws-cdk-lib/aws-iam"); const constructs_1 = require("constructs"); var Parameters; (function (Parameters) { Parameters["DDB_REGION"] = "DDBRegion"; Parameters["DDB_TABLE"] = "DDBTable"; Parameters["DDB_READ_THROUGHPUT_RATIO"] = "DDBReadThroughputRatio"; Parameters["S3_OUTPUT_LOCATION"] = "S3OutputLocation"; })(Parameters || (Parameters = {})); const DEFAULT_DDB_READ_THROUGHPUT_RATIO = 0.5; class DataPipelineBackup extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); this.tags = new aws_cdk_lib_1.TagManager(aws_cdk_lib_1.TagType.STANDARD, "AWS::DataPipeline::Pipeline"); const logsBucket = props.logsBucket ?? new cdk_private_bucket_1.PrivateBucket(this, "LogBucket", { lifecycleRules: [ { expiration: aws_cdk_lib_1.Duration.days(14), }, ], autoDeleteObjects: true, removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY, }); this.role = new iam.Role(this, "Role", { assumedBy: new iam.CompositePrincipal(new iam.ServicePrincipal("elasticmapreduce.amazonaws.com"), new iam.ServicePrincipal("datapipeline.amazonaws.com")), managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName("AWSDataPipelineRole")], }); this.resourceRole = new iam.Role(this, "ResourceRole", { assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"), managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonEC2RoleforDataPipelineRole")], }); props.table.grantReadData(this.resourceRole); props.backupBucket.grantWrite(this.resourceRole); logsBucket.grantWrite(this.resourceRole); this.instanceProfile = new iam.CfnInstanceProfile(this, "InstanceProfile", { roles: [this.resourceRole.roleName], }); const pipelineName = props.pipelineName ?? `dynamodb-backup-${props.table.tableName}-${props.table.env.account}-${props.table.env.region}`; const schedule = props.schedule ?? aws_cdk_lib_1.Duration.days(1); const throughput = props.dynamoDbThroughputRatio ?? DEFAULT_DDB_READ_THROUGHPUT_RATIO; new datapipeline.CfnPipeline(this, "Pipeline", { name: pipelineName, description: `Backup DynamoDB Table ${props.table.tableName} ${props.table.env.account} ${props.table.env.region} to S3`, activate: true, parameterValues: [ { id: Parameters.DDB_REGION, stringValue: props.table.env.region, }, { id: Parameters.DDB_TABLE, stringValue: props.table.tableName, }, { id: Parameters.DDB_READ_THROUGHPUT_RATIO, stringValue: `${throughput}`, }, { id: Parameters.S3_OUTPUT_LOCATION, stringValue: props.backupBucket.s3UrlForObject("/"), }, ], parameterObjects: [ { id: Parameters.DDB_REGION, attributes: [ { key: "default", stringValue: props.table.env.region, }, { key: "watermark", stringValue: "Enter DynamoDB table region", }, { key: "description", stringValue: "Region of the DynamoDB table", }, { key: "type", stringValue: "string", }, ], }, { id: Parameters.DDB_TABLE, attributes: [ { key: "watermark", stringValue: "Enter DynamoDB table name", }, { key: "description", stringValue: "Name of the source DynamoDB table", }, { key: "type", stringValue: "string", }, ], }, { id: Parameters.DDB_READ_THROUGHPUT_RATIO, attributes: [ { key: "default", stringValue: `${DEFAULT_DDB_READ_THROUGHPUT_RATIO}`, }, { key: "watermark", stringValue: "Enter value between 0.1 and 1.0", }, { key: "description", stringValue: "DynamoDB read throughput ratio", }, { key: "type", stringValue: "Double", }, ], }, { id: Parameters.S3_OUTPUT_LOCATION, attributes: [ { key: "watermark", stringValue: "Select the output S3 folder", }, { key: "description", stringValue: "Output S3 folder", }, { key: "type", stringValue: "AWS::S3::ObjectKey", }, ], }, ], pipelineObjects: [ { id: "Schedule", name: `Every ${schedule.formatTokenToNumber()}`, fields: [ { key: "period", stringValue: schedule.formatTokenToNumber(), }, { key: "type", stringValue: "Schedule", }, { key: "startAt", stringValue: "FIRST_ACTIVATION_DATE_TIME", }, ], }, { id: "Default", name: "Default", fields: [ { key: "type", stringValue: "Default", }, { key: "failureAndRerunMode", stringValue: "CASCADE", }, { key: "schedule", refValue: "DefaultSchedule", }, { key: "scheduleType", refValue: "cron", }, { key: "resourceRole", stringValue: `${this.instanceProfile.instanceProfileName}`, }, { key: "role", stringValue: `${this.role.roleName}`, }, { key: "pipelineLogUri", stringValue: `${logsBucket.s3UrlForObject("/dynamodb/backup")}`, }, ], }, { id: "EmrClusterForBackup", name: "EmrClusterForBackup", fields: [ { key: "coreInstanceCount", stringValue: "1", }, { key: "coreInstanceType", stringValue: "m3.xlarge", }, { key: "releaseLabel", stringValue: "emr-5.23.0", }, { key: "masterInstanceType", stringValue: "m3.xlarge", }, { key: "region", stringValue: `#{${Parameters.DDB_REGION}}`, }, { key: "type", stringValue: "EmrCluster", }, { key: "terminateAfter", stringValue: `${aws_cdk_lib_1.Duration.hours(1).formatTokenToNumber()}`, }, ], }, { id: "TableBackupActivity", name: "TableBackupActivity", fields: [ { key: "output", refValue: "S3BackupLocation", }, { key: "input", refValue: "DDBSourceTable", }, { key: "maximumRetries", stringValue: "2", }, { key: "step", stringValue: `s3://dynamodb-dpl-#{${Parameters.DDB_REGION}/emr-ddb-storage-handler/4.11.0/emr-dynamodb-tools-4.11.0-SNAPSHOT-jar-with-dependencies.jar,org.apache.hadoop.dynamodb.tools.DynamoDBExport,#{output.directoryPath},#{input.tableName},#{input.readThroughputPercent}`, }, { key: "runsOn", refValue: "EmrClusterForBackup", }, { key: "type", stringValue: "EmrActivity", }, { key: "resizeClusterBeforeRunning", stringValue: "true", }, ], }, { id: "DDBSourceTable", name: "DDBSourceTable", fields: [ { key: "readThroughputPercent", stringValue: `#{${Parameters.DDB_READ_THROUGHPUT_RATIO}`, }, { key: "type", stringValue: "DynamoDBDataNode", }, { key: "tableName", stringValue: `#{${Parameters.DDB_TABLE}`, }, { key: "region", stringValue: `#{${Parameters.DDB_REGION}`, }, ], }, { id: "S3BackupLocation", name: "S3BackupLocation", fields: [ { key: "directoryPath", stringValue: `${Parameters.S3_OUTPUT_LOCATION}/dynamodb/backup-#{${Parameters.DDB_TABLE}-#{${Parameters.DDB_REGION}}/#{format(@scheduledStartTime, 'YYYY-MM-dd-HH-mm-ss')}`, }, { key: "type", stringValue: "S3DataNode", }, ], }, ], pipelineTags: this.tags.renderTags(), }); } } exports.DataPipelineBackup = DataPipelineBackup; _a = JSII_RTTI_SYMBOL_1; DataPipelineBackup[_a] = { fqn: "@pepperize/cdk-dynamodb-backup.DataPipelineBackup", version: "0.0.484" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFwaXBlbGluZS9iYWNrdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxzRUFBOEQ7QUFDOUQsNkNBQXNGO0FBQ3RGLDZEQUE2RDtBQUU3RCwyQ0FBMkM7QUFFM0MsMkNBQXVDO0FBY3ZDLElBQUssVUFLSjtBQUxELFdBQUssVUFBVTtJQUNiLHNDQUF3QixDQUFBO0lBQ3hCLG9DQUFzQixDQUFBO0lBQ3RCLGtFQUFvRCxDQUFBO0lBQ3BELHFEQUF1QyxDQUFBO0FBQ3pDLENBQUMsRUFMSSxVQUFVLEtBQVYsVUFBVSxRQUtkO0FBRUQsTUFBTSxpQ0FBaUMsR0FBRyxHQUFHLENBQUM7QUFFOUMsTUFBYSxrQkFBbUIsU0FBUSxzQkFBUztJQWdCL0MsWUFBbUIsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBOEI7UUFDN0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUhWLFNBQUksR0FBRyxJQUFJLHdCQUFVLENBQUMscUJBQU8sQ0FBQyxRQUFRLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUs5RSxNQUFNLFVBQVUsR0FDZCxLQUFLLENBQUMsVUFBVTtZQUNoQixJQUFJLGtDQUFhLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFDbkMsY0FBYyxFQUFFO29CQUNkO3dCQUNFLFVBQVUsRUFBRSxzQkFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7cUJBQzlCO2lCQUNGO2dCQUNELGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLGFBQWEsRUFBRSwyQkFBYSxDQUFDLE9BQU87YUFDckMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUNyQyxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsa0JBQWtCLENBQ25DLElBQUksR0FBRyxDQUFDLGdC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ZUJ1Y2tldCB9IGZyb20gXCJAcGVwcGVyaXplL2Nkay1wcml2YXRlLWJ1Y2tldFwiO1xuaW1wb3J0IHsgRHVyYXRpb24sIElUYWdnYWJsZSwgUmVtb3ZhbFBvbGljeSwgVGFnTWFuYWdlciwgVGFnVHlwZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgZGF0YXBpcGVsaW5lIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZGF0YXBpcGVsaW5lXCI7XG5pbXBvcnQgKiBhcyBkeW5hbW9kYiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiXCI7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCAqIGFzIHMzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVBpcGVsaW5lQmFja3VwT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHNjaGVkdWxlPzogRHVyYXRpb247XG4gIHJlYWRvbmx5IHBpcGVsaW5lTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZHluYW1vRGJUaHJvdWdocHV0UmF0aW8/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGxvZ3NCdWNrZXQ/OiBzMy5JQnVja2V0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFQaXBlbGluZUJhY2t1cFByb3BzIGV4dGVuZHMgRGF0YVBpcGVsaW5lQmFja3VwT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHRhYmxlOiBkeW5hbW9kYi5JVGFibGU7XG4gIHJlYWRvbmx5IGJhY2t1cEJ1Y2tldDogczMuSUJ1Y2tldDtcbn1cblxuZW51bSBQYXJhbWV0ZXJzIHtcbiAgRERCX1JFR0lPTiA9IFwiRERCUmVnaW9uXCIsXG4gIEREQl9UQUJMRSA9IFwiRERCVGFibGVcIixcbiAgRERCX1JFQURfVEhST1VHSFBVVF9SQVRJTyA9IFwiRERCUmVhZFRocm91Z2hwdXRSYXRpb1wiLFxuICBTM19PVVRQVVRfTE9DQVRJT04gPSBcIlMzT3V0cHV0TG9jYXRpb25cIixcbn1cblxuY29uc3QgREVGQVVMVF9EREJfUkVBRF9USFJPVUdIUFVUX1JBVElPID0gMC41O1xuXG5leHBvcnQgY2xhc3MgRGF0YVBpcGVsaW5lQmFja3VwIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSVRhZ2dhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSByb2xlIHVzZWQgYnkgZGF0YXBpcGVsaW5lcyBzZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGU6IGlhbS5JUm9sZTtcbiAgLyoqXG4gICAqIFRoZSByb2xlIHVzZWQgYnkgdGhlIGVtciBjbHVzdGVyIHJlc291cmNlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNvdXJjZVJvbGU6IGlhbS5JUm9sZTtcbiAgLyoqXG4gICAqIFRoZSBpbnN0YW5jZSBwcm9maWxlIG9mIHRoZSBlbXIgY2x1c3RlciByZXNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW5zdGFuY2VQcm9maWxlOiBpYW0uQ2ZuSW5zdGFuY2VQcm9maWxlO1xuXG4gIHJlYWRvbmx5IHRhZ3MgPSBuZXcgVGFnTWFuYWdlcihUYWdUeXBlLlNUQU5EQVJELCBcIkFXUzo6RGF0YVBpcGVsaW5lOjpQaXBlbGluZVwiKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERhdGFQaXBlbGluZUJhY2t1cFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGxvZ3NCdWNrZXQgPVxuICAgICAgcHJvcHMubG9nc0J1Y2tldCA/P1xuICAgICAgbmV3IFByaXZhdGVCdWNrZXQodGhpcywgXCJMb2dCdWNrZXRcIiwge1xuICAgICAgICBsaWZlY3ljbGVSdWxlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV4cGlyYXRpb246IER1cmF0aW9uLmRheXMoMTQpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICB9KTtcblxuICAgIHRoaXMucm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCBcIlJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLkNvbXBvc2l0ZVByaW5jaXBhbChcbiAgICAgICAgbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFwiZWxhc3RpY21hcHJlZHVjZS5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgICBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJkYXRhcGlwZWxpbmUuYW1hem9uYXdzLmNvbVwiKVxuICAgICAgKSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW2lhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcIkFXU0RhdGFQaXBlbGluZVJvbGVcIildLFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNvdXJjZVJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgXCJSZXNvdXJjZVJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJlYzIuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW2lhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcIkFtYXpvbkVDMlJvbGVmb3JEYXRhUGlwZWxpbmVSb2xlXCIpXSxcbiAgICB9KTtcbiAgICBwcm9wcy50YWJsZS5ncmFudFJlYWREYXRhKHRoaXMucmVzb3VyY2VSb2xlKTtcbiAgICBwcm9wcy5iYWNrdXBCdWNrZXQuZ3JhbnRXcml0ZSh0aGlzLnJlc291cmNlUm9sZSk7XG4gICAgbG9nc0J1Y2tldC5ncmFudFdyaXRlKHRoaXMucmVzb3VyY2VSb2xlKTtcblxuICAgIHRoaXMuaW5zdGFuY2VQcm9maWxlID0gbmV3IGlhbS5DZm5JbnN0YW5jZVByb2ZpbGUodGhpcywgXCJJbnN0YW5jZVByb2ZpbGVcIiwge1xuICAgICAgcm9sZXM6IFt0aGlzLnJlc291cmNlUm9sZS5yb2xlTmFtZV0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBwaXBlbGluZU5hbWUgPVxuICAgICAgcHJvcHMucGlwZWxpbmVOYW1lID8/XG4gICAgICBgZHluYW1vZGItYmFja3VwLSR7cHJvcHMudGFibGUudGFibGVOYW1lfS0ke3Byb3BzLnRhYmxlLmVudi5hY2NvdW50fS0ke3Byb3BzLnRhYmxlLmVudi5yZWdpb259YDtcbiAgICBjb25zdCBzY2hlZHVsZSA9IHByb3BzLnNjaGVkdWxlID8/IER1cmF0aW9uLmRheXMoMSk7XG4gICAgY29uc3QgdGhyb3VnaHB1dCA9IHByb3BzLmR5bmFtb0RiVGhyb3VnaHB1dFJhdGlvID8/IERFRkFVTFRfRERCX1JFQURfVEhST1VHSFBVVF9SQVRJTztcblxuICAgIG5ldyBkYXRhcGlwZWxpbmUuQ2ZuUGlwZWxpbmUodGhpcywgXCJQaXBlbGluZVwiLCB7XG4gICAgICBuYW1lOiBwaXBlbGluZU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYEJhY2t1cCBEeW5hbW9EQiBUYWJsZSAke3Byb3BzLnRhYmxlLnRhYmxlTmFtZX0gJHtwcm9wcy50YWJsZS5lbnYuYWNjb3VudH0gJHtwcm9wcy50YWJsZS5lbnYucmVnaW9ufSB0byBTM2AsXG4gICAgICBhY3RpdmF0ZTogdHJ1ZSxcbiAgICAgIHBhcmFtZXRlclZhbHVlczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFBhcmFtZXRlcnMuRERCX1JFR0lPTixcbiAgICAgICAgICBzdHJpbmdWYWx1ZTogcHJvcHMudGFibGUuZW52LnJlZ2lvbixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBQYXJhbWV0ZXJzLkREQl9UQUJMRSxcbiAgICAgICAgICBzdHJpbmdWYWx1ZTogcHJvcHMudGFibGUudGFibGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFBhcmFtZXRlcnMuRERCX1JFQURfVEhST1VHSFBVVF9SQVRJTyxcbiAgICAgICAgICBzdHJpbmdWYWx1ZTogYCR7dGhyb3VnaHB1dH1gLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFBhcmFtZXRlcnMuUzNfT1VUUFVUX0xPQ0FUSU9OLFxuICAgICAgICAgIHN0cmluZ1ZhbHVlOiBwcm9wcy5iYWNrdXBCdWNrZXQuczNVcmxGb3JPYmplY3QoXCIvXCIpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHBhcmFtZXRlck9iamVjdHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBQYXJhbWV0ZXJzLkREQl9SRUdJT04sXG4gICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwiZGVmYXVsdFwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogcHJvcHMudGFibGUuZW52LnJlZ2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJ3YXRlcm1hcmtcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiRW50ZXIgRHluYW1vREIgdGFibGUgcmVnaW9uXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwiZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiUmVnaW9uIG9mIHRoZSBEeW5hbW9EQiB0YWJsZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInR5cGVcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogUGFyYW1ldGVycy5EREJfVEFCTEUsXG4gICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwid2F0ZXJtYXJrXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIkVudGVyIER5bmFtb0RCIHRhYmxlIG5hbWVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJkZXNjcmlwdGlvblwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJOYW1lIG9mIHRoZSBzb3VyY2UgRHluYW1vREIgdGFibGVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJ0eXBlXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFBhcmFtZXRlcnMuRERCX1JFQURfVEhST1VHSFBVVF9SQVRJTyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJkZWZhdWx0XCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBgJHtERUZBVUxUX0REQl9SRUFEX1RIUk9VR0hQVVRfUkFUSU99YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJ3YXRlcm1hcmtcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiRW50ZXIgdmFsdWUgYmV0d2VlbiAwLjEgYW5kIDEuMFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcImRlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIkR5bmFtb0RCIHJlYWQgdGhyb3VnaHB1dCByYXRpb1wiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInR5cGVcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiRG91YmxlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogUGFyYW1ldGVycy5TM19PVVRQVVRfTE9DQVRJT04sXG4gICAgICAgICAgYXR0cmlidXRlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwid2F0ZXJtYXJrXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIlNlbGVjdCB0aGUgb3V0cHV0IFMzIGZvbGRlclwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcImRlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIk91dHB1dCBTMyBmb2xkZXJcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJ0eXBlXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIkFXUzo6UzM6Ok9iamVjdEtleVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHBpcGVsaW5lT2JqZWN0czogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwiU2NoZWR1bGVcIixcbiAgICAgICAgICBuYW1lOiBgRXZlcnkgJHtzY2hlZHVsZS5mb3JtYXRUb2tlblRvTnVtYmVyKCl9YCxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInBlcmlvZFwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogc2NoZWR1bGUuZm9ybWF0VG9rZW5Ub051bWJlcigpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInR5cGVcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiU2NoZWR1bGVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJzdGFydEF0XCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIkZJUlNUX0FDVElWQVRJT05fREFURV9USU1FXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJEZWZhdWx0XCIsXG4gICAgICAgICAgbmFtZTogXCJEZWZhdWx0XCIsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJ0eXBlXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIkRlZmF1bHRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJmYWlsdXJlQW5kUmVydW5Nb2RlXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIkNBU0NBREVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJzY2hlZHVsZVwiLFxuICAgICAgICAgICAgICByZWZWYWx1ZTogXCJEZWZhdWx0U2NoZWR1bGVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJzY2hlZHVsZVR5cGVcIixcbiAgICAgICAgICAgICAgcmVmVmFsdWU6IFwiY3JvblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInJlc291cmNlUm9sZVwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogYCR7dGhpcy5pbnN0YW5jZVByb2ZpbGUuaW5zdGFuY2VQcm9maWxlTmFtZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInJvbGVcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IGAke3RoaXMucm9sZS5yb2xlTmFtZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInBpcGVsaW5lTG9nVXJpXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBgJHtsb2dzQnVja2V0LnMzVXJsRm9yT2JqZWN0KFwiL2R5bmFtb2RiL2JhY2t1cFwiKX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwiRW1yQ2x1c3RlckZvckJhY2t1cFwiLFxuICAgICAgICAgIG5hbWU6IFwiRW1yQ2x1c3RlckZvckJhY2t1cFwiLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwiY29yZUluc3RhbmNlQ291bnRcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiMVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcImNvcmVJbnN0YW5jZVR5cGVcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwibTMueGxhcmdlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwicmVsZWFzZUxhYmVsXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcImVtci01LjIzLjBcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJtYXN0ZXJJbnN0YW5jZVR5cGVcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwibTMueGxhcmdlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwicmVnaW9uXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBgI3ske1BhcmFtZXRlcnMuRERCX1JFR0lPTn19YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJ0eXBlXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIkVtckNsdXN0ZXJcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJ0ZXJtaW5hdGVBZnRlclwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogYCR7RHVyYXRpb24uaG91cnMoMSkuZm9ybWF0VG9rZW5Ub051bWJlcigpfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogXCJUYWJsZUJhY2t1cEFjdGl2aXR5XCIsXG4gICAgICAgICAgbmFtZTogXCJUYWJsZUJhY2t1cEFjdGl2aXR5XCIsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJvdXRwdXRcIixcbiAgICAgICAgICAgICAgcmVmVmFsdWU6IFwiUzNCYWNrdXBMb2NhdGlvblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcImlucHV0XCIsXG4gICAgICAgICAgICAgIHJlZlZhbHVlOiBcIkREQlNvdXJjZVRhYmxlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwibWF4aW11bVJldHJpZXNcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiMlwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInN0ZXBcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IGBzMzovL2R5bmFtb2RiLWRwbC0jeyR7UGFyYW1ldGVycy5EREJfUkVHSU9OfS9lbXItZGRiLXN0b3JhZ2UtaGFuZGxlci80LjExLjAvZW1yLWR5bmFtb2RiLXRvb2xzLTQuMTEuMC1TTkFQU0hPVC1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyLG9yZy5hcGFjaGUuaGFkb29wLmR5bmFtb2RiLnRvb2xzLkR5bmFtb0RCRXhwb3J0LCN7b3V0cHV0LmRpcmVjdG9yeVBhdGh9LCN7aW5wdXQudGFibGVOYW1lfSwje2lucHV0LnJlYWRUaHJvdWdocHV0UGVyY2VudH1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInJ1bnNPblwiLFxuICAgICAgICAgICAgICByZWZWYWx1ZTogXCJFbXJDbHVzdGVyRm9yQmFja3VwXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwidHlwZVwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJFbXJBY3Rpdml0eVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInJlc2l6ZUNsdXN0ZXJCZWZvcmVSdW5uaW5nXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIkREQlNvdXJjZVRhYmxlXCIsXG4gICAgICAgICAgbmFtZTogXCJEREJTb3VyY2VUYWJsZVwiLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwicmVhZFRocm91Z2hwdXRQZXJjZW50XCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBgI3ske1BhcmFtZXRlcnMuRERCX1JFQURfVEhST1VHSFBVVF9SQVRJT31gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInR5cGVcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiRHluYW1vREJEYXRhTm9kZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInRhYmxlTmFtZVwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogYCN7JHtQYXJhbWV0ZXJzLkREQl9UQUJMRX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInJlZ2lvblwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogYCN7JHtQYXJhbWV0ZXJzLkREQl9SRUdJT059YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIlMzQmFja3VwTG9jYXRpb25cIixcbiAgICAgICAgICBuYW1lOiBcIlMzQmFja3VwTG9jYXRpb25cIixcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcImRpcmVjdG9yeVBhdGhcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IGAke1BhcmFtZXRlcnMuUzNfT1VUUFVUX0xPQ0FUSU9OfS9keW5hbW9kYi9iYWNrdXAtI3ske1BhcmFtZXRlcnMuRERCX1RBQkxFfS0jeyR7UGFyYW1ldGVycy5EREJfUkVHSU9OfX0vI3tmb3JtYXQoQHNjaGVkdWxlZFN0YXJ0VGltZSwgJ1lZWVktTU0tZGQtSEgtbW0tc3MnKX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInR5cGVcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiUzNEYXRhTm9kZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHBpcGVsaW5lVGFnczogdGhpcy50YWdzLnJlbmRlclRhZ3MoKSxcbiAgICB9KTtcbiAgfVxufVxuIl19