raindancers-network
Version:
Extensions to the ec2.Vpc Constructs
119 lines • 15.7 kB
JavaScript
;
var _a, _b;
Object.defineProperty(exports, "__esModule", { value: true });
exports.IpsecTunnelPool = exports.GetTunnelAddressPair = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const constructs = require("constructs");
function ipToInt32(ip) {
const ipSplit = ip.split('.');
var ipInt = 0;
ipSplit.forEach((value, index) => {
var octect = value;
ipInt += octect * Math.pow(2, (24 - index * 8));
});
return ipInt;
}
/**
* Allocate a pair of /30 networks CIDRS for use in Ipsec VPN Tunnels
*/
class GetTunnelAddressPair extends constructs.Construct {
/**
*
* @param scope scope in which this resource is created
* @param id scope id of the resoruce
* @param props resource properties
*/
constructor(scope, id, props) {
super(scope, id);
const assignedCidrs = [];
for (let i = 1; i <= 2; i++) {
const allocation = new aws_cdk_lib_1.aws_ec2.CfnIPAMAllocation(this, `IPAMAllocationtunnel${i}`, {
ipamPoolId: props.ipamPoolId,
description: `vpn tunnel ${i} to ${props.name}`,
netmaskLength: 30,
});
const tunnelId = `tunnel${i}${props.name}`;
const allocationCidr = new aws_cdk_lib_1.custom_resources.AwsCustomResource(this, tunnelId, {
onCreate: {
service: 'EC2',
action: 'getIpamPoolAllocations',
parameters: {
IpamPoolId: props.ipamPoolId,
IpamPoolAllocationId: allocation.attrIpamPoolAllocationId,
},
physicalResourceId: aws_cdk_lib_1.custom_resources.PhysicalResourceId.of(tunnelId),
},
policy: aws_cdk_lib_1.custom_resources.AwsCustomResourcePolicy.fromSdkCalls({
resources: aws_cdk_lib_1.custom_resources.AwsCustomResourcePolicy.ANY_RESOURCE,
}),
});
assignedCidrs.push(allocationCidr.getResponseField('IpamPoolAllocations.0.Cidr'));
}
this.assignedCidrPair = assignedCidrs;
}
}
exports.GetTunnelAddressPair = GetTunnelAddressPair;
_a = JSII_RTTI_SYMBOL_1;
GetTunnelAddressPair[_a] = { fqn: "raindancers-network.ipam.GetTunnelAddressPair", version: "1.29.3" };
/**
* Creates an IPAM pool to assign address's for IPsec VPNS
*/
class IpsecTunnelPool extends constructs.Construct {
/**
*
* @param scope scope in which this resource is defined
* @param id id of the resource
* @param props resource properties
*/
constructor(scope, id, props) {
super(scope, id);
// check to see that cidr starts with 169.254
if (!(props.cidr.startsWith('169.254'))) {
throw new Error('Tunnel Cidrs must be in teh 169.254/16 range');
}
const netmask = props.cidr.split('/')[1];
// check to see that the mask is between /24 and /29
if (!(netmask >= 24 && netmask <= 29)) {
throw new Error('Tunnels Mask must be in the range 24 to 29 inclusive ');
}
// check to see if the the cidr overlaps the reserved address's
const networkAddress = ipToInt32(props.cidr.split('/')[0]);
const reservedTunnelAddress = [
'169.254.0.0/30',
'169.254.1.0/30',
'169.254.2.0/30',
'169.254.3.0/30',
'169.254.4.0/30',
'169.254.5.0/30',
'169.254.169.252/30',
];
reservedTunnelAddress.forEach((checkAddr) => {
const rsvAddr = ipToInt32(checkAddr.split('/')[0]);
if (rsvAddr >= networkAddress && rsvAddr <= networkAddress + Math.pow(2, 32 - netmask)) {
throw new Error(`The cidr ${props.cidr} includes the reserved range ${checkAddr}`);
}
});
this.ipampool = new aws_cdk_lib_1.aws_ec2.CfnIPAMPool(this, 'IPAMPool', {
addressFamily: 'ipv4',
ipamScopeId: props.ipamScopeId,
allocationDefaultNetmaskLength: 30,
allocationMaxNetmaskLength: 30,
allocationMinNetmaskLength: 30,
description: props.description,
provisionedCidrs: [
{
cidr: props.cidr,
},
],
tags: [{
key: 'Name',
value: props.name,
}],
});
}
}
exports.IpsecTunnelPool = IpsecTunnelPool;
_b = JSII_RTTI_SYMBOL_1;
IpsecTunnelPool[_b] = { fqn: "raindancers-network.ipam.IpsecTunnelPool", version: "1.29.3" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pcGFtL2lwYW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FJcUI7QUFFckIseUNBQXlDO0FBRXpDLFNBQVMsU0FBUyxDQUFDLEVBQVU7SUFDM0IsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixJQUFJLEtBQUssR0FBVyxDQUFDLENBQUM7SUFDdEIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNoQyxJQUFJLE1BQU0sR0FBVyxLQUEwQixDQUFDO1FBQ2hELEtBQUssSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUMsS0FBSyxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFjRDs7R0FFRztBQUVILE1BQWEsb0JBQXFCLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFNNUQ7Ozs7O1NBS0U7SUFDRixZQUFZLEtBQTJCLEVBQUUsRUFBVSxFQUFFLEtBQWdDO1FBQ3BGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFaEIsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO1FBRW5DLEtBQUssSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFFLENBQUMsSUFBRyxDQUFDLEVBQUcsQ0FBQyxFQUFFLEVBQUU7WUFFekIsTUFBTSxVQUFVLEdBQUcsSUFBSSxxQkFBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdFLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtnQkFDNUIsV0FBVyxFQUFFLGNBQWMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JB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VyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLDhCQUE4QixFQUFFLEVBQUU7WUFDbEMsMEJBQTBCLEVBQUUsRUFBRTtZQUM5QiwwQkFBMEIsRUFBRSxFQUFFO1lBQzlCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztZQUM5QixnQkFBZ0IsRUFBRTtnQkFDaEI7b0JBQ0UsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2lCQUNqQjthQUNGO1lBQ0QsSUFBSSxFQUFFLENBQUM7b0JBQ0wsR0FBRyxFQUFFLE1BQU07b0JBQ1gsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO2lCQUNsQixDQUFDO1NBQ0gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFwRUgsMENBc0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYXdzX2VjMiBhcyBlYzIsXG4gIGN1c3RvbV9yZXNvdXJjZXMgYXMgY3IsXG59XG4gIGZyb20gJ2F3cy1jZGstbGliJztcblxuaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tICdjb25zdHJ1Y3RzJztcblxuZnVuY3Rpb24gaXBUb0ludDMyKGlwOiBzdHJpbmcpIHtcbiAgY29uc3QgaXBTcGxpdCA9IGlwLnNwbGl0KCcuJyk7XG4gIHZhciBpcEludDogbnVtYmVyID0gMDtcbiAgaXBTcGxpdC5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgpID0+IHtcblx0ICB2YXIgb2N0ZWN0OiBudW1iZXIgPSB2YWx1ZSBhcyB1bmtub3duIGFzIG51bWJlcjtcblx0ICBpcEludCArPSBvY3RlY3QgKiBNYXRoLnBvdygyLCAoMjQtaW5kZXgqOCkpO1xuICB9KTtcblxuICByZXR1cm4gaXBJbnQ7XG59XG5cbi8qKlxuKiBQcm9wZXJ0aWVzIGZvciBvYnRhaW5pbmcgYW4gSVBBTSBhc3NpZ25lZCBhZGRyZXNzIHBhaXIgZm9yIHVzZSBvbiBJUHNlYyBWUE4gVHVubmVscy5cbiovXG5leHBvcnQgaW50ZXJmYWNlIEdldFR1bm5lbEFkZHJlc3NQYWlyUHJvcHMge1xuXG4gIC8qKiBUaGUgSVBBTSBQb29sIElkIGZyb20gd2hpY2ggdGhlIGFzc2dpbm1lbnQgd2lsbCBiZSBtYWRlIGZyb20gICovXG4gIHJlYWRvbmx5IGlwYW1Qb29sSWQ6IHN0cmluZztcblxuICAvKiogVGhlIE5hbWUgdXNlZCBieSBJUEFNIHRvIHJlY29yZCB0aGUgYWxsb2NhdGlvbiAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFsbG9jYXRlIGEgcGFpciBvZiAvMzAgbmV0d29ya3MgQ0lEUlMgZm9yIHVzZSBpbiBJcHNlYyBWUE4gVHVubmVsc1xuICovXG5cbmV4cG9ydCBjbGFzcyBHZXRUdW5uZWxBZGRyZXNzUGFpciBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgLyoqXG5cdCAqIHJldHVybnMgMiBjaWRyIGJsb2NrcyBhcyBhbiBhcnJheSB0byBiZSB1c2VkIGJ5IGFuIElQc2VjIFR1bm5lbFxuXHQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFzc2lnbmVkQ2lkclBhaXI6IHN0cmluZ1tdO1xuXG4gIC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gc2NvcGUgc2NvcGUgaW4gd2hpY2ggdGhpcyByZXNvdXJjZSBpcyBjcmVhdGVkXG5cdCAqIEBwYXJhbSBpZCBzY29wZSBpZCBvZiB0aGUgcmVzb3J1Y2Vcblx0ICogQHBhcmFtIHByb3BzIHJlc291cmNlIHByb3BlcnRpZXNcblx0ICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEdldFR1bm5lbEFkZHJlc3NQYWlyUHJvcHMpIHtcblx0ICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgYXNzaWduZWRDaWRyczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAobGV0IGk9MTsgaSA8PTIgOyBpKyspIHtcblxuICAgICAgY29uc3QgYWxsb2NhdGlvbiA9IG5ldyBlYzIuQ2ZuSVBBTUFsbG9jYXRpb24odGhpcywgYElQQU1BbGxvY2F0aW9udHVubmVsJHtpfWAsIHtcbiAgICAgICAgaXBhbVBvb2xJZDogcHJvcHMuaXBhbVBvb2xJZCxcbiAgICAgICAgZGVzY3JpcHRpb246IGB2cG4gdHVubmVsICR7aX0gdG8gJHtwcm9wcy5uYW1lfWAsXG4gICAgICAgIG5ldG1hc2tMZW5ndGg6IDMwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR1bm5lbElkID0gYHR1bm5lbCR7aX0ke3Byb3BzLm5hbWV9YDtcblxuICAgICAgY29uc3QgYWxsb2NhdGlvbkNpZHIgPSBuZXcgY3IuQXdzQ3VzdG9tUmVzb3VyY2UodGhpcywgdHVubmVsSWQsIHtcbiAgICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgICBzZXJ2aWNlOiAnRUMyJyxcbiAgICAgICAgICBhY3Rpb246ICdnZXRJcGFtUG9vbEFsbG9jYXRpb25zJyxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBJcGFtUG9vbElkOiBwcm9wcy5pcGFtUG9vbElkLFxuICAgICAgICAgICAgSXBhbVBvb2xBbGxvY2F0aW9uSWQ6IGFsbG9jYXRpb24uYXR0cklwYW1Qb29sQWxsb2NhdGlvbklkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjci5QaHlzaWNhbFJlc291cmNlSWQub2YodHVubmVsSWQpLFxuICAgICAgICB9LFxuICAgICAgICBwb2xpY3k6IGNyLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TZGtDYWxscyh7XG4gICAgICAgICAgcmVzb3VyY2VzOiBjci5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5BTllfUkVTT1VSQ0UsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2lnbmVkQ2lkcnMucHVzaChhbGxvY2F0aW9uQ2lkci5nZXRSZXNwb25zZUZpZWxkKCdJcGFtUG9vbEFsbG9jYXRpb25zLjAuQ2lkcicpKTtcbiAgICB9XG5cbiAgICB0aGlzLmFzc2lnbmVkQ2lkclBhaXIgPSBhc3NpZ25lZENpZHJzO1xuXG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBkZWZpbmluZyBhIElQQU0gUG9vbCBzcGVjaWZpY2FsbHkgZm9yIElQU2VjIFZQTiBUdW5uZWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXBzZWNUdW5uZWxQb29sUHJvcHMge1xuXG4gIC8qKiBUaGUgSVBBTSBTY29wZSBJZCB0byB1c2UgdG8gY3JlYXRlIHRoZSBQb29sICovXG4gIHJlYWRvbmx5IGlwYW1TY29wZUlkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBDaWRyIHJhbmdlIGZvciBwb29scyB0byBiZSBjcmVhdGVkIGZyb21cblx0ICogICAgICBlZywgMTY5LjI1NC4xMDAuMC8yN1xuXHQgKiBUaGUgY2lkciBtdXN0IGJlIGluIHRoZSAxNjkuMjU0LjAuMC8xNiByYW5nZSBhbmRcblx0ICogbXVzdCBiZSBhIG1pbmltdW0gb2YgYSAvMjkgYW5kIGEgbWF4aW11bSBvZiAvMjQuXG5cdCAqXG5cdCAqIEl0IG11c3QgYWxzbyBub3Qgb3ZlcmxhcCB0aGUgQVdTIHJlc2VydmVkIHJhbmdlcy4gVFxuXHQgKi9cbiAgcmVhZG9ubHkgY2lkcjogc3RyaW5nO1xuXG4gIC8qKiB0aGUgbmFtZSB1c2VkIGJ5IElQQU0gdG8gaWRlbnRpZnkgdGhlIHBvb2wgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiB0aGUgZGVzY3JpcHRpb24gdXNlZCBieSBJUEFNIHRvIGRlc2NyaWJlIHRoZSBwb29sICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBJUEFNIHBvb2wgdG8gYXNzaWduIGFkZHJlc3MncyBmb3IgSVBzZWMgVlBOU1xuICovXG5leHBvcnQgY2xhc3MgSXBzZWNUdW5uZWxQb29sIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuXG4gIC8qKlxuXHQgKiByZXR1cm5zIHRoZSBjcmVhdGVkIGlwYW0gUG9vbFxuXHQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwYW1wb29sOiBlYzIuQ2ZuSVBBTVBvb2w7XG5cbiAgLyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBzY29wZSBzY29wZSBpbiB3aGljaCB0aGlzIHJlc291cmNlIGlzIGRlZmluZWRcblx0ICogQHBhcmFtIGlkIGlkIG9mIHRoZSByZXNvdXJjZVxuXHQgKiBAcGFyYW0gcHJvcHMgcmVzb3VyY2UgcHJvcGVydGllc1xuXHQgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSXBzZWNUdW5uZWxQb29sUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG5cbiAgICAvLyBjaGVjayB0byBzZWUgdGhhdCBjaWRyIHN0YXJ0cyB3aXRoIDE2OS4yNTRcbiAgICBpZiAoIShwcm9wcy5jaWRyLnN0YXJ0c1dpdGgoJzE2OS4yNTQnKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHVubmVsIENpZHJzIG11c3QgYmUgaW4gdGVoIDE2OS4yNTQvMTYgcmFuZ2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXRtYXNrID0gcHJvcHMuY2lkci5zcGxpdCgnLycpWzFdIGFzIHVua25vd24gYXMgbnVtYmVyO1xuXG5cbiAgICAvLyBjaGVjayB0byBzZWUgdGhhdCB0aGUgbWFzayBpcyBiZXR3ZWVuIC8yNCBhbmQgLzI5XG4gICAgaWYgKCEobmV0bWFzayA+PSAyNCAmJiBuZXRtYXNrIDw9IDI5ICkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHVubmVscyBNYXNrIG11c3QgYmUgaW4gdGhlIHJhbmdlIDI0IHRvIDI5IGluY2x1c2l2ZSAnKTtcbiAgICB9XG5cbiAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhlIHRoZSBjaWRyIG92ZXJsYXBzIHRoZSByZXNlcnZlZCBhZGRyZXNzJ3NcbiAgICBjb25zdCBuZXR3b3JrQWRkcmVzcyA9IGlwVG9JbnQzMihwcm9wcy5jaWRyLnNwbGl0KCcvJylbMF0pO1xuXG4gICAgY29uc3QgcmVzZXJ2ZWRUdW5uZWxBZGRyZXNzID0gW1xuXHRcdCAgJzE2OS4yNTQuMC4wLzMwJyxcblx0XHQgICcxNjkuMjU0LjEuMC8zMCcsXG5cdFx0ICAnMTY5LjI1NC4yLjAvMzAnLFxuXHRcdCAgJzE2OS4yNTQuMy4wLzMwJyxcblx0XHQgICcxNjkuMjU0LjQuMC8zMCcsXG5cdFx0ICAnMTY5LjI1NC41LjAvMzAnLFxuXHRcdCAgJzE2OS4yNTQuMTY5LjI1Mi8zMCcsXG4gICAgXTtcblxuICAgIHJlc2VydmVkVHVubmVsQWRkcmVzcy5mb3JFYWNoKChjaGVja0FkZHIpID0+IHtcbiAgICAgIGNvbnN0IHJzdkFkZHIgPSBpcFRvSW50MzIoY2hlY2tBZGRyLnNwbGl0KCcvJylbMF0pO1xuICAgICAgaWYgKHJzdkFkZHIgPj0gbmV0d29ya0FkZHJlc3MgJiYgcnN2QWRkciA8PSBuZXR3b3JrQWRkcmVzcyArIE1hdGgucG93KDIsIDMyLW5ldG1hc2spKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGNpZHIgJHtwcm9wcy5jaWRyfSBpbmNsdWRlcyB0aGUgcmVzZXJ2ZWQgcmFuZ2UgJHtjaGVja0FkZHJ9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cblxuICAgIHRoaXMuaXBhbXBvb2wgPSBuZXcgZWMyLkNmbklQQU1Qb29sKHRoaXMsICdJUEFNUG9vbCcsIHtcbiAgICAgIGFkZHJlc3NGYW1pbHk6ICdpcHY0JyxcbiAgICAgIGlwYW1TY29wZUlkOiBwcm9wcy5pcGFtU2NvcGVJZCxcbiAgICAgIGFsbG9jYXRpb25EZWZhdWx0TmV0bWFza0xlbmd0aDogMzAsXG4gICAgICBhbGxvY2F0aW9uTWF4TmV0bWFza0xlbmd0aDogMzAsXG4gICAgICBhbGxvY2F0aW9uTWluTmV0bWFza0xlbmd0aDogMzAsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBwcm92aXNpb25lZENpZHJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjaWRyOiBwcm9wcy5jaWRyLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRhZ3M6IFt7XG4gICAgICAgIGtleTogJ05hbWUnLFxuICAgICAgICB2YWx1ZTogcHJvcHMubmFtZSxcbiAgICAgIH1dLFxuICAgIH0pO1xuICB9XG5cbn0iXX0=