@pepperize/cdk-dynamodb-backup
Version:
Backup and restore AWS DynamoDB Table to AWS S3 Bucket with AWS Data Pipeline.
293 lines • 33.5 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataPipelineRestore = 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_INPUT_LOCATION"] = "S3InputLocation";
})(Parameters || (Parameters = {}));
const DEFAULT_DDB_READ_THROUGHPUT_RATIO = 0.5;
class DataPipelineRestore 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.grantWriteData(this.resourceRole);
props.restoreBucket.grantRead(this.resourceRole);
logsBucket.grantWrite(this.resourceRole);
this.instanceProfile = new iam.CfnInstanceProfile(this, "InstanceProfile", {
roles: [this.resourceRole.roleName],
});
const pipelineName = props.pipelineName ??
`dynamodb-restore-${props.table.tableName}-${props.table.env.account}-${props.table.env.region}`;
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_INPUT_LOCATION,
stringValue: props.restoreBucket.s3UrlForObject(props.restoreFolder),
},
],
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 target 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_INPUT_LOCATION,
attributes: [
{
key: "watermark",
stringValue: "Select the output S3 folder",
},
{
key: "description",
stringValue: "Input S3 folder",
},
{
key: "type",
stringValue: "AWS::S3::ObjectKey",
},
],
},
],
pipelineObjects: [
{
id: "Default",
name: "Default",
fields: [
{
key: "type",
stringValue: "Default",
},
{
key: "failureAndRerunMode",
stringValue: "CASCADE",
},
{
key: "scheduleType",
stringValue: "ONDEMAND",
},
{
key: "resourceRole",
stringValue: `${this.instanceProfile.instanceProfileName}`,
},
{
key: "role",
stringValue: `${this.role.roleName}`,
},
{
key: "pipelineLogUri",
stringValue: `${logsBucket.s3UrlForObject("/dynamodb/restore")}`,
},
],
},
{
id: "EmrClusterForRestore",
name: "EmrClusterForRestore",
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: "TableRestoreActivity",
name: "TableRestoreActivity",
fields: [
{
key: "input",
refValue: "S3RestoreLocation",
},
{
key: "output",
refValue: "DDBTargetTable",
},
{
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.DynamoDBImport,#{input.directoryPath},#{output.tableName},#{output.readThroughputPercent}`,
},
{
key: "runsOn",
refValue: "EmrClusterForBackup",
},
{
key: "type",
stringValue: "EmrActivity",
},
{
key: "resizeClusterBeforeRunning",
stringValue: "true",
},
],
},
{
id: "DDBTargetTable",
name: "DDBTargetTable",
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: "S3RestoreLocation",
name: "S3RestoreLocation",
fields: [
{
key: "directoryPath",
stringValue: `${props.restoreBucket.s3UrlForObject(props.restoreFolder)}`,
},
{
key: "type",
stringValue: "S3DataNode",
},
],
},
],
pipelineTags: this.tags.renderTags(),
});
}
}
exports.DataPipelineRestore = DataPipelineRestore;
_a = JSII_RTTI_SYMBOL_1;
DataPipelineRestore[_a] = { fqn: "@pepperize/cdk-dynamodb-backup.DataPipelineRestore", version: "0.0.484" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhcGlwZWxpbmUvcmVzdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNFQUE4RDtBQUM5RCw2Q0FBc0Y7QUFDdEYsNkRBQTZEO0FBRTdELDJDQUEyQztBQUUzQywyQ0FBdUM7QUFjdkMsSUFBSyxVQUtKO0FBTEQsV0FBSyxVQUFVO0lBQ2Isc0NBQXdCLENBQUE7SUFDeEIsb0NBQXNCLENBQUE7SUFDdEIsa0VBQW9ELENBQUE7SUFDcEQsbURBQXFDLENBQUE7QUFDdkMsQ0FBQyxFQUxJLFVBQVUsS0FBVixVQUFVLFFBS2Q7QUFFRCxNQUFNLGlDQUFpQyxHQUFHLEdBQUcsQ0FBQztBQUU5QyxNQUFhLG1CQUFvQixTQUFRLHNCQUFTO0lBZ0JoRCxZQUFtQixLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUM5RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBSFYsU0FBSSxHQUFHLElBQUksd0JBQVUsQ0FBQyxxQkFBTyxDQUFDLFFBQVEsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBSzlFLE1BQU0sVUFBVSxHQUNkLEtBQUssQ0FBQyxVQUFVO1lBQ2hCLElBQUksa0NBQWEsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUNuQyxjQUFjLEVBQUU7b0JBQ2Q7d0JBQ0UsVUFBVSxFQUFFLHNCQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztxQkFDOUI7aUJBQ0Y7Z0JBQ0QsaUJBQWlCLEVBQUUsSUFBSTtnQkFDdkIsYUFBYSxFQUFFLDJCQUFhLENBQUMsT0FBTzthQUNyQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO1lBQ3JDLFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxrQkFBa0IsQ0FDbkMsSUFBSSxHQUFHLENBQUMs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QyxTQUFTLEVBQUU7eUJBQ3pDO3dCQUNEOzRCQUNFLEdBQUcsRUFBRSxRQUFROzRCQUNiLFdBQVcsRUFBRSxLQUFLLFVBQVUsQ0FBQyxVQUFVLEVBQUU7eUJBQzFDO3FCQUNGO2lCQUNGO2dCQUNEO29CQUNFLEVBQUUsRUFBRSxtQkFBbUI7b0JBQ3ZCLElBQUksRUFBRSxtQkFBbUI7b0JBQ3pCLE1BQU0sRUFBRTt3QkFDTjs0QkFDRSxHQUFHLEVBQUUsZUFBZTs0QkFDcEIsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFO3lCQUMxRTt3QkFDRDs0QkFDRSxHQUFHLEVBQUUsTUFBTTs0QkFDWCxXQUFXLEVBQUUsWUFBWTt5QkFDMUI7cUJBQ0Y7aUJBQ0Y7YUFDRjtZQUNELFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtTQUNyQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQXRTSCxrREF1U0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcml2YXRlQnVja2V0IH0gZnJvbSBcIkBwZXBwZXJpemUvY2RrLXByaXZhdGUtYnVja2V0XCI7XG5pbXBvcnQgeyBEdXJhdGlvbiwgSVRhZ2dhYmxlLCBSZW1vdmFsUG9saWN5LCBUYWdNYW5hZ2VyLCBUYWdUeXBlIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBkYXRhcGlwZWxpbmUgZnJvbSBcImF3cy1jZGstbGliL2F3cy1kYXRhcGlwZWxpbmVcIjtcbmltcG9ydCAqIGFzIGR5bmFtb2RiIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0ICogYXMgczMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhUGlwZWxpbmVSZXN0b3JlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHBpcGVsaW5lTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZHluYW1vRGJUaHJvdWdocHV0UmF0aW8/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGxvZ3NCdWNrZXQ/OiBzMy5JQnVja2V0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFQaXBlbGluZVJlc3RvcmVQcm9wcyBleHRlbmRzIERhdGFQaXBlbGluZVJlc3RvcmVPcHRpb25zIHtcbiAgcmVhZG9ubHkgdGFibGU6IGR5bmFtb2RiLklUYWJsZTtcbiAgcmVhZG9ubHkgcmVzdG9yZUJ1Y2tldDogczMuSUJ1Y2tldDtcbiAgcmVhZG9ubHkgcmVzdG9yZUZvbGRlcjogc3RyaW5nO1xufVxuXG5lbnVtIFBhcmFtZXRlcnMge1xuICBEREJfUkVHSU9OID0gXCJEREJSZWdpb25cIixcbiAgRERCX1RBQkxFID0gXCJEREJUYWJsZVwiLFxuICBEREJfUkVBRF9USFJPVUdIUFVUX1JBVElPID0gXCJEREJSZWFkVGhyb3VnaHB1dFJhdGlvXCIsXG4gIFMzX0lOUFVUX0xPQ0FUSU9OID0gXCJTM0lucHV0TG9jYXRpb25cIixcbn1cblxuY29uc3QgREVGQVVMVF9EREJfUkVBRF9USFJPVUdIUFVUX1JBVElPID0gMC41O1xuXG5leHBvcnQgY2xhc3MgRGF0YVBpcGVsaW5lUmVzdG9yZSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElUYWdnYWJsZSB7XG4gIC8qKlxuICAgKiBUaGUgcm9sZSB1c2VkIGJ5IGRhdGFwaXBlbGluZXMgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb2xlOiBpYW0uSVJvbGU7XG4gIC8qKlxuICAgKiBUaGUgcm9sZSB1c2VkIGJ5IHRoZSBlbXIgY2x1c3RlciByZXNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2VSb2xlOiBpYW0uSVJvbGU7XG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2UgcHJvZmlsZSBvZiB0aGUgZW1yIGNsdXN0ZXIgcmVzb3VyY2VzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGluc3RhbmNlUHJvZmlsZTogaWFtLkNmbkluc3RhbmNlUHJvZmlsZTtcblxuICByZWFkb25seSB0YWdzID0gbmV3IFRhZ01hbmFnZXIoVGFnVHlwZS5TVEFOREFSRCwgXCJBV1M6OkRhdGFQaXBlbGluZTo6UGlwZWxpbmVcIik7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEYXRhUGlwZWxpbmVSZXN0b3JlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgbG9nc0J1Y2tldCA9XG4gICAgICBwcm9wcy5sb2dzQnVja2V0ID8/XG4gICAgICBuZXcgUHJpdmF0ZUJ1Y2tldCh0aGlzLCBcIkxvZ0J1Y2tldFwiLCB7XG4gICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXhwaXJhdGlvbjogRHVyYXRpb24uZGF5cygxNCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsIFwiUm9sZVwiLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uQ29tcG9zaXRlUHJpbmNpcGFsKFxuICAgICAgICBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJlbGFzdGljbWFwcmVkdWNlLmFtYXpvbmF3cy5jb21cIiksXG4gICAgICAgIG5ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImRhdGFwaXBlbGluZS5hbWF6b25hd3MuY29tXCIpXG4gICAgICApLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBbaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFwiQVdTRGF0YVBpcGVsaW5lUm9sZVwiKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc291cmNlUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCBcIlJlc291cmNlUm9sZVwiLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImVjMi5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgbWFuYWdlZFBvbGljaWVzOiBbaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFwiQW1hem9uRUMyUm9sZWZvckRhdGFQaXBlbGluZVJvbGVcIildLFxuICAgIH0pO1xuICAgIHByb3BzLnRhYmxlLmdyYW50V3JpdGVEYXRhKHRoaXMucmVzb3VyY2VSb2xlKTtcbiAgICBwcm9wcy5yZXN0b3JlQnVja2V0LmdyYW50UmVhZCh0aGlzLnJlc291cmNlUm9sZSk7XG4gICAgbG9nc0J1Y2tldC5ncmFudFdyaXRlKHRoaXMucmVzb3VyY2VSb2xlKTtcblxuICAgIHRoaXMuaW5zdGFuY2VQcm9maWxlID0gbmV3IGlhbS5DZm5JbnN0YW5jZVByb2ZpbGUodGhpcywgXCJJbnN0YW5jZVByb2ZpbGVcIiwge1xuICAgICAgcm9sZXM6IFt0aGlzLnJlc291cmNlUm9sZS5yb2xlTmFtZV0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBwaXBlbGluZU5hbWUgPVxuICAgICAgcHJvcHMucGlwZWxpbmVOYW1lID8/XG4gICAgICBgZHluYW1vZGItcmVzdG9yZS0ke3Byb3BzLnRhYmxlLnRhYmxlTmFtZX0tJHtwcm9wcy50YWJsZS5lbnYuYWNjb3VudH0tJHtwcm9wcy50YWJsZS5lbnYucmVnaW9ufWA7XG4gICAgY29uc3QgdGhyb3VnaHB1dCA9IHByb3BzLmR5bmFtb0RiVGhyb3VnaHB1dFJhdGlvID8/IERFRkFVTFRfRERCX1JFQURfVEhST1VHSFBVVF9SQVRJTztcblxuICAgIG5ldyBkYXRhcGlwZWxpbmUuQ2ZuUGlwZWxpbmUodGhpcywgXCJQaXBlbGluZVwiLCB7XG4gICAgICBuYW1lOiBwaXBlbGluZU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYEJhY2t1cCBEeW5hbW9EQiBUYWJsZSAke3Byb3BzLnRhYmxlLnRhYmxlTmFtZX0gJHtwcm9wcy50YWJsZS5lbnYuYWNjb3VudH0gJHtwcm9wcy50YWJsZS5lbnYucmVnaW9ufSB0byBTM2AsXG4gICAgICBhY3RpdmF0ZTogdHJ1ZSxcbiAgICAgIHBhcmFtZXRlclZhbHVlczogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFBhcmFtZXRlcnMuRERCX1JFR0lPTixcbiAgICAgICAgICBzdHJpbmdWYWx1ZTogcHJvcHMudGFibGUuZW52LnJlZ2lvbixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBQYXJhbWV0ZXJzLkREQl9UQUJMRSxcbiAgICAgICAgICBzdHJpbmdWYWx1ZTogcHJvcHMudGFibGUudGFibGVOYW1lLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFBhcmFtZXRlcnMuRERCX1JFQURfVEhST1VHSFBVVF9SQVRJTyxcbiAgICAgICAgICBzdHJpbmdWYWx1ZTogYCR7dGhyb3VnaHB1dH1gLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFBhcmFtZXRlcnMuUzNfSU5QVVRfTE9DQVRJT04sXG4gICAgICAgICAgc3RyaW5nVmFsdWU6IHByb3BzLnJlc3RvcmVCdWNrZXQuczNVcmxGb3JPYmplY3QocHJvcHMucmVzdG9yZUZvbGRlciksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcGFyYW1ldGVyT2JqZWN0czogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFBhcmFtZXRlcnMuRERCX1JFR0lPTixcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJkZWZhdWx0XCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBwcm9wcy50YWJsZS5lbnYucmVnaW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcIndhdGVybWFya1wiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJFbnRlciBEeW5hbW9EQiB0YWJsZSByZWdpb25cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJkZXNjcmlwdGlvblwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJSZWdpb24gb2YgdGhlIER5bmFtb0RCIHRhYmxlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwidHlwZVwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBQYXJhbWV0ZXJzLkREQl9UQUJMRSxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJ3YXRlcm1hcmtcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiRW50ZXIgRHluYW1vREIgdGFibGUgbmFtZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcImRlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIk5hbWUgb2YgdGhlIHRhcmdldCBEeW5hbW9EQiB0YWJsZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInR5cGVcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogUGFyYW1ldGVycy5EREJfUkVBRF9USFJPVUdIUFVUX1JBVElPLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcImRlZmF1bHRcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IGAke0RFRkFVTFRfRERCX1JFQURfVEhST1VHSFBVVF9SQVRJT31gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcIndhdGVybWFya1wiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJFbnRlciB2YWx1ZSBiZXR3ZWVuIDAuMSBhbmQgMS4wXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwiZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiRHluYW1vREIgcmVhZCB0aHJvdWdocHV0IHJhdGlvXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwidHlwZVwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJEb3VibGVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBQYXJhbWV0ZXJzLlMzX0lOUFVUX0xPQ0FUSU9OLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcIndhdGVybWFya1wiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJTZWxlY3QgdGhlIG91dHB1dCBTMyBmb2xkZXJcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJkZXNjcmlwdGlvblwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJJbnB1dCBTMyBmb2xkZXJcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJ0eXBlXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIkFXUzo6UzM6Ok9iamVjdEtleVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHBpcGVsaW5lT2JqZWN0czogW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwiRGVmYXVsdFwiLFxuICAgICAgICAgIG5hbWU6IFwiRGVmYXVsdFwiLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwidHlwZVwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJEZWZhdWx0XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwiZmFpbHVyZUFuZFJlcnVuTW9kZVwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJDQVNDQURFXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwic2NoZWR1bGVUeXBlXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcIk9OREVNQU5EXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwicmVzb3VyY2VSb2xlXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBgJHt0aGlzLmluc3RhbmNlUHJvZmlsZS5pbnN0YW5jZVByb2ZpbGVOYW1lfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwicm9sZVwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogYCR7dGhpcy5yb2xlLnJvbGVOYW1lfWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwicGlwZWxpbmVMb2dVcmlcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IGAke2xvZ3NCdWNrZXQuczNVcmxGb3JPYmplY3QoXCIvZHluYW1vZGIvcmVzdG9yZVwiKX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwiRW1yQ2x1c3RlckZvclJlc3RvcmVcIixcbiAgICAgICAgICBuYW1lOiBcIkVtckNsdXN0ZXJGb3JSZXN0b3JlXCIsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJjb3JlSW5zdGFuY2VDb3VudFwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCIxXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwiY29yZUluc3RhbmNlVHlwZVwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJtMy54bGFyZ2VcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJyZWxlYXNlTGFiZWxcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiZW1yLTUuMjMuMFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcIm1hc3Rlckluc3RhbmNlVHlwZVwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJtMy54bGFyZ2VcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJyZWdpb25cIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IGAjeyR7UGFyYW1ldGVycy5EREJfUkVHSU9OfX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInR5cGVcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiRW1yQ2x1c3RlclwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInRlcm1pbmF0ZUFmdGVyXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBgJHtEdXJhdGlvbi5ob3VycygxKS5mb3JtYXRUb2tlblRvTnVtYmVyKCl9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIlRhYmxlUmVzdG9yZUFjdGl2aXR5XCIsXG4gICAgICAgICAgbmFtZTogXCJUYWJsZVJlc3RvcmVBY3Rpdml0eVwiLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwiaW5wdXRcIixcbiAgICAgICAgICAgICAgcmVmVmFsdWU6IFwiUzNSZXN0b3JlTG9jYXRpb25cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJvdXRwdXRcIixcbiAgICAgICAgICAgICAgcmVmVmFsdWU6IFwiRERCVGFyZ2V0VGFibGVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtleTogXCJtYXhpbXVtUmV0cmllc1wiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCIyXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwic3RlcFwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogYHMzOi8vZHluYW1vZGItZHBsLSN7JHtQYXJhbWV0ZXJzLkREQl9SRUdJT059L2Vtci1kZGItc3RvcmFnZS1oYW5kbGVyLzQuMTEuMC9lbXItZHluYW1vZGItdG9vbHMtNC4xMS4wLVNOQVBTSE9ULWphci13aXRoLWRlcGVuZGVuY2llcy5qYXIsb3JnLmFwYWNoZS5oYWRvb3AuZHluYW1vZGIudG9vbHMuRHluYW1vREJJbXBvcnQsI3tpbnB1dC5kaXJlY3RvcnlQYXRofSwje291dHB1dC50YWJsZU5hbWV9LCN7b3V0cHV0LnJlYWRUaHJvdWdocHV0UGVyY2VudH1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInJ1bnNPblwiLFxuICAgICAgICAgICAgICByZWZWYWx1ZTogXCJFbXJDbHVzdGVyRm9yQmFja3VwXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwidHlwZVwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogXCJFbXJBY3Rpdml0eVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInJlc2l6ZUNsdXN0ZXJCZWZvcmVSdW5uaW5nXCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIkREQlRhcmdldFRhYmxlXCIsXG4gICAgICAgICAgbmFtZTogXCJEREJUYXJnZXRUYWJsZVwiLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwicmVhZFRocm91Z2hwdXRQZXJjZW50XCIsXG4gICAgICAgICAgICAgIHN0cmluZ1ZhbHVlOiBgI3ske1BhcmFtZXRlcnMuRERCX1JFQURfVEhST1VHSFBVVF9SQVRJT31gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInR5cGVcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiRHluYW1vREJEYXRhTm9kZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInRhYmxlTmFtZVwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogYCN7JHtQYXJhbWV0ZXJzLkREQl9UQUJMRX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInJlZ2lvblwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogYCN7JHtQYXJhbWV0ZXJzLkREQl9SRUdJT059YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBcIlMzUmVzdG9yZUxvY2F0aW9uXCIsXG4gICAgICAgICAgbmFtZTogXCJTM1Jlc3RvcmVMb2NhdGlvblwiLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBrZXk6IFwiZGlyZWN0b3J5UGF0aFwiLFxuICAgICAgICAgICAgICBzdHJpbmdWYWx1ZTogYCR7cHJvcHMucmVzdG9yZUJ1Y2tldC5zM1VybEZvck9iamVjdChwcm9wcy5yZXN0b3JlRm9sZGVyKX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAga2V5OiBcInR5cGVcIixcbiAgICAgICAgICAgICAgc3RyaW5nVmFsdWU6IFwiUzNEYXRhTm9kZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHBpcGVsaW5lVGFnczogdGhpcy50YWdzLnJlbmRlclRhZ3MoKSxcbiAgICB9KTtcbiAgfVxufVxuIl19