UNPKG

@cloudsnorkel/cdk-github-runners

Version:

CDK construct to create GitHub Actions self-hosted runners. Creates ephemeral runners on demand. Easy to deploy and highly customizable.

127 lines 18.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.handler = handler; const client_ec2_1 = require("@aws-sdk/client-ec2"); const client_imagebuilder_1 = require("@aws-sdk/client-imagebuilder"); const client_ssm_1 = require("@aws-sdk/client-ssm"); const lambda_helpers_1 = require("../lambda-helpers"); const ssm = new client_ssm_1.SSMClient(); const ec2 = new client_ec2_1.EC2Client(); const ib = new client_imagebuilder_1.ImagebuilderClient(); async function handleAmi(event, ami) { const imageDescs = (await ec2.send(new client_ec2_1.DescribeImagesCommand({ ImageIds: [ami] }))); if (imageDescs.Images?.length !== 1) { await (0, lambda_helpers_1.customResourceRespond)(event, 'FAILED', `${ami} doesn't exist`, 'ERROR', {}); return; } const rootDevice = imageDescs.Images[0].RootDeviceName; if (!rootDevice) { await (0, lambda_helpers_1.customResourceRespond)(event, 'FAILED', `${ami} has no root device`, 'ERROR', {}); return; } console.log({ notice: 'Resolved AMI root device', ami, rootDevice, }); await (0, lambda_helpers_1.customResourceRespond)(event, 'SUCCESS', 'OK', rootDevice, {}); return; } async function handler(event, context) { try { console.log({ notice: 'CloudFormation custom resource request', ...event, ResponseURL: '...', }); const ami = event.ResourceProperties.Ami; switch (event.RequestType) { case 'Create': case 'Update': if (ami.startsWith('ami-')) { console.log({ notice: 'Checking AMI', ami, }); await handleAmi(event, ami); break; } if (ami.startsWith('resolve:ssm:')) { const ssmParam = ami.substring('resolve:ssm:'.length); console.log({ notice: 'Checking SSM', ssmParam, }); const ssmValue = (await ssm.send(new client_ssm_1.GetParameterCommand({ Name: ssmParam }))).Parameter?.Value; if (!ssmValue) { await (0, lambda_helpers_1.customResourceRespond)(event, 'FAILED', `${ami} has no value`, 'ERROR', {}); break; } await handleAmi(event, ssmValue); break; } if (ami.startsWith('ssm:')) { const ssmParam = ami.substring('ssm:'.length); console.log({ notice: 'Checking SSM', ssmParam, }); const ssmValue = (await ssm.send(new client_ssm_1.GetParameterCommand({ Name: ssmParam }))).Parameter?.Value; if (!ssmValue) { await (0, lambda_helpers_1.customResourceRespond)(event, 'FAILED', `${ami} has no value`, 'ERROR', {}); break; } await handleAmi(event, ssmValue); break; } if (ami.startsWith('lt-')) { console.log({ notice: 'Checking Launch Template', launchTemplateId: ami, }); const lts = await ec2.send(new client_ec2_1.DescribeLaunchTemplateVersionsCommand({ LaunchTemplateId: ami, Versions: ['$Latest'] })); if (lts.LaunchTemplateVersions?.length !== 1) { await (0, lambda_helpers_1.customResourceRespond)(event, 'FAILED', `${ami} doesn't exist`, 'ERROR', {}); break; } if (!lts.LaunchTemplateVersions[0].LaunchTemplateData?.ImageId) { await (0, lambda_helpers_1.customResourceRespond)(event, 'FAILED', `${ami} doesn't have an AMI`, 'ERROR', {}); break; } await handleAmi(event, lts.LaunchTemplateVersions[0].LaunchTemplateData.ImageId); break; } if (ami.match('^arn:aws[^:]*:imagebuilder:[^:]+:[^:]+:image/.*$')) { console.log({ notice: 'Checking Image Builder', imageBuildVersionArn: ami, }); const img = await ib.send(new client_imagebuilder_1.GetImageCommand({ imageBuildVersionArn: ami })); const actualAmi = img.image?.outputResources?.amis?.[0]?.image; if (!actualAmi) { await (0, lambda_helpers_1.customResourceRespond)(event, 'FAILED', `${ami} doesn't have an AMI`, 'ERROR', {}); break; } await handleAmi(event, actualAmi); break; } await (0, lambda_helpers_1.customResourceRespond)(event, 'FAILED', `Unknown type of AMI ${ami}`, 'ERROR', {}); break; case 'Delete': console.log({ notice: 'Nothing to delete', ami, }); await (0, lambda_helpers_1.customResourceRespond)(event, 'SUCCESS', 'OK', event.PhysicalResourceId, {}); break; } } catch (e) { console.error({ notice: 'Failed to resolve AMI root device', error: `${e}`, }); await (0, lambda_helpers_1.customResourceRespond)(event, 'FAILED', e.message || 'Internal Error', context.logStreamName, {}); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1pLXJvb3QtZGV2aWNlLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm92aWRlcnMvYW1pLXJvb3QtZGV2aWNlLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1DQSwwQkFnSEM7QUFuSkQsb0RBQThHO0FBQzlHLHNFQUFtRjtBQUNuRixvREFBcUU7QUFFckUsc0RBQTBEO0FBRTFELE1BQU0sR0FBRyxHQUFHLElBQUksc0JBQVMsRUFBRSxDQUFDO0FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksc0JBQVMsRUFBRSxDQUFDO0FBQzVCLE1BQU0sRUFBRSxHQUFHLElBQUksd0NBQWtCLEVBQUUsQ0FBQztBQUdwQyxLQUFLLFVBQVUsU0FBUyxDQUFDLEtBQWtELEVBQUUsR0FBVztJQUN0RixNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLGtDQUFxQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRixJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBQSxzQ0FBcUIsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEYsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztJQUN2RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFBLHNDQUFxQixFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2RixPQUFPO0lBQ1QsQ0FBQztJQUVELE9BQU8s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Q0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDcEgsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXNjcmliZUltYWdlc0NvbW1hbmQsIERlc2NyaWJlTGF1bmNoVGVtcGxhdGVWZXJzaW9uc0NvbW1hbmQsIEVDMkNsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1lYzInO1xuaW1wb3J0IHsgR2V0SW1hZ2VDb21tYW5kLCBJbWFnZWJ1aWxkZXJDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtaW1hZ2VidWlsZGVyJztcbmltcG9ydCB7IEdldFBhcmFtZXRlckNvbW1hbmQsIFNTTUNsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zc20nO1xuaW1wb3J0ICogYXMgQVdTTGFtYmRhIGZyb20gJ2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgY3VzdG9tUmVzb3VyY2VSZXNwb25kIH0gZnJvbSAnLi4vbGFtYmRhLWhlbHBlcnMnO1xuXG5jb25zdCBzc20gPSBuZXcgU1NNQ2xpZW50KCk7XG5jb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KCk7XG5jb25zdCBpYiA9IG5ldyBJbWFnZWJ1aWxkZXJDbGllbnQoKTtcblxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVBbWkoZXZlbnQ6IEFXU0xhbWJkYS5DbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQsIGFtaTogc3RyaW5nKSB7XG4gIGNvbnN0IGltYWdlRGVzY3MgPSAoYXdhaXQgZWMyLnNlbmQobmV3IERlc2NyaWJlSW1hZ2VzQ29tbWFuZCh7IEltYWdlSWRzOiBbYW1pXSB9KSkpO1xuICBpZiAoaW1hZ2VEZXNjcy5JbWFnZXM/Lmxlbmd0aCAhPT0gMSkge1xuICAgIGF3YWl0IGN1c3RvbVJlc291cmNlUmVzcG9uZChldmVudCwgJ0ZBSUxFRCcsIGAke2FtaX0gZG9lc24ndCBleGlzdGAsICdFUlJPUicsIHt9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByb290RGV2aWNlID0gaW1hZ2VEZXNjcy5JbWFnZXNbMF0uUm9vdERldmljZU5hbWU7XG4gIGlmICghcm9vdERldmljZSkge1xuICAgIGF3YWl0IGN1c3RvbVJlc291cmNlUmVzcG9uZChldmVudCwgJ0ZBSUxFRCcsIGAke2FtaX0gaGFzIG5vIHJvb3QgZGV2aWNlYCwgJ0VSUk9SJywge30pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKHtcbiAgICBub3RpY2U6ICdSZXNvbHZlZCBBTUkgcm9vdCBkZXZpY2UnLFxuICAgIGFtaSxcbiAgICByb290RGV2aWNlLFxuICB9KTtcblxuICBhd2FpdCBjdXN0b21SZXNvdXJjZVJlc3BvbmQoZXZlbnQsICdTVUNDRVNTJywgJ09LJywgcm9vdERldmljZSwge30pO1xuICByZXR1cm47XG59XG5cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IEFXU0xhbWJkYS5DbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQsIGNvbnRleHQ6IEFXU0xhbWJkYS5Db250ZXh0KSB7XG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coe1xuICAgICAgbm90aWNlOiAnQ2xvdWRGb3JtYXRpb24gY3VzdG9tIHJlc291cmNlIHJlcXVlc3QnLFxuICAgICAgLi4uZXZlbnQsXG4gICAgICBSZXNwb25zZVVSTDogJy4uLicsXG4gICAgfSk7XG5cbiAgICBjb25zdCBhbWkgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuQW1pIGFzIHN0cmluZztcblxuICAgIHN3aXRjaCAoZXZlbnQuUmVxdWVzdFR5cGUpIHtcbiAgICAgIGNhc2UgJ0NyZWF0ZSc6XG4gICAgICBjYXNlICdVcGRhdGUnOlxuICAgICAgICBpZiAoYW1pLnN0YXJ0c1dpdGgoJ2FtaS0nKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgICAgIG5vdGljZTogJ0NoZWNraW5nIEFNSScsXG4gICAgICAgICAgICBhbWksXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBhd2FpdCBoYW5kbGVBbWkoZXZlbnQsIGFtaSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYW1pLnN0YXJ0c1dpdGgoJ3Jlc29sdmU6c3NtOicpKSB7XG4gICAgICAgICAgY29uc3Qgc3NtUGFyYW0gPSBhbWkuc3Vic3RyaW5nKCdyZXNvbHZlOnNzbTonLmxlbmd0aCk7XG4gICAgICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICAgICAgbm90aWNlOiAnQ2hlY2tpbmcgU1NNJyxcbiAgICAgICAgICAgIHNzbVBhcmFtLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3Qgc3NtVmFsdWUgPSAoYXdhaXQgc3NtLnNlbmQobmV3IEdldFBhcmFtZXRlckNvbW1hbmQoeyBOYW1lOiBzc21QYXJhbSB9KSkpLlBhcmFtZXRlcj8uVmFsdWU7XG4gICAgICAgICAgaWYgKCFzc21WYWx1ZSkge1xuICAgICAgICAgICAgYXdhaXQgY3VzdG9tUmVzb3VyY2VSZXNwb25kKGV2ZW50LCAnRkFJTEVEJywgYCR7YW1pfSBoYXMgbm8gdmFsdWVgLCAnRVJST1InLCB7fSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCBoYW5kbGVBbWkoZXZlbnQsIHNzbVZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhbWkuc3RhcnRzV2l0aCgnc3NtOicpKSB7XG4gICAgICAgICAgY29uc3Qgc3NtUGFyYW0gPSBhbWkuc3Vic3RyaW5nKCdzc206Jy5sZW5ndGgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgICAgIG5vdGljZTogJ0NoZWNraW5nIFNTTScsXG4gICAgICAgICAgICBzc21QYXJhbSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHNzbVZhbHVlID0gKGF3YWl0IHNzbS5zZW5kKG5ldyBHZXRQYXJhbWV0ZXJDb21tYW5kKHsgTmFtZTogc3NtUGFyYW0gfSkpKS5QYXJhbWV0ZXI/LlZhbHVlO1xuICAgICAgICAgIGlmICghc3NtVmFsdWUpIHtcbiAgICAgICAgICAgIGF3YWl0IGN1c3RvbVJlc291cmNlUmVzcG9uZChldmVudCwgJ0ZBSUxFRCcsIGAke2FtaX0gaGFzIG5vIHZhbHVlYCwgJ0VSUk9SJywge30pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgaGFuZGxlQW1pKGV2ZW50LCBzc21WYWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYW1pLnN0YXJ0c1dpdGgoJ2x0LScpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICAgICAgbm90aWNlOiAnQ2hlY2tpbmcgTGF1bmNoIFRlbXBsYXRlJyxcbiAgICAgICAgICAgIGxhdW5jaFRlbXBsYXRlSWQ6IGFtaSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGx0cyA9IGF3YWl0IGVjMi5zZW5kKG5ldyBEZXNjcmliZUxhdW5jaFRlbXBsYXRlVmVyc2lvbnNDb21tYW5kKHsgTGF1bmNoVGVtcGxhdGVJZDogYW1pLCBWZXJzaW9uczogWyckTGF0ZXN0J10gfSkpO1xuICAgICAgICAgIGlmIChsdHMuTGF1bmNoVGVtcGxhdGVWZXJzaW9ucz8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICBhd2FpdCBjdXN0b21SZXNvdXJjZVJlc3BvbmQoZXZlbnQsICdGQUlMRUQnLCBgJHthbWl9IGRvZXNuJ3QgZXhpc3RgLCAnRVJST1InLCB7fSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWx0cy5MYXVuY2hUZW1wbGF0ZVZlcnNpb25zWzBdLkxhdW5jaFRlbXBsYXRlRGF0YT8uSW1hZ2VJZCkge1xuICAgICAgICAgICAgYXdhaXQgY3VzdG9tUmVzb3VyY2VSZXNwb25kKGV2ZW50LCAnRkFJTEVEJywgYCR7YW1pfSBkb2Vzbid0IGhhdmUgYW4gQU1JYCwgJ0VSUk9SJywge30pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgaGFuZGxlQW1pKGV2ZW50LCBsdHMuTGF1bmNoVGVtcGxhdGVWZXJzaW9uc1swXS5MYXVuY2hUZW1wbGF0ZURhdGEuSW1hZ2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYW1pLm1hdGNoKCdeYXJuOmF3c1teOl0qOmltYWdlYnVpbGRlcjpbXjpdKzpbXjpdKzppbWFnZS8uKiQnKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgICAgIG5vdGljZTogJ0NoZWNraW5nIEltYWdlIEJ1aWxkZXInLFxuICAgICAgICAgICAgaW1hZ2VCdWlsZFZlcnNpb25Bcm46IGFtaSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGltZyA9IGF3YWl0IGliLnNlbmQobmV3IEdldEltYWdlQ29tbWFuZCh7IGltYWdlQnVpbGRWZXJzaW9uQXJuOiBhbWkgfSkpO1xuICAgICAgICAgIGNvbnN0IGFjdHVhbEFtaSA9IGltZy5pbWFnZT8ub3V0cHV0UmVzb3VyY2VzPy5hbWlzPy5bMF0/LmltYWdlO1xuICAgICAgICAgIGlmICghYWN0dWFsQW1pKSB7XG4gICAgICAgICAgICBhd2FpdCBjdXN0b21SZXNvdXJjZVJlc3BvbmQoZXZlbnQsICdGQUlMRUQnLCBgJHthbWl9IGRvZXNuJ3QgaGF2ZSBhbiBBTUlgLCAnRVJST1InLCB7fSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCBoYW5kbGVBbWkoZXZlbnQsIGFjdHVhbEFtaSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBjdXN0b21SZXNvdXJjZVJlc3BvbmQoZXZlbnQsICdGQUlMRUQnLCBgVW5rbm93biB0eXBlIG9mIEFNSSAke2FtaX1gLCAnRVJST1InLCB7fSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRGVsZXRlJzpcbiAgICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICAgIG5vdGljZTogJ05vdGhpbmcgdG8gZGVsZXRlJyxcbiAgICAgICAgICBhbWksXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBjdXN0b21SZXNvdXJjZVJlc3BvbmQoZXZlbnQsICdTVUNDRVNTJywgJ09LJywgZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkLCB7fSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3Ioe1xuICAgICAgbm90aWNlOiAnRmFpbGVkIHRvIHJlc29sdmUgQU1JIHJvb3QgZGV2aWNlJyxcbiAgICAgIGVycm9yOiBgJHtlfWAsXG4gICAgfSk7XG4gICAgYXdhaXQgY3VzdG9tUmVzb3VyY2VSZXNwb25kKGV2ZW50LCAnRkFJTEVEJywgKGUgYXMgRXJyb3IpLm1lc3NhZ2UgfHwgJ0ludGVybmFsIEVycm9yJywgY29udGV4dC5sb2dTdHJlYW1OYW1lLCB7fSk7XG4gIH1cbn1cbiJdfQ==