From 9d0a68b6eb219dab0460e1ce65c8e7097a2f9e7f Mon Sep 17 00:00:00 2001 From: Colin Francis <131073567+colifran@users.noreply.github.com> Date: Fri, 10 Nov 2023 12:42:19 -0800 Subject: [PATCH] chore(core): migrate cross region ssm reader handler (#27905) This PR moves the cross region ssm reader handler from aws-cdk-lib to our new centralized location for custom resource handlers in the [@aws-cdk](https://github.com/aws-cdk) package. ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license* --- .../__entrypoint__.js | 0 .../index.js | 166 ++++++++++++++++++ .../index.js | 152 ---------------- .../index.js | 98 ----------- .../__entrypoint__.js | 0 .../index.js | 1 + .../integ-acm-stack.assets.json | 10 +- .../integ-acm-stack.template.json | 2 +- .../integ-cloudfront-stack.assets.json | 10 +- .../integ-cloudfront-stack.template.json | 2 +- .../manifest.json | 7 +- .../__entrypoint__.js | 0 .../index.js | 166 ++++++++++++++++++ .../index.js | 152 ---------------- .../integ.hosted-redirect.js.snapshot/cdk.out | 2 +- ...b732e39f9a17bfcca0bf8d20ce4f61.assets.json | 12 +- ...32e39f9a17bfcca0bf8d20ce4f61.template.json | 2 +- .../integ-https-redirect.assets.json | 12 +- .../integ-https-redirect.template.json | 2 +- .../integ.json | 2 +- ...efaultTestDeployAssert24D5C536.assets.json | 2 +- .../manifest.json | 9 +- .../tree.json | 8 +- .../cross-region-ssm-reader-handler/index.ts | 0 .../lib/core/types.ts | 47 +++++ .../custom-resource-handlers/package.json | 1 + .../cross-region-ssm-reader-handler.test.ts | 5 +- .../export-reader-provider.ts | 2 +- .../cross-region-export-providers/types.ts | 2 + 29 files changed, 431 insertions(+), 443 deletions(-) rename packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/{asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1 => asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760}/__entrypoint__.js (100%) create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760/index.js delete mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1/index.js delete mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf/index.js rename packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/{asset.863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf => asset.8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171}/__entrypoint__.js (100%) create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171/index.js rename packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/{asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1 => asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760}/__entrypoint__.js (100%) create mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760/index.js delete mode 100644 packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1/index.js rename packages/{aws-cdk-lib/core/lib/custom-resource-provider/cross-region-export-providers => @aws-cdk/custom-resource-handlers/lib/core}/cross-region-ssm-reader-handler/index.ts (100%) create mode 100644 packages/@aws-cdk/custom-resource-handlers/lib/core/types.ts rename packages/{aws-cdk-lib/core/test/custom-resource-provider => @aws-cdk/custom-resource-handlers/test/core}/cross-region-ssm-reader-handler.test.ts (96%) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1/__entrypoint__.js b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760/__entrypoint__.js similarity index 100% rename from packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1/__entrypoint__.js rename to packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760/__entrypoint__.js diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760/index.js b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760/index.js new file mode 100644 index 0000000000000..f417533f29944 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760/index.js @@ -0,0 +1,166 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.handler = void 0; +/*eslint-disable no-console*/ +/* eslint-disable import/no-extraneous-dependencies */ +const client_ssm_1 = require("@aws-sdk/client-ssm"); +async function handler(event) { + const props = event.ResourceProperties.WriterProps; + const exports = props.exports; + const ssm = new client_ssm_1.SSM({ region: props.region }); + try { + switch (event.RequestType) { + case 'Create': + console.info(`Creating new SSM Parameter exports in region ${props.region}`); + await throwIfAnyInUse(ssm, exports); + await putParameters(ssm, exports); + return; + case 'Update': + const oldProps = event.OldResourceProperties.WriterProps; + const oldExports = oldProps.exports; + const newExports = except(exports, oldExports); + // throw an error to fail the deployment if any export value is changing + const changedExports = changed(oldExports, exports); + if (changedExports.length > 0) { + throw new Error('Some exports have changed!\n' + changedExports.join('\n')); + } + // if we are removing any exports that are in use, then throw an + // error to fail the deployment + const removedExports = except(oldExports, exports); + await throwIfAnyInUse(ssm, removedExports); + // if the ones we are removing are not in use then delete them + const removedExportsNames = Object.keys(removedExports); + // this method will skip if no export names are to be deleted + await deleteParameters(ssm, removedExportsNames); + // also throw an error if we are creating a new export that already exists for some reason + await throwIfAnyInUse(ssm, newExports); + console.info(`Creating new SSM Parameter exports in region ${props.region}`); + await putParameters(ssm, newExports); + return; + case 'Delete': + // if any of the exports are currently in use then throw an error to fail + // the stack deletion. + await throwIfAnyInUse(ssm, exports); + // if none are in use then delete all of them + await deleteParameters(ssm, Object.keys(exports)); + return; + default: + return; + } + } + catch (e) { + console.error('Error processing event: ', e); + throw e; + } +} +exports.handler = handler; +; +/** + * Create parameters for existing exports + */ +async function putParameters(ssm, parameters) { + await Promise.all(Array.from(Object.entries(parameters), ([name, value]) => { + return ssm.putParameter({ + Name: name, + Value: value, + Type: 'String', + }); + })); +} +/** + * Delete parameters no longer in use. + * From https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_DeleteParameters.html there + * is a constraint on names. It must have size at least 1 and at most 10. + */ +async function deleteParameters(ssm, names) { + // max allowed by DeleteParameters api + const maxSize = 10; + // more testable if we delete in order + names.sort(); + for (let chunkStartIdx = 0; chunkStartIdx < names.length; chunkStartIdx += maxSize) { + const chunkOfNames = names.slice(chunkStartIdx, chunkStartIdx + maxSize); + // also observe minimum size constraint: Names parameter must have size at least 1 + if (chunkOfNames.length > 0) { + await ssm.deleteParameters({ + Names: chunkOfNames, + }); + } + } +} +/** + * Query for existing parameters that are in use + */ +async function throwIfAnyInUse(ssm, parameters) { + const tagResults = new Map(); + await Promise.all(Object.keys(parameters).map(async (name) => { + const result = await isInUse(ssm, name); + if (result.size > 0) { + tagResults.set(name, result); + } + })); + if (tagResults.size > 0) { + const message = Object.entries(tagResults) + .map((result) => `${result[0]} is in use by stack(s) ${result[1].join(' ')}`) + .join('\n'); + throw new Error(`Exports cannot be updated: \n${message}`); + } +} +/** + * Check if a parameter is in use + */ +async function isInUse(ssm, parameterName) { + const tagResults = new Set(); + try { + const result = await ssm.listTagsForResource({ + ResourceId: parameterName, + ResourceType: 'Parameter', + }); + result.TagList?.forEach(tag => { + const tagParts = tag.Key?.split(':') ?? []; + if (tagParts[0] === 'aws-cdk' && tagParts[1] === 'strong-ref') { + tagResults.add(tagParts[2]); + } + }); + } + catch (e) { + // an InvalidResourceId means that the parameter doesn't exist + // which we should ignore since that means it's not in use + if (e.name === 'InvalidResourceId') { + return new Set(); + } + throw e; + } + return tagResults; +} +/** + * Return only the items from source that do not exist in the filter + * + * @param source the source object to perform the filter on + * @param filter filter out items that exist in this object + * @returns any exports that don't exist in the filter + */ +function except(source, filter) { + return Object.keys(source) + .filter(key => (!filter.hasOwnProperty(key))) + .reduce((acc, curr) => { + acc[curr] = source[curr]; + return acc; + }, {}); +} +/** + * Return items that exist in both the the old parameters and the new parameters, + * but have different values + * + * @param oldParams the exports that existed previous to this execution + * @param newParams the exports for the current execution + * @returns any parameters that have different values + */ +function changed(oldParams, newParams) { + return Object.keys(oldParams) + .filter(key => (newParams.hasOwnProperty(key) && oldParams[key] !== newParams[key])) + .reduce((acc, curr) => { + acc.push(curr); + return acc; + }, []); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFDN0Isc0RBQXNEO0FBQ3RELG9EQUEwQztBQUduQyxLQUFLLFVBQVUsT0FBTyxDQUFDLEtBQWtEO0lBQzlFLE1BQU0sS0FBSyxHQUF3QixLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO0lBQ3hFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUE2QixDQUFDO0lBRXBELE1BQU0sR0FBRyxHQUFHLElBQUksZ0JBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5QyxJQUFJO1FBQ0YsUUFBUSxLQUFLLENBQUMsV0FBVyxFQUFFO1lBQ3pCLEtBQUssUUFBUTtnQkFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDN0UsTUFBTSxlQUFlLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2xDLE9BQU87WUFDVCxLQUFLLFFBQVE7Z0JBQ1gsTUFBTSxRQUFRLEdBQXdCLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUM7Z0JBQzlFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUE2QixDQUFDO2dCQUMxRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUUvQyx3RUFBd0U7Z0JBQ3hFLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3BELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLEdBQUUsY0FBYyxDQUFD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QUFFO1FBQ3RDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDZixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKmVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUqL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyBTU00gfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc3NtJztcbmltcG9ydCB7IENyb3NzUmVnaW9uRXhwb3J0cywgRXhwb3J0V3JpdGVyQ1JQcm9wcyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IEFXU0xhbWJkYS5DbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQpIHtcbiAgY29uc3QgcHJvcHM6IEV4cG9ydFdyaXRlckNSUHJvcHMgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuV3JpdGVyUHJvcHM7XG4gIGNvbnN0IGV4cG9ydHMgPSBwcm9wcy5leHBvcnRzIGFzIENyb3NzUmVnaW9uRXhwb3J0cztcblxuICBjb25zdCBzc20gPSBuZXcgU1NNKHsgcmVnaW9uOiBwcm9wcy5yZWdpb24gfSk7XG4gIHRyeSB7XG4gICAgc3dpdGNoIChldmVudC5SZXF1ZXN0VHlwZSkge1xuICAgICAgY2FzZSAnQ3JlYXRlJzpcbiAgICAgICAgY29uc29sZS5pbmZvKGBDcmVhdGluZyBuZXcgU1NNIFBhcmFtZXRlciBleHBvcnRzIGluIHJlZ2lvbiAke3Byb3BzLnJlZ2lvbn1gKTtcbiAgICAgICAgYXdhaXQgdGhyb3dJZkFueUluVXNlKHNzbSwgZXhwb3J0cyk7XG4gICAgICAgIGF3YWl0IHB1dFBhcmFtZXRlcnMoc3NtLCBleHBvcnRzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnVXBkYXRlJzpcbiAgICAgICAgY29uc3Qgb2xkUHJvcHM6IEV4cG9ydFdyaXRlckNSUHJvcHMgPSBldmVudC5PbGRSZXNvdXJjZVByb3BlcnRpZXMuV3JpdGVyUHJvcHM7XG4gICAgICAgIGNvbnN0IG9sZEV4cG9ydHMgPSBvbGRQcm9wcy5leHBvcnRzIGFzIENyb3NzUmVnaW9uRXhwb3J0cztcbiAgICAgICAgY29uc3QgbmV3RXhwb3J0cyA9IGV4Y2VwdChleHBvcnRzLCBvbGRFeHBvcnRzKTtcblxuICAgICAgICAvLyB0aHJvdyBhbiBlcnJvciB0byBmYWlsIHRoZSBkZXBsb3ltZW50IGlmIGFueSBleHBvcnQgdmFsdWUgaXMgY2hhbmdpbmdcbiAgICAgICAgY29uc3QgY2hhbmdlZEV4cG9ydHMgPSBjaGFuZ2VkKG9sZEV4cG9ydHMsIGV4cG9ydHMpO1xuICAgICAgICBpZiAoY2hhbmdlZEV4cG9ydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU29tZSBleHBvcnRzIGhhdmUgY2hhbmdlZCFcXG4nKyBjaGFuZ2VkRXhwb3J0cy5qb2luKCdcXG4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgd2UgYXJlIHJlbW92aW5nIGFueSBleHBvcnRzIHRoYXQgYXJlIGluIHVzZSwgdGhlbiB0aHJvdyBhblxuICAgICAgICAvLyBlcnJvciB0byBmYWlsIHRoZSBkZXBsb3ltZW50XG4gICAgICAgIGNvbnN0IHJlbW92ZWRFeHBvcnRzID0gZXhjZXB0KG9sZEV4cG9ydHMsIGV4cG9ydHMpO1xuICAgICAgICBhd2FpdCB0aHJvd0lmQW55SW5Vc2Uoc3NtLCByZW1vdmVkRXhwb3J0cyk7XG4gICAgICAgIC8vIGlmIHRoZSBvbmVzIHdlIGFyZSByZW1vdmluZyBhcmUgbm90IGluIHVzZSB0aGVuIGRlbGV0ZSB0aGVtXG4gICAgICAgIGNvbnN0IHJlbW92ZWRFeHBvcnRzTmFtZXMgPSBPYmplY3Qua2V5cyhyZW1vdmVkRXhwb3J0cyk7XG4gICAgICAgIC8vIHRoaXMgbWV0aG9kIHdpbGwgc2tpcCBpZiBubyBleHBvcnQgbmFtZXMgYXJlIHRvIGJlIGRlbGV0ZWRcbiAgICAgICAgYXdhaXQgZGVsZXRlUGFyYW1ldGVycyhzc20sIHJlbW92ZWRFeHBvcnRzTmFtZXMpO1xuXG4gICAgICAgIC8vIGFsc28gdGhyb3cgYW4gZXJyb3IgaWYgd2UgYXJlIGNyZWF0aW5nIGEgbmV3IGV4cG9ydCB0aGF0IGFscmVhZHkgZXhpc3RzIGZvciBzb21lIHJlYXNvblxuICAgICAgICBhd2FpdCB0aHJvd0lmQW55SW5Vc2Uoc3NtLCBuZXdFeHBvcnRzKTtcbiAgICAgICAgY29uc29sZS5pbmZvKGBDcmVhdGluZyBuZXcgU1NNIFBhcmFtZXRlciBleHBvcnRzIGluIHJlZ2lvbiAke3Byb3BzLnJlZ2lvbn1gKTtcbiAgICAgICAgYXdhaXQgcHV0UGFyYW1ldGVycyhzc20sIG5ld0V4cG9ydHMpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdEZWxldGUnOlxuICAgICAgICAvLyBpZiBhbnkgb2YgdGhlIGV4cG9ydHMgYXJlIGN1cnJlbnRseSBpbiB1c2UgdGhlbiB0aHJvdyBhbiBlcnJvciB0byBmYWlsXG4gICAgICAgIC8vIHRoZSBzdGFjayBkZWxldGlvbi5cbiAgICAgICAgYXdhaXQgdGhyb3dJZkFueUluVXNlKHNzbSwgZXhwb3J0cyk7XG4gICAgICAgIC8vIGlmIG5vbmUgYXJlIGluIHVzZSB0aGVuIGRlbGV0ZSBhbGwgb2YgdGhlbVxuICAgICAgICBhd2FpdCBkZWxldGVQYXJhbWV0ZXJzKHNzbSwgT2JqZWN0LmtleXMoZXhwb3J0cykpO1xuICAgICAgICByZXR1cm47XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgcHJvY2Vzc2luZyBldmVudDogJywgZSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGUgcGFyYW1ldGVycyBmb3IgZXhpc3RpbmcgZXhwb3J0c1xuICovXG5hc3luYyBmdW5jdGlvbiBwdXRQYXJhbWV0ZXJzKHNzbTogU1NNLCBwYXJhbWV0ZXJzOiBDcm9zc1JlZ2lvbkV4cG9ydHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKSwgKFtuYW1lLCB2YWx1ZV0pID0+IHtcbiAgICByZXR1cm4gc3NtLnB1dFBhcmFtZXRlcih7XG4gICAgICBOYW1lOiBuYW1lLFxuICAgICAgVmFsdWU6IHZhbHVlLFxuICAgICAgVHlwZTogJ1N0cmluZycsXG4gICAgfSk7XG4gIH0pKTtcbn1cblxuLyoqXG4gKiBEZWxldGUgcGFyYW1ldGVycyBubyBsb25nZXIgaW4gdXNlLlxuICogRnJvbSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc3lzdGVtcy1tYW5hZ2VyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVBhcmFtZXRlcnMuaHRtbCB0aGVyZVxuICogaXMgYSBjb25zdHJhaW50IG9uIG5hbWVzLiBJdCBtdXN0IGhhdmUgc2l6ZSBhdCBsZWFzdCAxIGFuZCBhdCBtb3N0IDEwLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVQYXJhbWV0ZXJzKHNzbTogU1NNLCBuYW1lczogc3RyaW5nW10pIHtcbiAgLy8gbWF4IGFsbG93ZWQgYnkgRGVsZXRlUGFyYW1ldGVycyBhcGlcbiAgY29uc3QgbWF4U2l6ZSA9IDEwO1xuICAvLyBtb3JlIHRlc3RhYmxlIGlmIHdlIGRlbGV0ZSBpbiBvcmRlclxuICBuYW1lcy5zb3J0KCk7XG4gIGZvciAobGV0IGNodW5rU3RhcnRJZHggPSAwOyBjaHVua1N0YXJ0SWR4IDwgbmFtZXMubGVuZ3RoOyBjaHVua1N0YXJ0SWR4ICs9IG1heFNpemUpIHtcbiAgICBjb25zdCBjaHVua09mTmFtZXMgPSBuYW1lcy5zbGljZShjaHVua1N0YXJ0SWR4LCBjaHVua1N0YXJ0SWR4ICsgbWF4U2l6ZSk7XG4gICAgLy8gYWxzbyBvYnNlcnZlIG1pbmltdW0gc2l6ZSBjb25zdHJhaW50OiBOYW1lcyBwYXJhbWV0ZXIgbXVzdCBoYXZlIHNpemUgYXQgbGVhc3QgMVxuICAgIGlmIChjaHVua09mTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgc3NtLmRlbGV0ZVBhcmFtZXRlcnMoe1xuICAgICAgICBOYW1lczogY2h1bmtPZk5hbWVzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUXVlcnkgZm9yIGV4aXN0aW5nIHBhcmFtZXRlcnMgdGhhdCBhcmUgaW4gdXNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRocm93SWZBbnlJblVzZShzc206IFNTTSwgcGFyYW1ldGVyczogQ3Jvc3NSZWdpb25FeHBvcnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHRhZ1Jlc3VsdHM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IG5ldyBNYXAoKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMocGFyYW1ldGVycykubWFwKGFzeW5jIChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpc0luVXNlKHNzbSwgbmFtZSk7XG4gICAgaWYgKHJlc3VsdC5zaXplID4gMCkge1xuICAgICAgdGFnUmVzdWx0cy5zZXQobmFtZSwgcmVzdWx0KTtcbiAgICB9XG4gIH0pKTtcblxuICBpZiAodGFnUmVzdWx0cy5zaXplID4gMCkge1xuICAgIGNvbnN0IG1lc3NhZ2U6IHN0cmluZyA9IE9iamVjdC5lbnRyaWVzKHRhZ1Jlc3VsdHMpXG4gICAgICAubWFwKChyZXN1bHQ6IFtzdHJpbmcsIHN0cmluZ1tdXSkgPT4gYCR7cmVzdWx0WzBdfSBpcyBpbiB1c2UgYnkgc3RhY2socykgJHtyZXN1bHRbMV0uam9pbignICcpfWApXG4gICAgICAuam9pbignXFxuJyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBvcnRzIGNhbm5vdCBiZSB1cGRhdGVkOiBcXG4ke21lc3NhZ2V9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHBhcmFtZXRlciBpcyBpbiB1c2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNJblVzZShzc206IFNTTSwgcGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICBjb25zdCB0YWdSZXN1bHRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzc20ubGlzdFRhZ3NGb3JSZXNvdXJjZSh7XG4gICAgICBSZXNvdXJjZUlkOiBwYXJhbWV0ZXJOYW1lLFxuICAgICAgUmVzb3VyY2VUeXBlOiAnUGFyYW1ldGVyJyxcbiAgICB9KTtcbiAgICByZXN1bHQuVGFnTGlzdD8uZm9yRWFjaCh0YWcgPT4ge1xuICAgICAgY29uc3QgdGFnUGFydHMgPSB0YWcuS2V5Py5zcGxpdCgnOicpID8/IFtdO1xuICAgICAgaWYgKHRhZ1BhcnRzWzBdID09PSAnYXdzLWNkaycgJiYgdGFnUGFydHNbMV0gPT09ICdzdHJvbmctcmVmJykge1xuICAgICAgICB0YWdSZXN1bHRzLmFkZCh0YWdQYXJ0c1syXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIC8vIGFuIEludmFsaWRSZXNvdXJjZUlkIG1lYW5zIHRoYXQgdGhlIHBhcmFtZXRlciBkb2Vzbid0IGV4aXN0XG4gICAgLy8gd2hpY2ggd2Ugc2hvdWxkIGlnbm9yZSBzaW5jZSB0aGF0IG1lYW5zIGl0J3Mgbm90IGluIHVzZVxuICAgIGlmIChlLm5hbWUgPT09ICdJbnZhbGlkUmVzb3VyY2VJZCcpIHtcbiAgICAgIHJldHVybiBuZXcgU2V0KCk7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbiAgcmV0dXJuIHRhZ1Jlc3VsdHM7XG59XG5cbi8qKlxuICogUmV0dXJuIG9ubHkgdGhlIGl0ZW1zIGZyb20gc291cmNlIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBmaWx0ZXJcbiAqXG4gKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugb2JqZWN0IHRvIHBlcmZvcm0gdGhlIGZpbHRlciBvblxuICogQHBhcmFtIGZpbHRlciBmaWx0ZXIgb3V0IGl0ZW1zIHRoYXQgZXhpc3QgaW4gdGhpcyBvYmplY3RcbiAqIEByZXR1cm5zIGFueSBleHBvcnRzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGZpbHRlclxuICovXG5mdW5jdGlvbiBleGNlcHQoc291cmNlOiBDcm9zc1JlZ2lvbkV4cG9ydHMsIGZpbHRlcjogQ3Jvc3NSZWdpb25FeHBvcnRzKTogQ3Jvc3NSZWdpb25FeHBvcnRzIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSlcbiAgICAuZmlsdGVyKGtleSA9PiAoIWZpbHRlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSlcbiAgICAucmVkdWNlKChhY2M6IENyb3NzUmVnaW9uRXhwb3J0cywgY3Vycjogc3RyaW5nKSA9PiB7XG4gICAgICBhY2NbY3Vycl0gPSBzb3VyY2VbY3Vycl07XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gaXRlbXMgdGhhdCBleGlzdCBpbiBib3RoIHRoZSB0aGUgb2xkIHBhcmFtZXRlcnMgYW5kIHRoZSBuZXcgcGFyYW1ldGVycyxcbiAqIGJ1dCBoYXZlIGRpZmZlcmVudCB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0gb2xkUGFyYW1zIHRoZSBleHBvcnRzIHRoYXQgZXhpc3RlZCBwcmV2aW91cyB0byB0aGlzIGV4ZWN1dGlvblxuICogQHBhcmFtIG5ld1BhcmFtcyB0aGUgZXhwb3J0cyBmb3IgdGhlIGN1cnJlbnQgZXhlY3V0aW9uXG4gKiBAcmV0dXJucyBhbnkgcGFyYW1ldGVycyB0aGF0IGhhdmUgZGlmZmVyZW50IHZhbHVlc1xuICovXG5mdW5jdGlvbiBjaGFuZ2VkKG9sZFBhcmFtczogQ3Jvc3NSZWdpb25FeHBvcnRzLCBuZXdQYXJhbXM6IENyb3NzUmVnaW9uRXhwb3J0cyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9sZFBhcmFtcylcbiAgICAuZmlsdGVyKGtleSA9PiAobmV3UGFyYW1zLmhhc093blByb3BlcnR5KGtleSkgJiYgb2xkUGFyYW1zW2tleV0gIT09IG5ld1BhcmFtc1trZXldKSlcbiAgICAucmVkdWNlKChhY2M6IHN0cmluZ1tdLCBjdXJyOiBzdHJpbmcpID0+IHtcbiAgICAgIGFjYy5wdXNoKGN1cnIpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG59XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1/index.js b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1/index.js deleted file mode 100644 index cee25eae388e1..0000000000000 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1/index.js +++ /dev/null @@ -1,152 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.handler = void 0; -/*eslint-disable no-console*/ -/* eslint-disable import/no-extraneous-dependencies */ -const client_ssm_1 = require("@aws-sdk/client-ssm"); -async function handler(event) { - const props = event.ResourceProperties.WriterProps; - const exports = props.exports; - const ssm = new client_ssm_1.SSM({ region: props.region }); - try { - switch (event.RequestType) { - case 'Create': - console.info(`Creating new SSM Parameter exports in region ${props.region}`); - await throwIfAnyInUse(ssm, exports); - await putParameters(ssm, exports); - return; - case 'Update': - const oldProps = event.OldResourceProperties.WriterProps; - const oldExports = oldProps.exports; - const newExports = except(exports, oldExports); - // throw an error to fail the deployment if any export value is changing - const changedExports = changed(oldExports, exports); - if (changedExports.length > 0) { - throw new Error('Some exports have changed!\n' + changedExports.join('\n')); - } - // if we are removing any exports that are in use, then throw an - // error to fail the deployment - const removedExports = except(oldExports, exports); - await throwIfAnyInUse(ssm, removedExports); - // if the ones we are removing are not in use then delete them - // skip if no export names are to be deleted - const removedExportsNames = Object.keys(removedExports); - if (removedExportsNames.length > 0) { - await ssm.deleteParameters({ - Names: removedExportsNames, - }); - } - // also throw an error if we are creating a new export that already exists for some reason - await throwIfAnyInUse(ssm, newExports); - console.info(`Creating new SSM Parameter exports in region ${props.region}`); - await putParameters(ssm, newExports); - return; - case 'Delete': - // if any of the exports are currently in use then throw an error to fail - // the stack deletion. - await throwIfAnyInUse(ssm, exports); - // if none are in use then delete all of them - await ssm.deleteParameters({ - Names: Object.keys(exports), - }); - return; - default: - return; - } - } - catch (e) { - console.error('Error processing event: ', e); - throw e; - } -} -exports.handler = handler; -; -/** - * Create parameters for existing exports - */ -async function putParameters(ssm, parameters) { - await Promise.all(Array.from(Object.entries(parameters), ([name, value]) => { - return ssm.putParameter({ - Name: name, - Value: value, - Type: 'String', - }); - })); -} -/** - * Query for existing parameters that are in use - */ -async function throwIfAnyInUse(ssm, parameters) { - const tagResults = new Map(); - await Promise.all(Object.keys(parameters).map(async (name) => { - const result = await isInUse(ssm, name); - if (result.size > 0) { - tagResults.set(name, result); - } - })); - if (tagResults.size > 0) { - const message = Object.entries(tagResults) - .map((result) => `${result[0]} is in use by stack(s) ${result[1].join(' ')}`) - .join('\n'); - throw new Error(`Exports cannot be updated: \n${message}`); - } -} -/** - * Check if a parameter is in use - */ -async function isInUse(ssm, parameterName) { - const tagResults = new Set(); - try { - const result = await ssm.listTagsForResource({ - ResourceId: parameterName, - ResourceType: 'Parameter', - }); - result.TagList?.forEach(tag => { - const tagParts = tag.Key?.split(':') ?? []; - if (tagParts[0] === 'aws-cdk' && tagParts[1] === 'strong-ref') { - tagResults.add(tagParts[2]); - } - }); - } - catch (e) { - // an InvalidResourceId means that the parameter doesn't exist - // which we should ignore since that means it's not in use - if (e.name === 'InvalidResourceId') { - return new Set(); - } - throw e; - } - return tagResults; -} -/** - * Return only the items from source that do not exist in the filter - * - * @param source the source object to perform the filter on - * @param filter filter out items that exist in this object - * @returns any exports that don't exist in the filter - */ -function except(source, filter) { - return Object.keys(source) - .filter(key => (!filter.hasOwnProperty(key))) - .reduce((acc, curr) => { - acc[curr] = source[curr]; - return acc; - }, {}); -} -/** - * Return items that exist in both the the old parameters and the new parameters, - * but have different values - * - * @param oldParams the exports that existed previous to this execution - * @param newParams the exports for the current execution - * @returns any parameters that have different values - */ -function changed(oldParams, newParams) { - return Object.keys(oldParams) - .filter(key => (newParams.hasOwnProperty(key) && oldParams[key] !== newParams[key])) - .reduce((acc, curr) => { - acc.push(curr); - return acc; - }, []); -} -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFDN0Isc0RBQXNEO0FBQ3RELG9EQUEwQztBQUduQyxLQUFLLFVBQVUsT0FBTyxDQUFDLEtBQWtEO0lBQzlFLE1BQU0sS0FBSyxHQUF3QixLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO0lBQ3hFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUE2QixDQUFDO0lBRXBELE1BQU0sR0FBRyxHQUFHLElBQUksZ0JBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5QyxJQUFJO1FBQ0YsUUFBUSxLQUFLLENBQUMsV0FBVyxFQUFFO1lBQ3pCLEtBQUssUUFBUTtnQkFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDN0UsTUFBTSxlQUFlLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2xDLE9BQU87WUFDVCxLQUFLLFFBQVE7Z0JBQ1gsTUFBTSxRQUFRLEdBQXdCLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUM7Z0JBQzlFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUE2QixDQUFDO2dCQUMxRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUUvQyx3RUFBd0U7Z0JBQ3hFLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3BELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLEdBQUUsY0FBYyxDQUFD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TUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDdkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM1QyxNQUFNLENBQUMsQ0FBQyxHQUF1QixFQUFFLElBQVksRUFBRSxFQUFFO1FBQ2hELEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsT0FBTyxDQUFDLFNBQTZCLEVBQUUsU0FBNkI7SUFDM0UsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUMxQixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ25GLE1BQU0sQ0FBQyxDQUFDLEdBQWEsRUFBRSxJQUFZLEVBQUUsRUFBRTtRQUN0QyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2YsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyplc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlKi9cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgU1NNIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNzbSc7XG5pbXBvcnQgeyBDcm9zc1JlZ2lvbkV4cG9ydHMsIEV4cG9ydFdyaXRlckNSUHJvcHMgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50OiBBV1NMYW1iZGEuQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUV2ZW50KSB7XG4gIGNvbnN0IHByb3BzOiBFeHBvcnRXcml0ZXJDUlByb3BzID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLldyaXRlclByb3BzO1xuICBjb25zdCBleHBvcnRzID0gcHJvcHMuZXhwb3J0cyBhcyBDcm9zc1JlZ2lvbkV4cG9ydHM7XG5cbiAgY29uc3Qgc3NtID0gbmV3IFNTTSh7IHJlZ2lvbjogcHJvcHMucmVnaW9uIH0pO1xuICB0cnkge1xuICAgIHN3aXRjaCAoZXZlbnQuUmVxdWVzdFR5cGUpIHtcbiAgICAgIGNhc2UgJ0NyZWF0ZSc6XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgQ3JlYXRpbmcgbmV3IFNTTSBQYXJhbWV0ZXIgZXhwb3J0cyBpbiByZWdpb24gJHtwcm9wcy5yZWdpb259YCk7XG4gICAgICAgIGF3YWl0IHRocm93SWZBbnlJblVzZShzc20sIGV4cG9ydHMpO1xuICAgICAgICBhd2FpdCBwdXRQYXJhbWV0ZXJzKHNzbSwgZXhwb3J0cyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgJ1VwZGF0ZSc6XG4gICAgICAgIGNvbnN0IG9sZFByb3BzOiBFeHBvcnRXcml0ZXJDUlByb3BzID0gZXZlbnQuT2xkUmVzb3VyY2VQcm9wZXJ0aWVzLldyaXRlclByb3BzO1xuICAgICAgICBjb25zdCBvbGRFeHBvcnRzID0gb2xkUHJvcHMuZXhwb3J0cyBhcyBDcm9zc1JlZ2lvbkV4cG9ydHM7XG4gICAgICAgIGNvbnN0IG5ld0V4cG9ydHMgPSBleGNlcHQoZXhwb3J0cywgb2xkRXhwb3J0cyk7XG5cbiAgICAgICAgLy8gdGhyb3cgYW4gZXJyb3IgdG8gZmFpbCB0aGUgZGVwbG95bWVudCBpZiBhbnkgZXhwb3J0IHZhbHVlIGlzIGNoYW5naW5nXG4gICAgICAgIGNvbnN0IGNoYW5nZWRFeHBvcnRzID0gY2hhbmdlZChvbGRFeHBvcnRzLCBleHBvcnRzKTtcbiAgICAgICAgaWYgKGNoYW5nZWRFeHBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvbWUgZXhwb3J0cyBoYXZlIGNoYW5nZWQhXFxuJysgY2hhbmdlZEV4cG9ydHMuam9pbignXFxuJykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHdlIGFyZSByZW1vdmluZyBhbnkgZXhwb3J0cyB0aGF0IGFyZSBpbiB1c2UsIHRoZW4gdGhyb3cgYW5cbiAgICAgICAgLy8gZXJyb3IgdG8gZmFpbCB0aGUgZGVwbG95bWVudFxuICAgICAgICBjb25zdCByZW1vdmVkRXhwb3J0cyA9IGV4Y2VwdChvbGRFeHBvcnRzLCBleHBvcnRzKTtcbiAgICAgICAgYXdhaXQgdGhyb3dJZkFueUluVXNlKHNzbSwgcmVtb3ZlZEV4cG9ydHMpO1xuICAgICAgICAvLyBpZiB0aGUgb25lcyB3ZSBhcmUgcmVtb3ZpbmcgYXJlIG5vdCBpbiB1c2UgdGhlbiBkZWxldGUgdGhlbVxuICAgICAgICAvLyBza2lwIGlmIG5vIGV4cG9ydCBuYW1lcyBhcmUgdG8gYmUgZGVsZXRlZFxuICAgICAgICBjb25zdCByZW1vdmVkRXhwb3J0c05hbWVzID0gT2JqZWN0LmtleXMocmVtb3ZlZEV4cG9ydHMpO1xuICAgICAgICBpZiAocmVtb3ZlZEV4cG9ydHNOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgc3NtLmRlbGV0ZVBhcmFtZXRlcnMoe1xuICAgICAgICAgICAgTmFtZXM6IHJlbW92ZWRFeHBvcnRzTmFtZXMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbHNvIHRocm93IGFuIGVycm9yIGlmIHdlIGFyZSBjcmVhdGluZyBhIG5ldyBleHBvcnQgdGhhdCBhbHJlYWR5IGV4aXN0cyBmb3Igc29tZSByZWFzb25cbiAgICAgICAgYXdhaXQgdGhyb3dJZkFueUluVXNlKHNzbSwgbmV3RXhwb3J0cyk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgQ3JlYXRpbmcgbmV3IFNTTSBQYXJhbWV0ZXIgZXhwb3J0cyBpbiByZWdpb24gJHtwcm9wcy5yZWdpb259YCk7XG4gICAgICAgIGF3YWl0IHB1dFBhcmFtZXRlcnMoc3NtLCBuZXdFeHBvcnRzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnRGVsZXRlJzpcbiAgICAgICAgLy8gaWYgYW55IG9mIHRoZSBleHBvcnRzIGFyZSBjdXJyZW50bHkgaW4gdXNlIHRoZW4gdGhyb3cgYW4gZXJyb3IgdG8gZmFpbFxuICAgICAgICAvLyB0aGUgc3RhY2sgZGVsZXRpb24uXG4gICAgICAgIGF3YWl0IHRocm93SWZBbnlJblVzZShzc20sIGV4cG9ydHMpO1xuICAgICAgICAvLyBpZiBub25lIGFyZSBpbiB1c2UgdGhlbiBkZWxldGUgYWxsIG9mIHRoZW1cbiAgICAgICAgYXdhaXQgc3NtLmRlbGV0ZVBhcmFtZXRlcnMoe1xuICAgICAgICAgIE5hbWVzOiBPYmplY3Qua2V5cyhleHBvcnRzKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIGV2ZW50OiAnLCBlKTtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZSBwYXJhbWV0ZXJzIGZvciBleGlzdGluZyBleHBvcnRzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1dFBhcmFtZXRlcnMoc3NtOiBTU00sIHBhcmFtZXRlcnM6IENyb3NzUmVnaW9uRXhwb3J0cyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKE9iamVjdC5lbnRyaWVzKHBhcmFtZXRlcnMpLCAoW25hbWUsIHZhbHVlXSkgPT4ge1xuICAgIHJldHVybiBzc20ucHV0UGFyYW1ldGVyKHtcbiAgICAgIE5hbWU6IG5hbWUsXG4gICAgICBWYWx1ZTogdmFsdWUsXG4gICAgICBUeXBlOiAnU3RyaW5nJyxcbiAgICB9KTtcbiAgfSkpO1xufVxuXG4vKipcbiAqIFF1ZXJ5IGZvciBleGlzdGluZyBwYXJhbWV0ZXJzIHRoYXQgYXJlIGluIHVzZVxuICovXG5hc3luYyBmdW5jdGlvbiB0aHJvd0lmQW55SW5Vc2Uoc3NtOiBTU00sIHBhcmFtZXRlcnM6IENyb3NzUmVnaW9uRXhwb3J0cyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0YWdSZXN1bHRzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4gPSBuZXcgTWFwKCk7XG4gIGF3YWl0IFByb21pc2UuYWxsKE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLm1hcChhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaXNJblVzZShzc20sIG5hbWUpO1xuICAgIGlmIChyZXN1bHQuc2l6ZSA+IDApIHtcbiAgICAgIHRhZ1Jlc3VsdHMuc2V0KG5hbWUsIHJlc3VsdCk7XG4gICAgfVxuICB9KSk7XG5cbiAgaWYgKHRhZ1Jlc3VsdHMuc2l6ZSA+IDApIHtcbiAgICBjb25zdCBtZXNzYWdlOiBzdHJpbmcgPSBPYmplY3QuZW50cmllcyh0YWdSZXN1bHRzKVxuICAgICAgLm1hcCgocmVzdWx0OiBbc3RyaW5nLCBzdHJpbmdbXV0pID0+IGAke3Jlc3VsdFswXX0gaXMgaW4gdXNlIGJ5IHN0YWNrKHMpICR7cmVzdWx0WzFdLmpvaW4oJyAnKX1gKVxuICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwb3J0cyBjYW5ub3QgYmUgdXBkYXRlZDogXFxuJHttZXNzYWdlfWApO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwYXJhbWV0ZXIgaXMgaW4gdXNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzSW5Vc2Uoc3NtOiBTU00sIHBhcmFtZXRlck5hbWU6IHN0cmluZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgdGFnUmVzdWx0czogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3NtLmxpc3RUYWdzRm9yUmVzb3VyY2Uoe1xuICAgICAgUmVzb3VyY2VJZDogcGFyYW1ldGVyTmFtZSxcbiAgICAgIFJlc291cmNlVHlwZTogJ1BhcmFtZXRlcicsXG4gICAgfSk7XG4gICAgcmVzdWx0LlRhZ0xpc3Q/LmZvckVhY2godGFnID0+IHtcbiAgICAgIGNvbnN0IHRhZ1BhcnRzID0gdGFnLktleT8uc3BsaXQoJzonKSA/PyBbXTtcbiAgICAgIGlmICh0YWdQYXJ0c1swXSA9PT0gJ2F3cy1jZGsnICYmIHRhZ1BhcnRzWzFdID09PSAnc3Ryb25nLXJlZicpIHtcbiAgICAgICAgdGFnUmVzdWx0cy5hZGQodGFnUGFydHNbMl0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAvLyBhbiBJbnZhbGlkUmVzb3VyY2VJZCBtZWFucyB0aGF0IHRoZSBwYXJhbWV0ZXIgZG9lc24ndCBleGlzdFxuICAgIC8vIHdoaWNoIHdlIHNob3VsZCBpZ25vcmUgc2luY2UgdGhhdCBtZWFucyBpdCdzIG5vdCBpbiB1c2VcbiAgICBpZiAoZS5uYW1lID09PSAnSW52YWxpZFJlc291cmNlSWQnKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCgpO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG4gIHJldHVybiB0YWdSZXN1bHRzO1xufVxuXG4vKipcbiAqIFJldHVybiBvbmx5IHRoZSBpdGVtcyBmcm9tIHNvdXJjZSB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgZmlsdGVyXG4gKlxuICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIG9iamVjdCB0byBwZXJmb3JtIHRoZSBmaWx0ZXIgb25cbiAqIEBwYXJhbSBmaWx0ZXIgZmlsdGVyIG91dCBpdGVtcyB0aGF0IGV4aXN0IGluIHRoaXMgb2JqZWN0XG4gKiBAcmV0dXJucyBhbnkgZXhwb3J0cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBmaWx0ZXJcbiAqL1xuZnVuY3Rpb24gZXhjZXB0KHNvdXJjZTogQ3Jvc3NSZWdpb25FeHBvcnRzLCBmaWx0ZXI6IENyb3NzUmVnaW9uRXhwb3J0cyk6IENyb3NzUmVnaW9uRXhwb3J0cyB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpXG4gICAgLmZpbHRlcihrZXkgPT4gKCFmaWx0ZXIuaGFzT3duUHJvcGVydHkoa2V5KSkpXG4gICAgLnJlZHVjZSgoYWNjOiBDcm9zc1JlZ2lvbkV4cG9ydHMsIGN1cnI6IHN0cmluZykgPT4ge1xuICAgICAgYWNjW2N1cnJdID0gc291cmNlW2N1cnJdO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5cbi8qKlxuICogUmV0dXJuIGl0ZW1zIHRoYXQgZXhpc3QgaW4gYm90aCB0aGUgdGhlIG9sZCBwYXJhbWV0ZXJzIGFuZCB0aGUgbmV3IHBhcmFtZXRlcnMsXG4gKiBidXQgaGF2ZSBkaWZmZXJlbnQgdmFsdWVzXG4gKlxuICogQHBhcmFtIG9sZFBhcmFtcyB0aGUgZXhwb3J0cyB0aGF0IGV4aXN0ZWQgcHJldmlvdXMgdG8gdGhpcyBleGVjdXRpb25cbiAqIEBwYXJhbSBuZXdQYXJhbXMgdGhlIGV4cG9ydHMgZm9yIHRoZSBjdXJyZW50IGV4ZWN1dGlvblxuICogQHJldHVybnMgYW55IHBhcmFtZXRlcnMgdGhhdCBoYXZlIGRpZmZlcmVudCB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gY2hhbmdlZChvbGRQYXJhbXM6IENyb3NzUmVnaW9uRXhwb3J0cywgbmV3UGFyYW1zOiBDcm9zc1JlZ2lvbkV4cG9ydHMpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvbGRQYXJhbXMpXG4gICAgLmZpbHRlcihrZXkgPT4gKG5ld1BhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIG9sZFBhcmFtc1trZXldICE9PSBuZXdQYXJhbXNba2V5XSkpXG4gICAgLnJlZHVjZSgoYWNjOiBzdHJpbmdbXSwgY3Vycjogc3RyaW5nKSA9PiB7XG4gICAgICBhY2MucHVzaChjdXJyKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xufVxuIl19 \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf/index.js b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf/index.js deleted file mode 100644 index 682718d9e7389..0000000000000 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf/index.js +++ /dev/null @@ -1,98 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.handler = void 0; -/*eslint-disable no-console*/ -/* eslint-disable import/no-extraneous-dependencies */ -const client_ssm_1 = require("@aws-sdk/client-ssm"); -async function handler(event) { - const props = event.ResourceProperties.ReaderProps; - const imports = props.imports; - const importNames = Object.keys(imports); - const keyName = `aws-cdk:strong-ref:${props.prefix}`; - const ssm = new client_ssm_1.SSM({ region: props.region }); - try { - switch (event.RequestType) { - case 'Create': - console.info('Tagging SSM Parameter imports'); - await addTags(ssm, importNames, keyName); - break; - case 'Update': - const oldProps = event.OldResourceProperties.ReaderProps; - const oldExports = oldProps.imports; - const newExports = except(importNames, Object.keys(oldExports)); - const paramsToRelease = except(Object.keys(oldExports), importNames); - console.info('Releasing unused SSM Parameter imports'); - if (Object.keys(paramsToRelease).length > 0) { - await removeTags(ssm, paramsToRelease, keyName); - } - console.info('Tagging new SSM Parameter imports'); - await addTags(ssm, newExports, keyName); - break; - case 'Delete': - console.info('Releasing all SSM Parameter exports by removing tags'); - await removeTags(ssm, importNames, keyName); - return; - } - } - catch (e) { - console.error('Error importing cross region stack exports: ', e); - throw e; - } - return { - Data: imports, - }; -} -exports.handler = handler; -; -/** - * Add tag to parameters for existing exports - */ -async function addTags(ssm, parameters, keyName) { - await Promise.all(parameters.map(async (name) => { - try { - return await ssm.addTagsToResource({ - ResourceId: name, - ResourceType: 'Parameter', - Tags: [{ - Key: keyName, - Value: 'true', - }], - }); - } - catch (e) { - throw new Error(`Error importing ${name}: ${e}`); - } - })); -} -/** - * Remove tags from parameters - */ -async function removeTags(ssm, parameters, keyName) { - await Promise.all(parameters.map(async (name) => { - try { - return await ssm.removeTagsFromResource({ - TagKeys: [keyName], - ResourceType: 'Parameter', - ResourceId: name, - }); - } - catch (e) { - if (e.name === 'InvalidResourceId') { - return; - } - else { - throw new Error(`Error releasing import ${name}: ${e}`); - } - } - })); -} -/** - * Return only the items from source that do not exist in the filter - * - * @param source the source object to perform the filter on - * @param filter filter out items that exist in this object - */ -function except(source, filter) { - return source.filter(key => !filter.includes(key)); -} -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFDN0Isc0RBQXNEO0FBQ3RELG9EQUEwQztBQUduQyxLQUFLLFVBQVUsT0FBTyxDQUFDLEtBQWtEO0lBQzlFLE1BQU0sS0FBSyxHQUF3QixLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO0lBQ3hFLE1BQU0sT0FBTyxHQUF1QixLQUFLLENBQUMsT0FBNkIsQ0FBQztJQUN4RSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUFXLHNCQUFzQixLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFFN0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxnQkFBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLElBQUk7UUFDRixRQUFRLEtBQUssQ0FBQyxXQUFXLEVBQUU7WUFDekIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsQ0FBQztnQkFDOUMsTUFBTSxPQUFPLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDekMsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxNQUFNLFFBQVEsR0FBd0IsS0FBSyxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQztnQkFDOUUsTUFBTSxVQUFVLEdBQXVCLFFBQVEsQ0FBQyxPQUE2QixDQUFDO2dCQUM5RSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDaEUsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ3JFLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzNDLE1BQU0sVUFBVSxDQUFDLEdBQUcsRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQ2pEO2dCQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxPQUFPLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDeEMsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLHNEQUFzRCxDQUFDLENBQUM7Z0JBQ3JFLE1BQU0sVUFBVSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzVDLE9BQU87U0FDVjtLQUNGO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixPQUFPLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sQ0FBQyxDQUFDO0tBQ1Q7SUFDRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLE9BQU87S0FDZCxDQUFDO0FBQ0osQ0FBQztBQXJDRCwwQkFxQ0M7QUFBQSxDQUFDO0FBRUY7O0dBRUc7QUFDSCxLQUFLLFVBQVUsT0FBTyxDQUFDLEdBQVEsRUFBRSxVQUFvQixFQUFFLE9BQWU7SUFDcEUsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxFQUFFO1FBQzVDLElBQUk7WUFDRixPQUFPLE1BQU0sR0FBRyxDQUFDLGlCQUFpQixDQUFDO2dCQUNqQyxVQUFVLEVBQUUsSUFBSTtnQkFDaEIsWUFBWSxFQUFFLFdBQVc7Z0JBQ3pCLElBQUksRUFBRSxDQUFDO3dCQUNMLEdBQUcsRUFBRSxPQUFPO3dCQUNaLEtBQUssRUFBRSxNQUFNO3FCQUNkLENBQUM7YUFDSCxDQUFDLENBQUM7U0FDSjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDbEQ7SUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLFVBQVUsQ0FBQyxHQUFRLEVBQUUsVUFBb0IsRUFBRSxPQUFlO0lBQ3ZFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBQyxJQUFJLEVBQUMsRUFBRTtRQUM1QyxJQUFJO1lBQ0YsT0FBTyxNQUFNLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztnQkFDdEMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDO2dCQUNsQixZQUFZLEVBQUUsV0FBVztnQkFDekIsVUFBVSxFQUFFLElBQUk7YUFDakIsQ0FBQyxDQUFDO1NBQ0o7UUFBQyxPQUFPLENBQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxtQkFBbUIsRUFBRTtnQkFDbEMsT0FBTzthQUNSO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3pEO1NBQ0Y7SUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxNQUFNLENBQUMsTUFBZ0IsRUFBRSxNQUFnQjtJQUNoRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyplc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlKi9cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgU1NNIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNzbSc7XG5pbXBvcnQgeyBFeHBvcnRSZWFkZXJDUlByb3BzLCBDcm9zc1JlZ2lvbkV4cG9ydHMgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50OiBBV1NMYW1iZGEuQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUV2ZW50KSB7XG4gIGNvbnN0IHByb3BzOiBFeHBvcnRSZWFkZXJDUlByb3BzID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLlJlYWRlclByb3BzO1xuICBjb25zdCBpbXBvcnRzOiBDcm9zc1JlZ2lvbkV4cG9ydHMgPSBwcm9wcy5pbXBvcnRzIGFzIENyb3NzUmVnaW9uRXhwb3J0cztcbiAgY29uc3QgaW1wb3J0TmFtZXMgPSBPYmplY3Qua2V5cyhpbXBvcnRzKTtcbiAgY29uc3Qga2V5TmFtZTogc3RyaW5nID0gYGF3cy1jZGs6c3Ryb25nLXJlZjoke3Byb3BzLnByZWZpeH1gO1xuXG4gIGNvbnN0IHNzbSA9IG5ldyBTU00oeyByZWdpb246IHByb3BzLnJlZ2lvbiB9KTtcbiAgdHJ5IHtcbiAgICBzd2l0Y2ggKGV2ZW50LlJlcXVlc3RUeXBlKSB7XG4gICAgICBjYXNlICdDcmVhdGUnOlxuICAgICAgICBjb25zb2xlLmluZm8oJ1RhZ2dpbmcgU1NNIFBhcmFtZXRlciBpbXBvcnRzJyk7XG4gICAgICAgIGF3YWl0IGFkZFRhZ3Moc3NtLCBpbXBvcnROYW1lcywga2V5TmFtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVXBkYXRlJzpcbiAgICAgICAgY29uc3Qgb2xkUHJvcHM6IEV4cG9ydFJlYWRlckNSUHJvcHMgPSBldmVudC5PbGRSZXNvdXJjZVByb3BlcnRpZXMuUmVhZGVyUHJvcHM7XG4gICAgICAgIGNvbnN0IG9sZEV4cG9ydHM6IENyb3NzUmVnaW9uRXhwb3J0cyA9IG9sZFByb3BzLmltcG9ydHMgYXMgQ3Jvc3NSZWdpb25FeHBvcnRzO1xuICAgICAgICBjb25zdCBuZXdFeHBvcnRzID0gZXhjZXB0KGltcG9ydE5hbWVzLCBPYmplY3Qua2V5cyhvbGRFeHBvcnRzKSk7XG4gICAgICAgIGNvbnN0IHBhcmFtc1RvUmVsZWFzZSA9IGV4Y2VwdChPYmplY3Qua2V5cyhvbGRFeHBvcnRzKSwgaW1wb3J0TmFtZXMpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ1JlbGVhc2luZyB1bnVzZWQgU1NNIFBhcmFtZXRlciBpbXBvcnRzJyk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhwYXJhbXNUb1JlbGVhc2UpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCByZW1vdmVUYWdzKHNzbSwgcGFyYW1zVG9SZWxlYXNlLCBrZXlOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmluZm8oJ1RhZ2dpbmcgbmV3IFNTTSBQYXJhbWV0ZXIgaW1wb3J0cycpO1xuICAgICAgICBhd2FpdCBhZGRUYWdzKHNzbSwgbmV3RXhwb3J0cywga2V5TmFtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRGVsZXRlJzpcbiAgICAgICAgY29uc29sZS5pbmZvKCdSZWxlYXNpbmcgYWxsIFNTTSBQYXJhbWV0ZXIgZXhwb3J0cyBieSByZW1vdmluZyB0YWdzJyk7XG4gICAgICAgIGF3YWl0IHJlbW92ZVRhZ3Moc3NtLCBpbXBvcnROYW1lcywga2V5TmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbXBvcnRpbmcgY3Jvc3MgcmVnaW9uIHN0YWNrIGV4cG9ydHM6ICcsIGUpO1xuICAgIHRocm93IGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBEYXRhOiBpbXBvcnRzLFxuICB9O1xufTtcblxuLyoqXG4gKiBBZGQgdGFnIHRvIHBhcmFtZXRlcnMgZm9yIGV4aXN0aW5nIGV4cG9ydHNcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRkVGFncyhzc206IFNTTSwgcGFyYW1ldGVyczogc3RyaW5nW10sIGtleU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBQcm9taXNlLmFsbChwYXJhbWV0ZXJzLm1hcChhc3luYyBuYW1lID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHNzbS5hZGRUYWdzVG9SZXNvdXJjZSh7XG4gICAgICAgIFJlc291cmNlSWQ6IG5hbWUsXG4gICAgICAgIFJlc291cmNlVHlwZTogJ1BhcmFtZXRlcicsXG4gICAgICAgIFRhZ3M6IFt7XG4gICAgICAgICAgS2V5OiBrZXlOYW1lLFxuICAgICAgICAgIFZhbHVlOiAndHJ1ZScsXG4gICAgICAgIH1dLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbXBvcnRpbmcgJHtuYW1lfTogJHtlfWApO1xuICAgIH1cbiAgfSkpO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0YWdzIGZyb20gcGFyYW1ldGVyc1xuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdmVUYWdzKHNzbTogU1NNLCBwYXJhbWV0ZXJzOiBzdHJpbmdbXSwga2V5TmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IFByb21pc2UuYWxsKHBhcmFtZXRlcnMubWFwKGFzeW5jIG5hbWUgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgc3NtLnJlbW92ZVRhZ3NGcm9tUmVzb3VyY2Uoe1xuICAgICAgICBUYWdLZXlzOiBba2V5TmFtZV0sXG4gICAgICAgIFJlc291cmNlVHlwZTogJ1BhcmFtZXRlcicsXG4gICAgICAgIFJlc291cmNlSWQ6IG5hbWUsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmIChlLm5hbWUgPT09ICdJbnZhbGlkUmVzb3VyY2VJZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciByZWxlYXNpbmcgaW1wb3J0ICR7bmFtZX06ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gb25seSB0aGUgaXRlbXMgZnJvbSBzb3VyY2UgdGhhdCBkbyBub3QgZXhpc3QgaW4gdGhlIGZpbHRlclxuICpcbiAqIEBwYXJhbSBzb3VyY2UgdGhlIHNvdXJjZSBvYmplY3QgdG8gcGVyZm9ybSB0aGUgZmlsdGVyIG9uXG4gKiBAcGFyYW0gZmlsdGVyIGZpbHRlciBvdXQgaXRlbXMgdGhhdCBleGlzdCBpbiB0aGlzIG9iamVjdFxuICovXG5mdW5jdGlvbiBleGNlcHQoc291cmNlOiBzdHJpbmdbXSwgZmlsdGVyOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHNvdXJjZS5maWx0ZXIoa2V5ID0+ICFmaWx0ZXIuaW5jbHVkZXMoa2V5KSk7XG59XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf/__entrypoint__.js b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171/__entrypoint__.js similarity index 100% rename from packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf/__entrypoint__.js rename to packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171/__entrypoint__.js diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171/index.js b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171/index.js new file mode 100644 index 0000000000000..94e48037691c6 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/asset.8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171/index.js @@ -0,0 +1 @@ +"use strict";var i=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var P=Object.prototype.hasOwnProperty;var w=(e,r)=>{for(var s in r)i(e,s,{get:r[s],enumerable:!0})},E=(e,r,s,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of y(r))!P.call(e,o)&&o!==s&&i(e,o,{get:()=>r[o],enumerable:!(t=d(r,o))||t.enumerable});return e};var f=e=>E(i({},"__esModule",{value:!0}),e);var S={};w(S,{handler:()=>x});module.exports=f(S);var u=require("@aws-sdk/client-ssm");async function x(e){let r=e.ResourceProperties.ReaderProps,s=r.imports,t=Object.keys(s),o=`aws-cdk:strong-ref:${r.prefix}`,a=new u.SSM({region:r.region});try{switch(e.RequestType){case"Create":console.info("Tagging SSM Parameter imports"),await g(a,t,o);break;case"Update":let c=e.OldResourceProperties.ReaderProps.imports,R=l(t,Object.keys(c)),p=l(Object.keys(c),t);console.info("Releasing unused SSM Parameter imports"),Object.keys(p).length>0&&await m(a,p,o),console.info("Tagging new SSM Parameter imports"),await g(a,R,o);break;case"Delete":console.info("Releasing all SSM Parameter exports by removing tags"),await m(a,t,o);return}}catch(n){throw console.error("Error importing cross region stack exports: ",n),n}return{Data:s}}async function g(e,r,s){await Promise.all(r.map(async t=>{try{return await e.addTagsToResource({ResourceId:t,ResourceType:"Parameter",Tags:[{Key:s,Value:"true"}]})}catch(o){throw new Error(`Error importing ${t}: ${o}`)}}))}async function m(e,r,s){await Promise.all(r.map(async t=>{try{return await e.removeTagsFromResource({TagKeys:[s],ResourceType:"Parameter",ResourceId:t})}catch(o){if(o.name==="InvalidResourceId")return;throw new Error(`Error releasing import ${t}: ${o}`)}}))}function l(e,r){return e.filter(s=>!r.includes(s))}0&&(module.exports={handler}); diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-acm-stack.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-acm-stack.assets.json index 2e3da9d1ea00d..263fce4024aac 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-acm-stack.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-acm-stack.assets.json @@ -1,21 +1,21 @@ { "version": "34.0.0", "files": { - "1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1": { + "0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760": { "source": { - "path": "asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1", + "path": "asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760", "packaging": "zip" }, "destinations": { "12345678-us-east-1": { "bucketName": "cdk-hnb659fds-assets-12345678-us-east-1", - "objectKey": "1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1.zip", + "objectKey": "0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760.zip", "region": "us-east-1", "assumeRoleArn": "arn:${AWS::Partition}:iam::12345678:role/cdk-hnb659fds-file-publishing-role-12345678-us-east-1" } } }, - "efad6aa3c8e76bd538291e5c612628a1f72ac8f64ad028b8dd511355d7c2bc2c": { + "75f3bf9761d2c2cc675ecb13430c72ab5f2331be49677a7d67543e58a55633df": { "source": { "path": "integ-acm-stack.template.json", "packaging": "file" @@ -23,7 +23,7 @@ "destinations": { "12345678-us-east-1": { "bucketName": "cdk-hnb659fds-assets-12345678-us-east-1", - "objectKey": "efad6aa3c8e76bd538291e5c612628a1f72ac8f64ad028b8dd511355d7c2bc2c.json", + "objectKey": "75f3bf9761d2c2cc675ecb13430c72ab5f2331be49677a7d67543e58a55633df.json", "region": "us-east-1", "assumeRoleArn": "arn:${AWS::Partition}:iam::12345678:role/cdk-hnb659fds-file-publishing-role-12345678-us-east-1" } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-acm-stack.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-acm-stack.template.json index abc5b3c574f53..4a9de1d330ca9 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-acm-stack.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-acm-stack.template.json @@ -89,7 +89,7 @@ "Properties": { "Code": { "S3Bucket": "cdk-hnb659fds-assets-12345678-us-east-1", - "S3Key": "1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1.zip" + "S3Key": "0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-cloudfront-stack.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-cloudfront-stack.assets.json index d66663a14e627..dfd0d68829092 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-cloudfront-stack.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-cloudfront-stack.assets.json @@ -1,21 +1,21 @@ { "version": "34.0.0", "files": { - "863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf": { + "8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171": { "source": { - "path": "asset.863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf", + "path": "asset.8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171", "packaging": "zip" }, "destinations": { "12345678-us-east-2": { "bucketName": "cdk-hnb659fds-assets-12345678-us-east-2", - "objectKey": "863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf.zip", + "objectKey": "8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171.zip", "region": "us-east-2", "assumeRoleArn": "arn:${AWS::Partition}:iam::12345678:role/cdk-hnb659fds-file-publishing-role-12345678-us-east-2" } } }, - "857571408e56e517eab531d1ac48b3089e0c6ae2c186020ce7ae3cfea6038f74": { + "9517fbc3e55d40e02383f297ccdf11917414cc7dfc5c38b3422c4b7eb6bb81ed": { "source": { "path": "integ-cloudfront-stack.template.json", "packaging": "file" @@ -23,7 +23,7 @@ "destinations": { "12345678-us-east-2": { "bucketName": "cdk-hnb659fds-assets-12345678-us-east-2", - "objectKey": "857571408e56e517eab531d1ac48b3089e0c6ae2c186020ce7ae3cfea6038f74.json", + "objectKey": "9517fbc3e55d40e02383f297ccdf11917414cc7dfc5c38b3422c4b7eb6bb81ed.json", "region": "us-east-2", "assumeRoleArn": "arn:${AWS::Partition}:iam::12345678:role/cdk-hnb659fds-file-publishing-role-12345678-us-east-2" } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-cloudfront-stack.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-cloudfront-stack.template.json index c3bd08bf5fc1f..dbbd7fb59b074 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-cloudfront-stack.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/integ-cloudfront-stack.template.json @@ -104,7 +104,7 @@ "Properties": { "Code": { "S3Bucket": "cdk-hnb659fds-assets-12345678-us-east-2", - "S3Key": "863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf.zip" + "S3Key": "8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/manifest.json index 9e7fd98b4da5f..db191243b7bfa 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudfront/test/integ.cloudfront-cross-region-cert.js.snapshot/manifest.json @@ -14,10 +14,11 @@ "environment": "aws://12345678/us-east-1", "properties": { "templateFile": "integ-acm-stack.template.json", + "terminationProtection": false, "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::12345678:role/cdk-hnb659fds-deploy-role-12345678-us-east-1", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::12345678:role/cdk-hnb659fds-cfn-exec-role-12345678-us-east-1", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-12345678-us-east-1/efad6aa3c8e76bd538291e5c612628a1f72ac8f64ad028b8dd511355d7c2bc2c.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-12345678-us-east-1/75f3bf9761d2c2cc675ecb13430c72ab5f2331be49677a7d67543e58a55633df.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -85,10 +86,11 @@ "environment": "aws://12345678/us-east-2", "properties": { "templateFile": "integ-cloudfront-stack.template.json", + "terminationProtection": false, "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::12345678:role/cdk-hnb659fds-deploy-role-12345678-us-east-2", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::12345678:role/cdk-hnb659fds-cfn-exec-role-12345678-us-east-2", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-12345678-us-east-2/857571408e56e517eab531d1ac48b3089e0c6ae2c186020ce7ae3cfea6038f74.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-12345678-us-east-2/9517fbc3e55d40e02383f297ccdf11917414cc7dfc5c38b3422c4b7eb6bb81ed.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -157,6 +159,7 @@ "environment": "aws://unknown-account/unknown-region", "properties": { "templateFile": "integcloudfrontcrossregionacmDefaultTestDeployAssertD48673AA.template.json", + "terminationProtection": false, "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1/__entrypoint__.js b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760/__entrypoint__.js similarity index 100% rename from packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1/__entrypoint__.js rename to packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760/__entrypoint__.js diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760/index.js b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760/index.js new file mode 100644 index 0000000000000..f417533f29944 --- /dev/null +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760/index.js @@ -0,0 +1,166 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.handler = void 0; +/*eslint-disable no-console*/ +/* eslint-disable import/no-extraneous-dependencies */ +const client_ssm_1 = require("@aws-sdk/client-ssm"); +async function handler(event) { + const props = event.ResourceProperties.WriterProps; + const exports = props.exports; + const ssm = new client_ssm_1.SSM({ region: props.region }); + try { + switch (event.RequestType) { + case 'Create': + console.info(`Creating new SSM Parameter exports in region ${props.region}`); + await throwIfAnyInUse(ssm, exports); + await putParameters(ssm, exports); + return; + case 'Update': + const oldProps = event.OldResourceProperties.WriterProps; + const oldExports = oldProps.exports; + const newExports = except(exports, oldExports); + // throw an error to fail the deployment if any export value is changing + const changedExports = changed(oldExports, exports); + if (changedExports.length > 0) { + throw new Error('Some exports have changed!\n' + changedExports.join('\n')); + } + // if we are removing any exports that are in use, then throw an + // error to fail the deployment + const removedExports = except(oldExports, exports); + await throwIfAnyInUse(ssm, removedExports); + // if the ones we are removing are not in use then delete them + const removedExportsNames = Object.keys(removedExports); + // this method will skip if no export names are to be deleted + await deleteParameters(ssm, removedExportsNames); + // also throw an error if we are creating a new export that already exists for some reason + await throwIfAnyInUse(ssm, newExports); + console.info(`Creating new SSM Parameter exports in region ${props.region}`); + await putParameters(ssm, newExports); + return; + case 'Delete': + // if any of the exports are currently in use then throw an error to fail + // the stack deletion. + await throwIfAnyInUse(ssm, exports); + // if none are in use then delete all of them + await deleteParameters(ssm, Object.keys(exports)); + return; + default: + return; + } + } + catch (e) { + console.error('Error processing event: ', e); + throw e; + } +} +exports.handler = handler; +; +/** + * Create parameters for existing exports + */ +async function putParameters(ssm, parameters) { + await Promise.all(Array.from(Object.entries(parameters), ([name, value]) => { + return ssm.putParameter({ + Name: name, + Value: value, + Type: 'String', + }); + })); +} +/** + * Delete parameters no longer in use. + * From https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_DeleteParameters.html there + * is a constraint on names. It must have size at least 1 and at most 10. + */ +async function deleteParameters(ssm, names) { + // max allowed by DeleteParameters api + const maxSize = 10; + // more testable if we delete in order + names.sort(); + for (let chunkStartIdx = 0; chunkStartIdx < names.length; chunkStartIdx += maxSize) { + const chunkOfNames = names.slice(chunkStartIdx, chunkStartIdx + maxSize); + // also observe minimum size constraint: Names parameter must have size at least 1 + if (chunkOfNames.length > 0) { + await ssm.deleteParameters({ + Names: chunkOfNames, + }); + } + } +} +/** + * Query for existing parameters that are in use + */ +async function throwIfAnyInUse(ssm, parameters) { + const tagResults = new Map(); + await Promise.all(Object.keys(parameters).map(async (name) => { + const result = await isInUse(ssm, name); + if (result.size > 0) { + tagResults.set(name, result); + } + })); + if (tagResults.size > 0) { + const message = Object.entries(tagResults) + .map((result) => `${result[0]} is in use by stack(s) ${result[1].join(' ')}`) + .join('\n'); + throw new Error(`Exports cannot be updated: \n${message}`); + } +} +/** + * Check if a parameter is in use + */ +async function isInUse(ssm, parameterName) { + const tagResults = new Set(); + try { + const result = await ssm.listTagsForResource({ + ResourceId: parameterName, + ResourceType: 'Parameter', + }); + result.TagList?.forEach(tag => { + const tagParts = tag.Key?.split(':') ?? []; + if (tagParts[0] === 'aws-cdk' && tagParts[1] === 'strong-ref') { + tagResults.add(tagParts[2]); + } + }); + } + catch (e) { + // an InvalidResourceId means that the parameter doesn't exist + // which we should ignore since that means it's not in use + if (e.name === 'InvalidResourceId') { + return new Set(); + } + throw e; + } + return tagResults; +} +/** + * Return only the items from source that do not exist in the filter + * + * @param source the source object to perform the filter on + * @param filter filter out items that exist in this object + * @returns any exports that don't exist in the filter + */ +function except(source, filter) { + return Object.keys(source) + .filter(key => (!filter.hasOwnProperty(key))) + .reduce((acc, curr) => { + acc[curr] = source[curr]; + return acc; + }, {}); +} +/** + * Return items that exist in both the the old parameters and the new parameters, + * but have different values + * + * @param oldParams the exports that existed previous to this execution + * @param newParams the exports for the current execution + * @returns any parameters that have different values + */ +function changed(oldParams, newParams) { + return Object.keys(oldParams) + .filter(key => (newParams.hasOwnProperty(key) && oldParams[key] !== newParams[key])) + .reduce((acc, curr) => { + acc.push(curr); + return acc; + }, []); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFDN0Isc0RBQXNEO0FBQ3RELG9EQUEwQztBQUduQyxLQUFLLFVBQVUsT0FBTyxDQUFDLEtBQWtEO0lBQzlFLE1BQU0sS0FBSyxHQUF3QixLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO0lBQ3hFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUE2QixDQUFDO0lBRXBELE1BQU0sR0FBRyxHQUFHLElBQUksZ0JBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5QyxJQUFJO1FBQ0YsUUFBUSxLQUFLLENBQUMsV0FBVyxFQUFFO1lBQ3pCLEtBQUssUUFBUTtnQkFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDN0UsTUFBTSxlQUFlLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2xDLE9BQU87WUFDVCxLQUFLLFFBQVE7Z0JBQ1gsTUFBTSxRQUFRLEdBQXdCLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUM7Z0JBQzlFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUE2QixDQUFDO2dCQUMxRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUUvQyx3RUFBd0U7Z0JBQ3hFLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3BELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLEdBQUUsY0FBYyxDQUFD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QUFFO1FBQ3RDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDZixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKmVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUqL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyBTU00gfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc3NtJztcbmltcG9ydCB7IENyb3NzUmVnaW9uRXhwb3J0cywgRXhwb3J0V3JpdGVyQ1JQcm9wcyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IEFXU0xhbWJkYS5DbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQpIHtcbiAgY29uc3QgcHJvcHM6IEV4cG9ydFdyaXRlckNSUHJvcHMgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuV3JpdGVyUHJvcHM7XG4gIGNvbnN0IGV4cG9ydHMgPSBwcm9wcy5leHBvcnRzIGFzIENyb3NzUmVnaW9uRXhwb3J0cztcblxuICBjb25zdCBzc20gPSBuZXcgU1NNKHsgcmVnaW9uOiBwcm9wcy5yZWdpb24gfSk7XG4gIHRyeSB7XG4gICAgc3dpdGNoIChldmVudC5SZXF1ZXN0VHlwZSkge1xuICAgICAgY2FzZSAnQ3JlYXRlJzpcbiAgICAgICAgY29uc29sZS5pbmZvKGBDcmVhdGluZyBuZXcgU1NNIFBhcmFtZXRlciBleHBvcnRzIGluIHJlZ2lvbiAke3Byb3BzLnJlZ2lvbn1gKTtcbiAgICAgICAgYXdhaXQgdGhyb3dJZkFueUluVXNlKHNzbSwgZXhwb3J0cyk7XG4gICAgICAgIGF3YWl0IHB1dFBhcmFtZXRlcnMoc3NtLCBleHBvcnRzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnVXBkYXRlJzpcbiAgICAgICAgY29uc3Qgb2xkUHJvcHM6IEV4cG9ydFdyaXRlckNSUHJvcHMgPSBldmVudC5PbGRSZXNvdXJjZVByb3BlcnRpZXMuV3JpdGVyUHJvcHM7XG4gICAgICAgIGNvbnN0IG9sZEV4cG9ydHMgPSBvbGRQcm9wcy5leHBvcnRzIGFzIENyb3NzUmVnaW9uRXhwb3J0cztcbiAgICAgICAgY29uc3QgbmV3RXhwb3J0cyA9IGV4Y2VwdChleHBvcnRzLCBvbGRFeHBvcnRzKTtcblxuICAgICAgICAvLyB0aHJvdyBhbiBlcnJvciB0byBmYWlsIHRoZSBkZXBsb3ltZW50IGlmIGFueSBleHBvcnQgdmFsdWUgaXMgY2hhbmdpbmdcbiAgICAgICAgY29uc3QgY2hhbmdlZEV4cG9ydHMgPSBjaGFuZ2VkKG9sZEV4cG9ydHMsIGV4cG9ydHMpO1xuICAgICAgICBpZiAoY2hhbmdlZEV4cG9ydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU29tZSBleHBvcnRzIGhhdmUgY2hhbmdlZCFcXG4nKyBjaGFuZ2VkRXhwb3J0cy5qb2luKCdcXG4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgd2UgYXJlIHJlbW92aW5nIGFueSBleHBvcnRzIHRoYXQgYXJlIGluIHVzZSwgdGhlbiB0aHJvdyBhblxuICAgICAgICAvLyBlcnJvciB0byBmYWlsIHRoZSBkZXBsb3ltZW50XG4gICAgICAgIGNvbnN0IHJlbW92ZWRFeHBvcnRzID0gZXhjZXB0KG9sZEV4cG9ydHMsIGV4cG9ydHMpO1xuICAgICAgICBhd2FpdCB0aHJvd0lmQW55SW5Vc2Uoc3NtLCByZW1vdmVkRXhwb3J0cyk7XG4gICAgICAgIC8vIGlmIHRoZSBvbmVzIHdlIGFyZSByZW1vdmluZyBhcmUgbm90IGluIHVzZSB0aGVuIGRlbGV0ZSB0aGVtXG4gICAgICAgIGNvbnN0IHJlbW92ZWRFeHBvcnRzTmFtZXMgPSBPYmplY3Qua2V5cyhyZW1vdmVkRXhwb3J0cyk7XG4gICAgICAgIC8vIHRoaXMgbWV0aG9kIHdpbGwgc2tpcCBpZiBubyBleHBvcnQgbmFtZXMgYXJlIHRvIGJlIGRlbGV0ZWRcbiAgICAgICAgYXdhaXQgZGVsZXRlUGFyYW1ldGVycyhzc20sIHJlbW92ZWRFeHBvcnRzTmFtZXMpO1xuXG4gICAgICAgIC8vIGFsc28gdGhyb3cgYW4gZXJyb3IgaWYgd2UgYXJlIGNyZWF0aW5nIGEgbmV3IGV4cG9ydCB0aGF0IGFscmVhZHkgZXhpc3RzIGZvciBzb21lIHJlYXNvblxuICAgICAgICBhd2FpdCB0aHJvd0lmQW55SW5Vc2Uoc3NtLCBuZXdFeHBvcnRzKTtcbiAgICAgICAgY29uc29sZS5pbmZvKGBDcmVhdGluZyBuZXcgU1NNIFBhcmFtZXRlciBleHBvcnRzIGluIHJlZ2lvbiAke3Byb3BzLnJlZ2lvbn1gKTtcbiAgICAgICAgYXdhaXQgcHV0UGFyYW1ldGVycyhzc20sIG5ld0V4cG9ydHMpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdEZWxldGUnOlxuICAgICAgICAvLyBpZiBhbnkgb2YgdGhlIGV4cG9ydHMgYXJlIGN1cnJlbnRseSBpbiB1c2UgdGhlbiB0aHJvdyBhbiBlcnJvciB0byBmYWlsXG4gICAgICAgIC8vIHRoZSBzdGFjayBkZWxldGlvbi5cbiAgICAgICAgYXdhaXQgdGhyb3dJZkFueUluVXNlKHNzbSwgZXhwb3J0cyk7XG4gICAgICAgIC8vIGlmIG5vbmUgYXJlIGluIHVzZSB0aGVuIGRlbGV0ZSBhbGwgb2YgdGhlbVxuICAgICAgICBhd2FpdCBkZWxldGVQYXJhbWV0ZXJzKHNzbSwgT2JqZWN0LmtleXMoZXhwb3J0cykpO1xuICAgICAgICByZXR1cm47XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgcHJvY2Vzc2luZyBldmVudDogJywgZSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGUgcGFyYW1ldGVycyBmb3IgZXhpc3RpbmcgZXhwb3J0c1xuICovXG5hc3luYyBmdW5jdGlvbiBwdXRQYXJhbWV0ZXJzKHNzbTogU1NNLCBwYXJhbWV0ZXJzOiBDcm9zc1JlZ2lvbkV4cG9ydHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoQXJyYXkuZnJvbShPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKSwgKFtuYW1lLCB2YWx1ZV0pID0+IHtcbiAgICByZXR1cm4gc3NtLnB1dFBhcmFtZXRlcih7XG4gICAgICBOYW1lOiBuYW1lLFxuICAgICAgVmFsdWU6IHZhbHVlLFxuICAgICAgVHlwZTogJ1N0cmluZycsXG4gICAgfSk7XG4gIH0pKTtcbn1cblxuLyoqXG4gKiBEZWxldGUgcGFyYW1ldGVycyBubyBsb25nZXIgaW4gdXNlLlxuICogRnJvbSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc3lzdGVtcy1tYW5hZ2VyL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVBhcmFtZXRlcnMuaHRtbCB0aGVyZVxuICogaXMgYSBjb25zdHJhaW50IG9uIG5hbWVzLiBJdCBtdXN0IGhhdmUgc2l6ZSBhdCBsZWFzdCAxIGFuZCBhdCBtb3N0IDEwLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxldGVQYXJhbWV0ZXJzKHNzbTogU1NNLCBuYW1lczogc3RyaW5nW10pIHtcbiAgLy8gbWF4IGFsbG93ZWQgYnkgRGVsZXRlUGFyYW1ldGVycyBhcGlcbiAgY29uc3QgbWF4U2l6ZSA9IDEwO1xuICAvLyBtb3JlIHRlc3RhYmxlIGlmIHdlIGRlbGV0ZSBpbiBvcmRlclxuICBuYW1lcy5zb3J0KCk7XG4gIGZvciAobGV0IGNodW5rU3RhcnRJZHggPSAwOyBjaHVua1N0YXJ0SWR4IDwgbmFtZXMubGVuZ3RoOyBjaHVua1N0YXJ0SWR4ICs9IG1heFNpemUpIHtcbiAgICBjb25zdCBjaHVua09mTmFtZXMgPSBuYW1lcy5zbGljZShjaHVua1N0YXJ0SWR4LCBjaHVua1N0YXJ0SWR4ICsgbWF4U2l6ZSk7XG4gICAgLy8gYWxzbyBvYnNlcnZlIG1pbmltdW0gc2l6ZSBjb25zdHJhaW50OiBOYW1lcyBwYXJhbWV0ZXIgbXVzdCBoYXZlIHNpemUgYXQgbGVhc3QgMVxuICAgIGlmIChjaHVua09mTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgYXdhaXQgc3NtLmRlbGV0ZVBhcmFtZXRlcnMoe1xuICAgICAgICBOYW1lczogY2h1bmtPZk5hbWVzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUXVlcnkgZm9yIGV4aXN0aW5nIHBhcmFtZXRlcnMgdGhhdCBhcmUgaW4gdXNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRocm93SWZBbnlJblVzZShzc206IFNTTSwgcGFyYW1ldGVyczogQ3Jvc3NSZWdpb25FeHBvcnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHRhZ1Jlc3VsdHM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiA9IG5ldyBNYXAoKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoT2JqZWN0LmtleXMocGFyYW1ldGVycykubWFwKGFzeW5jIChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpc0luVXNlKHNzbSwgbmFtZSk7XG4gICAgaWYgKHJlc3VsdC5zaXplID4gMCkge1xuICAgICAgdGFnUmVzdWx0cy5zZXQobmFtZSwgcmVzdWx0KTtcbiAgICB9XG4gIH0pKTtcblxuICBpZiAodGFnUmVzdWx0cy5zaXplID4gMCkge1xuICAgIGNvbnN0IG1lc3NhZ2U6IHN0cmluZyA9IE9iamVjdC5lbnRyaWVzKHRhZ1Jlc3VsdHMpXG4gICAgICAubWFwKChyZXN1bHQ6IFtzdHJpbmcsIHN0cmluZ1tdXSkgPT4gYCR7cmVzdWx0WzBdfSBpcyBpbiB1c2UgYnkgc3RhY2socykgJHtyZXN1bHRbMV0uam9pbignICcpfWApXG4gICAgICAuam9pbignXFxuJyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBvcnRzIGNhbm5vdCBiZSB1cGRhdGVkOiBcXG4ke21lc3NhZ2V9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHBhcmFtZXRlciBpcyBpbiB1c2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNJblVzZShzc206IFNTTSwgcGFyYW1ldGVyTmFtZTogc3RyaW5nKTogUHJvbWlzZTxTZXQ8c3RyaW5nPj4ge1xuICBjb25zdCB0YWdSZXN1bHRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzc20ubGlzdFRhZ3NGb3JSZXNvdXJjZSh7XG4gICAgICBSZXNvdXJjZUlkOiBwYXJhbWV0ZXJOYW1lLFxuICAgICAgUmVzb3VyY2VUeXBlOiAnUGFyYW1ldGVyJyxcbiAgICB9KTtcbiAgICByZXN1bHQuVGFnTGlzdD8uZm9yRWFjaCh0YWcgPT4ge1xuICAgICAgY29uc3QgdGFnUGFydHMgPSB0YWcuS2V5Py5zcGxpdCgnOicpID8/IFtdO1xuICAgICAgaWYgKHRhZ1BhcnRzWzBdID09PSAnYXdzLWNkaycgJiYgdGFnUGFydHNbMV0gPT09ICdzdHJvbmctcmVmJykge1xuICAgICAgICB0YWdSZXN1bHRzLmFkZCh0YWdQYXJ0c1syXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIC8vIGFuIEludmFsaWRSZXNvdXJjZUlkIG1lYW5zIHRoYXQgdGhlIHBhcmFtZXRlciBkb2Vzbid0IGV4aXN0XG4gICAgLy8gd2hpY2ggd2Ugc2hvdWxkIGlnbm9yZSBzaW5jZSB0aGF0IG1lYW5zIGl0J3Mgbm90IGluIHVzZVxuICAgIGlmIChlLm5hbWUgPT09ICdJbnZhbGlkUmVzb3VyY2VJZCcpIHtcbiAgICAgIHJldHVybiBuZXcgU2V0KCk7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbiAgcmV0dXJuIHRhZ1Jlc3VsdHM7XG59XG5cbi8qKlxuICogUmV0dXJuIG9ubHkgdGhlIGl0ZW1zIGZyb20gc291cmNlIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBmaWx0ZXJcbiAqXG4gKiBAcGFyYW0gc291cmNlIHRoZSBzb3VyY2Ugb2JqZWN0IHRvIHBlcmZvcm0gdGhlIGZpbHRlciBvblxuICogQHBhcmFtIGZpbHRlciBmaWx0ZXIgb3V0IGl0ZW1zIHRoYXQgZXhpc3QgaW4gdGhpcyBvYmplY3RcbiAqIEByZXR1cm5zIGFueSBleHBvcnRzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGZpbHRlclxuICovXG5mdW5jdGlvbiBleGNlcHQoc291cmNlOiBDcm9zc1JlZ2lvbkV4cG9ydHMsIGZpbHRlcjogQ3Jvc3NSZWdpb25FeHBvcnRzKTogQ3Jvc3NSZWdpb25FeHBvcnRzIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSlcbiAgICAuZmlsdGVyKGtleSA9PiAoIWZpbHRlci5oYXNPd25Qcm9wZXJ0eShrZXkpKSlcbiAgICAucmVkdWNlKChhY2M6IENyb3NzUmVnaW9uRXhwb3J0cywgY3Vycjogc3RyaW5nKSA9PiB7XG4gICAgICBhY2NbY3Vycl0gPSBzb3VyY2VbY3Vycl07XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gaXRlbXMgdGhhdCBleGlzdCBpbiBib3RoIHRoZSB0aGUgb2xkIHBhcmFtZXRlcnMgYW5kIHRoZSBuZXcgcGFyYW1ldGVycyxcbiAqIGJ1dCBoYXZlIGRpZmZlcmVudCB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0gb2xkUGFyYW1zIHRoZSBleHBvcnRzIHRoYXQgZXhpc3RlZCBwcmV2aW91cyB0byB0aGlzIGV4ZWN1dGlvblxuICogQHBhcmFtIG5ld1BhcmFtcyB0aGUgZXhwb3J0cyBmb3IgdGhlIGN1cnJlbnQgZXhlY3V0aW9uXG4gKiBAcmV0dXJucyBhbnkgcGFyYW1ldGVycyB0aGF0IGhhdmUgZGlmZmVyZW50IHZhbHVlc1xuICovXG5mdW5jdGlvbiBjaGFuZ2VkKG9sZFBhcmFtczogQ3Jvc3NSZWdpb25FeHBvcnRzLCBuZXdQYXJhbXM6IENyb3NzUmVnaW9uRXhwb3J0cyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9sZFBhcmFtcylcbiAgICAuZmlsdGVyKGtleSA9PiAobmV3UGFyYW1zLmhhc093blByb3BlcnR5KGtleSkgJiYgb2xkUGFyYW1zW2tleV0gIT09IG5ld1BhcmFtc1trZXldKSlcbiAgICAucmVkdWNlKChhY2M6IHN0cmluZ1tdLCBjdXJyOiBzdHJpbmcpID0+IHtcbiAgICAgIGFjYy5wdXNoKGN1cnIpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG59XG4iXX0= \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1/index.js b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1/index.js deleted file mode 100644 index cee25eae388e1..0000000000000 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1/index.js +++ /dev/null @@ -1,152 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.handler = void 0; -/*eslint-disable no-console*/ -/* eslint-disable import/no-extraneous-dependencies */ -const client_ssm_1 = require("@aws-sdk/client-ssm"); -async function handler(event) { - const props = event.ResourceProperties.WriterProps; - const exports = props.exports; - const ssm = new client_ssm_1.SSM({ region: props.region }); - try { - switch (event.RequestType) { - case 'Create': - console.info(`Creating new SSM Parameter exports in region ${props.region}`); - await throwIfAnyInUse(ssm, exports); - await putParameters(ssm, exports); - return; - case 'Update': - const oldProps = event.OldResourceProperties.WriterProps; - const oldExports = oldProps.exports; - const newExports = except(exports, oldExports); - // throw an error to fail the deployment if any export value is changing - const changedExports = changed(oldExports, exports); - if (changedExports.length > 0) { - throw new Error('Some exports have changed!\n' + changedExports.join('\n')); - } - // if we are removing any exports that are in use, then throw an - // error to fail the deployment - const removedExports = except(oldExports, exports); - await throwIfAnyInUse(ssm, removedExports); - // if the ones we are removing are not in use then delete them - // skip if no export names are to be deleted - const removedExportsNames = Object.keys(removedExports); - if (removedExportsNames.length > 0) { - await ssm.deleteParameters({ - Names: removedExportsNames, - }); - } - // also throw an error if we are creating a new export that already exists for some reason - await throwIfAnyInUse(ssm, newExports); - console.info(`Creating new SSM Parameter exports in region ${props.region}`); - await putParameters(ssm, newExports); - return; - case 'Delete': - // if any of the exports are currently in use then throw an error to fail - // the stack deletion. - await throwIfAnyInUse(ssm, exports); - // if none are in use then delete all of them - await ssm.deleteParameters({ - Names: Object.keys(exports), - }); - return; - default: - return; - } - } - catch (e) { - console.error('Error processing event: ', e); - throw e; - } -} -exports.handler = handler; -; -/** - * Create parameters for existing exports - */ -async function putParameters(ssm, parameters) { - await Promise.all(Array.from(Object.entries(parameters), ([name, value]) => { - return ssm.putParameter({ - Name: name, - Value: value, - Type: 'String', - }); - })); -} -/** - * Query for existing parameters that are in use - */ -async function throwIfAnyInUse(ssm, parameters) { - const tagResults = new Map(); - await Promise.all(Object.keys(parameters).map(async (name) => { - const result = await isInUse(ssm, name); - if (result.size > 0) { - tagResults.set(name, result); - } - })); - if (tagResults.size > 0) { - const message = Object.entries(tagResults) - .map((result) => `${result[0]} is in use by stack(s) ${result[1].join(' ')}`) - .join('\n'); - throw new Error(`Exports cannot be updated: \n${message}`); - } -} -/** - * Check if a parameter is in use - */ -async function isInUse(ssm, parameterName) { - const tagResults = new Set(); - try { - const result = await ssm.listTagsForResource({ - ResourceId: parameterName, - ResourceType: 'Parameter', - }); - result.TagList?.forEach(tag => { - const tagParts = tag.Key?.split(':') ?? []; - if (tagParts[0] === 'aws-cdk' && tagParts[1] === 'strong-ref') { - tagResults.add(tagParts[2]); - } - }); - } - catch (e) { - // an InvalidResourceId means that the parameter doesn't exist - // which we should ignore since that means it's not in use - if (e.name === 'InvalidResourceId') { - return new Set(); - } - throw e; - } - return tagResults; -} -/** - * Return only the items from source that do not exist in the filter - * - * @param source the source object to perform the filter on - * @param filter filter out items that exist in this object - * @returns any exports that don't exist in the filter - */ -function except(source, filter) { - return Object.keys(source) - .filter(key => (!filter.hasOwnProperty(key))) - .reduce((acc, curr) => { - acc[curr] = source[curr]; - return acc; - }, {}); -} -/** - * Return items that exist in both the the old parameters and the new parameters, - * but have different values - * - * @param oldParams the exports that existed previous to this execution - * @param newParams the exports for the current execution - * @returns any parameters that have different values - */ -function changed(oldParams, newParams) { - return Object.keys(oldParams) - .filter(key => (newParams.hasOwnProperty(key) && oldParams[key] !== newParams[key])) - .reduce((acc, curr) => { - acc.push(curr); - return acc; - }, []); -} -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFDN0Isc0RBQXNEO0FBQ3RELG9EQUEwQztBQUduQyxLQUFLLFVBQVUsT0FBTyxDQUFDLEtBQWtEO0lBQzlFLE1BQU0sS0FBSyxHQUF3QixLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDO0lBQ3hFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUE2QixDQUFDO0lBRXBELE1BQU0sR0FBRyxHQUFHLElBQUksZ0JBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5QyxJQUFJO1FBQ0YsUUFBUSxLQUFLLENBQUMsV0FBVyxFQUFFO1lBQ3pCLEtBQUssUUFBUTtnQkFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDN0UsTUFBTSxlQUFlLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2xDLE9BQU87WUFDVCxLQUFLLFFBQVE7Z0JBQ1gsTUFBTSxRQUFRLEdBQXdCLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUM7Z0JBQzlFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUE2QixDQUFDO2dCQUMxRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUUvQyx3RUFBd0U7Z0JBQ3hFLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3BELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLEdBQUUsY0FBYyxDQUFD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TUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDdkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM1QyxNQUFNLENBQUMsQ0FBQyxHQUF1QixFQUFFLElBQVksRUFBRSxFQUFFO1FBQ2hELEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsT0FBTyxDQUFDLFNBQTZCLEVBQUUsU0FBNkI7SUFDM0UsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUMxQixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ25GLE1BQU0sQ0FBQyxDQUFDLEdBQWEsRUFBRSxJQUFZLEVBQUUsRUFBRTtRQUN0QyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2YsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyplc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlKi9cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgU1NNIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNzbSc7XG5pbXBvcnQgeyBDcm9zc1JlZ2lvbkV4cG9ydHMsIEV4cG9ydFdyaXRlckNSUHJvcHMgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50OiBBV1NMYW1iZGEuQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUV2ZW50KSB7XG4gIGNvbnN0IHByb3BzOiBFeHBvcnRXcml0ZXJDUlByb3BzID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLldyaXRlclByb3BzO1xuICBjb25zdCBleHBvcnRzID0gcHJvcHMuZXhwb3J0cyBhcyBDcm9zc1JlZ2lvbkV4cG9ydHM7XG5cbiAgY29uc3Qgc3NtID0gbmV3IFNTTSh7IHJlZ2lvbjogcHJvcHMucmVnaW9uIH0pO1xuICB0cnkge1xuICAgIHN3aXRjaCAoZXZlbnQuUmVxdWVzdFR5cGUpIHtcbiAgICAgIGNhc2UgJ0NyZWF0ZSc6XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgQ3JlYXRpbmcgbmV3IFNTTSBQYXJhbWV0ZXIgZXhwb3J0cyBpbiByZWdpb24gJHtwcm9wcy5yZWdpb259YCk7XG4gICAgICAgIGF3YWl0IHRocm93SWZBbnlJblVzZShzc20sIGV4cG9ydHMpO1xuICAgICAgICBhd2FpdCBwdXRQYXJhbWV0ZXJzKHNzbSwgZXhwb3J0cyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgJ1VwZGF0ZSc6XG4gICAgICAgIGNvbnN0IG9sZFByb3BzOiBFeHBvcnRXcml0ZXJDUlByb3BzID0gZXZlbnQuT2xkUmVzb3VyY2VQcm9wZXJ0aWVzLldyaXRlclByb3BzO1xuICAgICAgICBjb25zdCBvbGRFeHBvcnRzID0gb2xkUHJvcHMuZXhwb3J0cyBhcyBDcm9zc1JlZ2lvbkV4cG9ydHM7XG4gICAgICAgIGNvbnN0IG5ld0V4cG9ydHMgPSBleGNlcHQoZXhwb3J0cywgb2xkRXhwb3J0cyk7XG5cbiAgICAgICAgLy8gdGhyb3cgYW4gZXJyb3IgdG8gZmFpbCB0aGUgZGVwbG95bWVudCBpZiBhbnkgZXhwb3J0IHZhbHVlIGlzIGNoYW5naW5nXG4gICAgICAgIGNvbnN0IGNoYW5nZWRFeHBvcnRzID0gY2hhbmdlZChvbGRFeHBvcnRzLCBleHBvcnRzKTtcbiAgICAgICAgaWYgKGNoYW5nZWRFeHBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvbWUgZXhwb3J0cyBoYXZlIGNoYW5nZWQhXFxuJysgY2hhbmdlZEV4cG9ydHMuam9pbignXFxuJykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHdlIGFyZSByZW1vdmluZyBhbnkgZXhwb3J0cyB0aGF0IGFyZSBpbiB1c2UsIHRoZW4gdGhyb3cgYW5cbiAgICAgICAgLy8gZXJyb3IgdG8gZmFpbCB0aGUgZGVwbG95bWVudFxuICAgICAgICBjb25zdCByZW1vdmVkRXhwb3J0cyA9IGV4Y2VwdChvbGRFeHBvcnRzLCBleHBvcnRzKTtcbiAgICAgICAgYXdhaXQgdGhyb3dJZkFueUluVXNlKHNzbSwgcmVtb3ZlZEV4cG9ydHMpO1xuICAgICAgICAvLyBpZiB0aGUgb25lcyB3ZSBhcmUgcmVtb3ZpbmcgYXJlIG5vdCBpbiB1c2UgdGhlbiBkZWxldGUgdGhlbVxuICAgICAgICAvLyBza2lwIGlmIG5vIGV4cG9ydCBuYW1lcyBhcmUgdG8gYmUgZGVsZXRlZFxuICAgICAgICBjb25zdCByZW1vdmVkRXhwb3J0c05hbWVzID0gT2JqZWN0LmtleXMocmVtb3ZlZEV4cG9ydHMpO1xuICAgICAgICBpZiAocmVtb3ZlZEV4cG9ydHNOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgc3NtLmRlbGV0ZVBhcmFtZXRlcnMoe1xuICAgICAgICAgICAgTmFtZXM6IHJlbW92ZWRFeHBvcnRzTmFtZXMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbHNvIHRocm93IGFuIGVycm9yIGlmIHdlIGFyZSBjcmVhdGluZyBhIG5ldyBleHBvcnQgdGhhdCBhbHJlYWR5IGV4aXN0cyBmb3Igc29tZSByZWFzb25cbiAgICAgICAgYXdhaXQgdGhyb3dJZkFueUluVXNlKHNzbSwgbmV3RXhwb3J0cyk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgQ3JlYXRpbmcgbmV3IFNTTSBQYXJhbWV0ZXIgZXhwb3J0cyBpbiByZWdpb24gJHtwcm9wcy5yZWdpb259YCk7XG4gICAgICAgIGF3YWl0IHB1dFBhcmFtZXRlcnMoc3NtLCBuZXdFeHBvcnRzKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAnRGVsZXRlJzpcbiAgICAgICAgLy8gaWYgYW55IG9mIHRoZSBleHBvcnRzIGFyZSBjdXJyZW50bHkgaW4gdXNlIHRoZW4gdGhyb3cgYW4gZXJyb3IgdG8gZmFpbFxuICAgICAgICAvLyB0aGUgc3RhY2sgZGVsZXRpb24uXG4gICAgICAgIGF3YWl0IHRocm93SWZBbnlJblVzZShzc20sIGV4cG9ydHMpO1xuICAgICAgICAvLyBpZiBub25lIGFyZSBpbiB1c2UgdGhlbiBkZWxldGUgYWxsIG9mIHRoZW1cbiAgICAgICAgYXdhaXQgc3NtLmRlbGV0ZVBhcmFtZXRlcnMoe1xuICAgICAgICAgIE5hbWVzOiBPYmplY3Qua2V5cyhleHBvcnRzKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIGV2ZW50OiAnLCBlKTtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZSBwYXJhbWV0ZXJzIGZvciBleGlzdGluZyBleHBvcnRzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1dFBhcmFtZXRlcnMoc3NtOiBTU00sIHBhcmFtZXRlcnM6IENyb3NzUmVnaW9uRXhwb3J0cyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKE9iamVjdC5lbnRyaWVzKHBhcmFtZXRlcnMpLCAoW25hbWUsIHZhbHVlXSkgPT4ge1xuICAgIHJldHVybiBzc20ucHV0UGFyYW1ldGVyKHtcbiAgICAgIE5hbWU6IG5hbWUsXG4gICAgICBWYWx1ZTogdmFsdWUsXG4gICAgICBUeXBlOiAnU3RyaW5nJyxcbiAgICB9KTtcbiAgfSkpO1xufVxuXG4vKipcbiAqIFF1ZXJ5IGZvciBleGlzdGluZyBwYXJhbWV0ZXJzIHRoYXQgYXJlIGluIHVzZVxuICovXG5hc3luYyBmdW5jdGlvbiB0aHJvd0lmQW55SW5Vc2Uoc3NtOiBTU00sIHBhcmFtZXRlcnM6IENyb3NzUmVnaW9uRXhwb3J0cyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB0YWdSZXN1bHRzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4gPSBuZXcgTWFwKCk7XG4gIGF3YWl0IFByb21pc2UuYWxsKE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLm1hcChhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaXNJblVzZShzc20sIG5hbWUpO1xuICAgIGlmIChyZXN1bHQuc2l6ZSA+IDApIHtcbiAgICAgIHRhZ1Jlc3VsdHMuc2V0KG5hbWUsIHJlc3VsdCk7XG4gICAgfVxuICB9KSk7XG5cbiAgaWYgKHRhZ1Jlc3VsdHMuc2l6ZSA+IDApIHtcbiAgICBjb25zdCBtZXNzYWdlOiBzdHJpbmcgPSBPYmplY3QuZW50cmllcyh0YWdSZXN1bHRzKVxuICAgICAgLm1hcCgocmVzdWx0OiBbc3RyaW5nLCBzdHJpbmdbXV0pID0+IGAke3Jlc3VsdFswXX0gaXMgaW4gdXNlIGJ5IHN0YWNrKHMpICR7cmVzdWx0WzFdLmpvaW4oJyAnKX1gKVxuICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwb3J0cyBjYW5ub3QgYmUgdXBkYXRlZDogXFxuJHttZXNzYWdlfWApO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwYXJhbWV0ZXIgaXMgaW4gdXNlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzSW5Vc2Uoc3NtOiBTU00sIHBhcmFtZXRlck5hbWU6IHN0cmluZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgdGFnUmVzdWx0czogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3NtLmxpc3RUYWdzRm9yUmVzb3VyY2Uoe1xuICAgICAgUmVzb3VyY2VJZDogcGFyYW1ldGVyTmFtZSxcbiAgICAgIFJlc291cmNlVHlwZTogJ1BhcmFtZXRlcicsXG4gICAgfSk7XG4gICAgcmVzdWx0LlRhZ0xpc3Q/LmZvckVhY2godGFnID0+IHtcbiAgICAgIGNvbnN0IHRhZ1BhcnRzID0gdGFnLktleT8uc3BsaXQoJzonKSA/PyBbXTtcbiAgICAgIGlmICh0YWdQYXJ0c1swXSA9PT0gJ2F3cy1jZGsnICYmIHRhZ1BhcnRzWzFdID09PSAnc3Ryb25nLXJlZicpIHtcbiAgICAgICAgdGFnUmVzdWx0cy5hZGQodGFnUGFydHNbMl0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAvLyBhbiBJbnZhbGlkUmVzb3VyY2VJZCBtZWFucyB0aGF0IHRoZSBwYXJhbWV0ZXIgZG9lc24ndCBleGlzdFxuICAgIC8vIHdoaWNoIHdlIHNob3VsZCBpZ25vcmUgc2luY2UgdGhhdCBtZWFucyBpdCdzIG5vdCBpbiB1c2VcbiAgICBpZiAoZS5uYW1lID09PSAnSW52YWxpZFJlc291cmNlSWQnKSB7XG4gICAgICByZXR1cm4gbmV3IFNldCgpO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG4gIHJldHVybiB0YWdSZXN1bHRzO1xufVxuXG4vKipcbiAqIFJldHVybiBvbmx5IHRoZSBpdGVtcyBmcm9tIHNvdXJjZSB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgZmlsdGVyXG4gKlxuICogQHBhcmFtIHNvdXJjZSB0aGUgc291cmNlIG9iamVjdCB0byBwZXJmb3JtIHRoZSBmaWx0ZXIgb25cbiAqIEBwYXJhbSBmaWx0ZXIgZmlsdGVyIG91dCBpdGVtcyB0aGF0IGV4aXN0IGluIHRoaXMgb2JqZWN0XG4gKiBAcmV0dXJucyBhbnkgZXhwb3J0cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBmaWx0ZXJcbiAqL1xuZnVuY3Rpb24gZXhjZXB0KHNvdXJjZTogQ3Jvc3NSZWdpb25FeHBvcnRzLCBmaWx0ZXI6IENyb3NzUmVnaW9uRXhwb3J0cyk6IENyb3NzUmVnaW9uRXhwb3J0cyB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpXG4gICAgLmZpbHRlcihrZXkgPT4gKCFmaWx0ZXIuaGFzT3duUHJvcGVydHkoa2V5KSkpXG4gICAgLnJlZHVjZSgoYWNjOiBDcm9zc1JlZ2lvbkV4cG9ydHMsIGN1cnI6IHN0cmluZykgPT4ge1xuICAgICAgYWNjW2N1cnJdID0gc291cmNlW2N1cnJdO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59XG5cbi8qKlxuICogUmV0dXJuIGl0ZW1zIHRoYXQgZXhpc3QgaW4gYm90aCB0aGUgdGhlIG9sZCBwYXJhbWV0ZXJzIGFuZCB0aGUgbmV3IHBhcmFtZXRlcnMsXG4gKiBidXQgaGF2ZSBkaWZmZXJlbnQgdmFsdWVzXG4gKlxuICogQHBhcmFtIG9sZFBhcmFtcyB0aGUgZXhwb3J0cyB0aGF0IGV4aXN0ZWQgcHJldmlvdXMgdG8gdGhpcyBleGVjdXRpb25cbiAqIEBwYXJhbSBuZXdQYXJhbXMgdGhlIGV4cG9ydHMgZm9yIHRoZSBjdXJyZW50IGV4ZWN1dGlvblxuICogQHJldHVybnMgYW55IHBhcmFtZXRlcnMgdGhhdCBoYXZlIGRpZmZlcmVudCB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gY2hhbmdlZChvbGRQYXJhbXM6IENyb3NzUmVnaW9uRXhwb3J0cywgbmV3UGFyYW1zOiBDcm9zc1JlZ2lvbkV4cG9ydHMpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvbGRQYXJhbXMpXG4gICAgLmZpbHRlcihrZXkgPT4gKG5ld1BhcmFtcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIG9sZFBhcmFtc1trZXldICE9PSBuZXdQYXJhbXNba2V5XSkpXG4gICAgLnJlZHVjZSgoYWNjOiBzdHJpbmdbXSwgY3Vycjogc3RyaW5nKSA9PiB7XG4gICAgICBhY2MucHVzaChjdXJyKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xufVxuIl19 \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/cdk.out index 2313ab5436501..c5cb2e5de6344 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/cdk.out +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/cdk.out @@ -1 +1 @@ -{"version":"34.0.0"} \ No newline at end of file +{"version":"35.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/certificate-redirect-stack-c8dcaeced090b732e39f9a17bfcca0bf8d20ce4f61.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/certificate-redirect-stack-c8dcaeced090b732e39f9a17bfcca0bf8d20ce4f61.assets.json index a286679b4cbed..c9df8889ede84 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/certificate-redirect-stack-c8dcaeced090b732e39f9a17bfcca0bf8d20ce4f61.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/certificate-redirect-stack-c8dcaeced090b732e39f9a17bfcca0bf8d20ce4f61.assets.json @@ -1,21 +1,21 @@ { - "version": "34.0.0", + "version": "35.0.0", "files": { - "1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1": { + "0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760": { "source": { - "path": "asset.1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1", + "path": "asset.0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760", "packaging": "zip" }, "destinations": { "current_account-us-east-1": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1", - "objectKey": "1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1.zip", + "objectKey": "0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760.zip", "region": "us-east-1", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-us-east-1" } } }, - "f28f13d4b19756188a6d5e23509621738ffca465e2d0a1754c4a6dd1e8df365d": { + "9b6cd6f8577bff4ea2ae6cff63c117546864df060dcf66fbd34f4610c4c1814a": { "source": { "path": "certificate-redirect-stack-c8dcaeced090b732e39f9a17bfcca0bf8d20ce4f61.template.json", "packaging": "file" @@ -23,7 +23,7 @@ "destinations": { "current_account-us-east-1": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1", - "objectKey": "f28f13d4b19756188a6d5e23509621738ffca465e2d0a1754c4a6dd1e8df365d.json", + "objectKey": "9b6cd6f8577bff4ea2ae6cff63c117546864df060dcf66fbd34f4610c4c1814a.json", "region": "us-east-1", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-us-east-1" } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/certificate-redirect-stack-c8dcaeced090b732e39f9a17bfcca0bf8d20ce4f61.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/certificate-redirect-stack-c8dcaeced090b732e39f9a17bfcca0bf8d20ce4f61.template.json index 64fe52250da1f..17cc36b95cc3e 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/certificate-redirect-stack-c8dcaeced090b732e39f9a17bfcca0bf8d20ce4f61.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/certificate-redirect-stack-c8dcaeced090b732e39f9a17bfcca0bf8d20ce4f61.template.json @@ -109,7 +109,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1" }, - "S3Key": "1a067234d252533a95ecaaccd4b3e821e6a69df0b03b918b596fc5a40eeb71a1.zip" + "S3Key": "0dfca907fd15148be57ff2c4bf72903a5684be8c5f342df63f11b1c360a3b760.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integ-https-redirect.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integ-https-redirect.assets.json index 3c9703793eafd..4fd0fdec144c8 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integ-https-redirect.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integ-https-redirect.assets.json @@ -1,21 +1,21 @@ { - "version": "34.0.0", + "version": "35.0.0", "files": { - "863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf": { + "8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171": { "source": { - "path": "asset.863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf", + "path": "asset.8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171", "packaging": "zip" }, "destinations": { "current_account-us-east-2": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-2", - "objectKey": "863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf.zip", + "objectKey": "8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171.zip", "region": "us-east-2", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-us-east-2" } } }, - "677e4695545d67b2c91e6f61bf03d737b0b87c528da4470e343f43e1a3c47c39": { + "a4c99d916b77473a5ee7c17443f4b1a130e68e0a7c34e29174a741ef757d883a": { "source": { "path": "integ-https-redirect.template.json", "packaging": "file" @@ -23,7 +23,7 @@ "destinations": { "current_account-us-east-2": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-2", - "objectKey": "677e4695545d67b2c91e6f61bf03d737b0b87c528da4470e343f43e1a3c47c39.json", + "objectKey": "a4c99d916b77473a5ee7c17443f4b1a130e68e0a7c34e29174a741ef757d883a.json", "region": "us-east-2", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-us-east-2" } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integ-https-redirect.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integ-https-redirect.template.json index f6aeed0d3faea..9195d263d6f4d 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integ-https-redirect.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integ-https-redirect.template.json @@ -225,7 +225,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-us-east-2" }, - "S3Key": "863f318b36ec4666a297aefb6cf8390c2f0bb6ec4ef3ae0040a63a0727f50ccf.zip" + "S3Key": "8aa288515f27dc9911c4bd76373c2f2490eb54fde6878b4068922243eac9b171.zip" }, "Timeout": 900, "MemorySize": 128, diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integ.json index 785b2a8ad5452..e13e6315582b5 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integ.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integ.json @@ -1,6 +1,6 @@ { "enableLookups": true, - "version": "34.0.0", + "version": "35.0.0", "testCases": { "integ-test/DefaultTest": { "stacks": [ diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integtestDefaultTestDeployAssert24D5C536.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integtestDefaultTestDeployAssert24D5C536.assets.json index 2b470996152e4..72a74237471ae 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integtestDefaultTestDeployAssert24D5C536.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/integtestDefaultTestDeployAssert24D5C536.assets.json @@ -1,5 +1,5 @@ { - "version": "34.0.0", + "version": "35.0.0", "files": { "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { "source": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/manifest.json index f321f8a1d4a2e..6ad5de5854c79 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/manifest.json @@ -1,5 +1,5 @@ { - "version": "34.0.0", + "version": "35.0.0", "artifacts": { "integ-https-redirect.assets": { "type": "cdk:asset-manifest", @@ -14,10 +14,11 @@ "environment": "aws://unknown-account/us-east-2", "properties": { "templateFile": "integ-https-redirect.template.json", + "terminationProtection": false, "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-us-east-2", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-us-east-2", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-2/677e4695545d67b2c91e6f61bf03d737b0b87c528da4470e343f43e1a3c47c39.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-2/a4c99d916b77473a5ee7c17443f4b1a130e68e0a7c34e29174a741ef757d883a.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -110,10 +111,11 @@ "environment": "aws://unknown-account/us-east-1", "properties": { "templateFile": "certificate-redirect-stack-c8dcaeced090b732e39f9a17bfcca0bf8d20ce4f61.template.json", + "terminationProtection": false, "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-us-east-1", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-us-east-1", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1/f28f13d4b19756188a6d5e23509621738ffca465e2d0a1754c4a6dd1e8df365d.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-us-east-1/9b6cd6f8577bff4ea2ae6cff63c117546864df060dcf66fbd34f4610c4c1814a.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -181,6 +183,7 @@ "environment": "aws://unknown-account/unknown-region", "properties": { "templateFile": "integtestDefaultTestDeployAssert24D5C536.template.json", + "terminationProtection": false, "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/tree.json index ddc5241be9a81..98caa5a2490e5 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-route53-patterns/test/integ.hosted-redirect.js.snapshot/tree.json @@ -275,7 +275,7 @@ }, "constructInfo": { "fqn": "constructs.Construct", - "version": "10.2.70" + "version": "10.3.0" } }, "Custom::CrossRegionExportReaderCustomResourceProvider": { @@ -407,7 +407,7 @@ }, "constructInfo": { "fqn": "constructs.Construct", - "version": "10.2.70" + "version": "10.3.0" } }, "Custom::CrossRegionExportWriterCustomResourceProvider": { @@ -479,7 +479,7 @@ "path": "integ-test/DefaultTest/Default", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.2.70" + "version": "10.3.0" } }, "DeployAssert": { @@ -525,7 +525,7 @@ "path": "Tree", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.2.70" + "version": "10.3.0" } } }, diff --git a/packages/aws-cdk-lib/core/lib/custom-resource-provider/cross-region-export-providers/cross-region-ssm-reader-handler/index.ts b/packages/@aws-cdk/custom-resource-handlers/lib/core/cross-region-ssm-reader-handler/index.ts similarity index 100% rename from packages/aws-cdk-lib/core/lib/custom-resource-provider/cross-region-export-providers/cross-region-ssm-reader-handler/index.ts rename to packages/@aws-cdk/custom-resource-handlers/lib/core/cross-region-ssm-reader-handler/index.ts diff --git a/packages/@aws-cdk/custom-resource-handlers/lib/core/types.ts b/packages/@aws-cdk/custom-resource-handlers/lib/core/types.ts new file mode 100644 index 0000000000000..2d3d3e4f0ddea --- /dev/null +++ b/packages/@aws-cdk/custom-resource-handlers/lib/core/types.ts @@ -0,0 +1,47 @@ +/** + * The SSM parameter prefix that will be used for + * all cross region exports + */ +export const SSM_EXPORT_PATH_PREFIX = 'cdk/exports/'; + +/** + * Map of exportName to export value + */ +export type CrossRegionExports = { [exportName: string]: string }; + +/** + * Properties for the CrossRegionExportReader Custom Resource + */ +export interface ExportReaderCRProps { + /** + * The region that this resource exists in + */ + readonly region: string; + + /** + * An additional prefix to use. This will be appended + * to SSM_EXPORT_PATH_PREFIX. + */ + readonly prefix: string; + + /** + * A list of imports used by this stack. + * Will be a list of parameter names + */ + readonly imports: CrossRegionExports; +} + +/** + * Properties for the CrossRegionExportWriter custom resource + */ +export interface ExportWriterCRProps { + /** + * The region to export the value to + */ + readonly region: string; + + /** + * A list of values to export to the target region + */ + readonly exports: CrossRegionExports; +} diff --git a/packages/@aws-cdk/custom-resource-handlers/package.json b/packages/@aws-cdk/custom-resource-handlers/package.json index 346f2f2461e8d..74c3c174f882b 100644 --- a/packages/@aws-cdk/custom-resource-handlers/package.json +++ b/packages/@aws-cdk/custom-resource-handlers/package.json @@ -29,6 +29,7 @@ "@aws-cdk/pkglint": "0.0.0", "@aws-cdk/sdk-v2-to-v3-adapter": "0.0.0", "@aws-sdk/client-ecs": "3.421.0", + "@aws-sdk/client-ssm": "3.421.0", "@aws-sdk/client-kinesis": "3.421.0", "@aws-sdk/client-kms": "3.421.0", "@aws-sdk/client-redshift": "3.421.0", diff --git a/packages/aws-cdk-lib/core/test/custom-resource-provider/cross-region-ssm-reader-handler.test.ts b/packages/@aws-cdk/custom-resource-handlers/test/core/cross-region-ssm-reader-handler.test.ts similarity index 96% rename from packages/aws-cdk-lib/core/test/custom-resource-provider/cross-region-ssm-reader-handler.test.ts rename to packages/@aws-cdk/custom-resource-handlers/test/core/cross-region-ssm-reader-handler.test.ts index bda462d28b0f5..dda339e4558d1 100644 --- a/packages/aws-cdk-lib/core/test/custom-resource-provider/cross-region-ssm-reader-handler.test.ts +++ b/packages/@aws-cdk/custom-resource-handlers/test/core/cross-region-ssm-reader-handler.test.ts @@ -1,6 +1,7 @@ +/* eslint-disable import/no-extraneous-dependencies */ import { InvalidResourceId } from '@aws-sdk/client-ssm'; -import { handler } from '../../lib/custom-resource-provider/cross-region-export-providers/cross-region-ssm-reader-handler'; -import { SSM_EXPORT_PATH_PREFIX } from '../../lib/custom-resource-provider/cross-region-export-providers/types'; +import { handler } from '../../lib/core/cross-region-ssm-reader-handler/index'; +import { SSM_EXPORT_PATH_PREFIX } from '../../lib/core/types'; let mockDeleteParameters: jest.Mock ; let mockAddTagsToResource: jest.Mock; diff --git a/packages/aws-cdk-lib/core/lib/custom-resource-provider/cross-region-export-providers/export-reader-provider.ts b/packages/aws-cdk-lib/core/lib/custom-resource-provider/cross-region-export-providers/export-reader-provider.ts index 6833cfcf59bfa..2d42125c928db 100644 --- a/packages/aws-cdk-lib/core/lib/custom-resource-provider/cross-region-export-providers/export-reader-provider.ts +++ b/packages/aws-cdk-lib/core/lib/custom-resource-provider/cross-region-export-providers/export-reader-provider.ts @@ -36,7 +36,7 @@ export class ExportReader extends Construct { const resourceType = 'Custom::CrossRegionExportReader'; const serviceToken = CustomResourceProvider.getOrCreate(this, resourceType, { - codeDirectory: path.join(__dirname, 'cross-region-ssm-reader-handler'), + codeDirectory: path.join(__dirname, '..', '..', '..', '..', 'custom-resource-handlers', 'dist', 'core', 'cross-region-ssm-reader-handler'), runtime: CustomResourceProviderRuntime.NODEJS_18_X, policyStatements: [{ Effect: 'Allow', diff --git a/packages/aws-cdk-lib/core/lib/custom-resource-provider/cross-region-export-providers/types.ts b/packages/aws-cdk-lib/core/lib/custom-resource-provider/cross-region-export-providers/types.ts index 01d64b00f06fd..77e883a7caa7a 100644 --- a/packages/aws-cdk-lib/core/lib/custom-resource-provider/cross-region-export-providers/types.ts +++ b/packages/aws-cdk-lib/core/lib/custom-resource-provider/cross-region-export-providers/types.ts @@ -1,5 +1,7 @@ import { IResolvable } from '../../resolvable'; +// Shared definition with packages/@aws-cdk/custom-resource-handlers/lib/core/cross-region-export-handlers/types.ts + /** * The SSM parameter prefix that will be used for * all cross region exports