UNPKG

aws-cdk-neuronx-patterns

Version:
126 lines 16.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.entrypoint = exports.isComplete = exports.onCreate = exports.onEvent = void 0; // eslint-disable-next-line import/no-extraneous-dependencies const client_batch_1 = require("@aws-sdk/client-batch"); // eslint-disable-next-line import/no-extraneous-dependencies const client_lambda_1 = require("@aws-sdk/client-lambda"); const cfn_response_1 = require("./cfn-response"); const region = process.env.AWS_DEFAULT_REGION ?? "us-east-1"; const batch = new client_batch_1.BatchClient({ region, }); const onEvent = async (event, _context, _callback) => { console.log(event); switch (event.RequestType) { case "Create": case "Update": return (0, exports.onCreate)(event, _context, _callback); case "Delete": return {}; } }; exports.onEvent = onEvent; const onCreate = async (event) => { console.log(event); const now = new Date(); const job = await batch.send(new client_batch_1.SubmitJobCommand({ jobName: `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}-${now.getHours()}-${now.getMinutes()}-${now.getSeconds()}`, jobDefinition: process.env.JOB_DEFINITION_ARN, jobQueue: process.env.JOB_QUEUE_ARN, })); console.log(JSON.stringify(job)); return { jobId: job.jobId, PhysicalResourceId: job.jobId, }; }; exports.onCreate = onCreate; const isJobComplete = async (event) => { if (event.RequestType === "Delete") { return { IsComplete: true, }; } const jobs = await batch.send(new client_batch_1.DescribeJobsCommand({ jobs: [event.jobId], })); const job = jobs.jobs?.[0]; if (!job) { throw new Error(`Job (${event.jobId}) is missing`); } switch (job.status) { case "SUCCEEDED": return { IsComplete: true, }; case "FAILED": let errorMessage = `${job.statusReason}.`; if (job.container?.logStreamName) { const encode = (str) => encodeURIComponent(encodeURIComponent(str)); const cloudWatchLogsUrlBase = `https://${region}.console.aws.amazon.com/cloudwatch/home?region=${region}#logsV2:log-groups/log-group/`; const cwLogsUrl = `${cloudWatchLogsUrlBase}${encode("/aws/batch/job")}/log-events/${encode(job.container.logStreamName)}`; errorMessage += `For more details, please see ${cwLogsUrl} .`; } throw new Error(errorMessage); } return { IsComplete: false, }; }; const isComplete = async (event) => { const waitConditionRespond = async (body) => fetch(event.waitConditionCallbackURL, { method: "PUT", headers: { // Content-Type must be empty "Content-Type": "", }, body: JSON.stringify(body), }); try { const result = await isJobComplete(event); if (!result || !result.IsComplete) { return { IsComplete: false, }; } const response = await waitConditionRespond({ Status: "SUCCESS", Reason: "Compile Success", UniqueId: event.jobId, Data: process.env.ARTIFACT_S3_PREFIX, }); console.log("response", await response.text()); return result; } catch (error) { const response = await waitConditionRespond({ Status: "FAILURE", Reason: error.message, UniqueId: event.jobId, }); console.log("response", await response.text()); throw error; } }; exports.isComplete = isComplete; const lambda = new client_lambda_1.LambdaClient(); const entrypoint = async (event, context) => { console.log(event); try { await lambda.send(new client_lambda_1.InvokeCommand({ FunctionName: process.env.PROVIDER_ARN, Payload: JSON.stringify({ ...event, waitConditionCallbackURL: event.ResourceProperties.waitConditionCallbackURL, }), })); await (0, cfn_response_1.cfnRespond)(event, context, "SUCCESS", {}, event.LogicalResourceId, false); } catch (error) { console.log(error); await (0, cfn_response_1.cfnRespond)(event, context, "FAILED", {}, event.LogicalResourceId, false); } }; exports.entrypoint = entrypoint; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYmFzZS9uZXVyb254LWNvbXBpbGVyL3ByaXZhdGUvYXdhaXQtY29tcGlsZS1qb2IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkRBQTZEO0FBQzdELHdEQUkrQjtBQUMvQiw2REFBNkQ7QUFDN0QsMERBQXFFO0FBUXJFLGlEQUE0QztBQUU1QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixJQUFJLFdBQVcsQ0FBQztBQUM3RCxNQUFNLEtBQUssR0FBRyxJQUFJLDBCQUFXLENBQUM7SUFDNUIsTUFBTTtDQUNQLENBQUMsQ0FBQztBQUNJLE1BQU0sT0FBTyxHQUE2QixLQUFLLEVBQ3BELEtBQUssRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULEVBQUU7SUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25CLFFBQVEsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFCLEtBQUssUUFBUSxDQUFDO1FBQ2QsS0FBSyxRQUFRO1lBQ1gsT0FBTyxJQUFBLGdCQUFRLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUUsQ0FBQztRQUMvQyxLQUFLLFFBQVE7WUFDWCxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDLENBQUM7QUFiVyxRQUFBLE9BQU8sV0FhbEI7QUFDSyxNQUFNLFFBQVEsR0FBNkIsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQ2hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUN2QixNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQzFCLElBQUksK0JBQWdCLENBQUM7UUFDbkIsT0FBTyxFQUFFLEdBQUcsR0FBRyxDQUFDLFdB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QUksNkJBQWEsQ0FBQztZQUNoQixZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZO1lBQ3RDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUN0QixHQUFHLEtBQUs7Z0JBQ1Isd0JBQXdCLEVBQ3RCLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyx3QkFBd0I7YUFDcEQsQ0FBQztTQUNILENBQUMsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxJQUFBLHlCQUFVLEVBQ2QsS0FBSyxFQUNMLE9BQU8sRUFDUCxTQUFTLEVBQ1QsRUFBRSxFQUNGLEtBQUssQ0FBQyxpQkFBaUIsRUFDdkIsS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsTUFBTSxJQUFBLHlCQUFVLEVBQ2QsS0FBSyxFQUNMLE9BQU8sRUFDUCxRQUFRLEVBQ1IsRUFBRSxFQUNGLEtBQUssQ0FBQyxpQkFBaUIsRUFDdkIsS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBbkNXLFFBQUEsVUFBVSxjQW1DckIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQge1xuICBCYXRjaENsaWVudCxcbiAgRGVzY3JpYmVKb2JzQ29tbWFuZCxcbiAgU3VibWl0Sm9iQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1iYXRjaFwiO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0IHsgSW52b2tlQ29tbWFuZCwgTGFtYmRhQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1sYW1iZGFcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCB7XG4gIENka0N1c3RvbVJlc291cmNlSXNDb21wbGV0ZUV2ZW50LFxuICBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlSGFuZGxlcixcbiAgdHlwZSBDZGtDdXN0b21SZXNvdXJjZUhhbmRsZXIsXG4gIHR5cGUgQ2RrQ3VzdG9tUmVzb3VyY2VJc0NvbXBsZXRlSGFuZGxlcixcbn0gZnJvbSBcImF3cy1sYW1iZGFcIjtcbmltcG9ydCB7IGNmblJlc3BvbmQgfSBmcm9tIFwiLi9jZm4tcmVzcG9uc2VcIjtcblxuY29uc3QgcmVnaW9uID0gcHJvY2Vzcy5lbnYuQVdTX0RFRkFVTFRfUkVHSU9OID8/IFwidXMtZWFzdC0xXCI7XG5jb25zdCBiYXRjaCA9IG5ldyBCYXRjaENsaWVudCh7XG4gIHJlZ2lvbixcbn0pO1xuZXhwb3J0IGNvbnN0IG9uRXZlbnQ6IENka0N1c3RvbVJlc291cmNlSGFuZGxlciA9IGFzeW5jIChcbiAgZXZlbnQsXG4gIF9jb250ZXh0LFxuICBfY2FsbGJhY2ssXG4pID0+IHtcbiAgY29uc29sZS5sb2coZXZlbnQpO1xuICBzd2l0Y2ggKGV2ZW50LlJlcXVlc3RUeXBlKSB7XG4gICAgY2FzZSBcIkNyZWF0ZVwiOlxuICAgIGNhc2UgXCJVcGRhdGVcIjpcbiAgICAgIHJldHVybiBvbkNyZWF0ZShldmVudCwgX2NvbnRleHQsIF9jYWxsYmFjaykhO1xuICAgIGNhc2UgXCJEZWxldGVcIjpcbiAgICAgIHJldHVybiB7fTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCBvbkNyZWF0ZTogQ2RrQ3VzdG9tUmVzb3VyY2VIYW5kbGVyID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gIGNvbnNvbGUubG9nKGV2ZW50KTtcbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgY29uc3Qgam9iID0gYXdhaXQgYmF0Y2guc2VuZChcbiAgICBuZXcgU3VibWl0Sm9iQ29tbWFuZCh7XG4gICAgICBqb2JOYW1lOiBgJHtub3cuZ2V0RnVsbFllYXIoKX0tJHtub3cuZ2V0TW9udGgoKSArIDF9LSR7bm93LmdldERhdGUoKX0tJHtub3cuZ2V0SG91cnMoKX0tJHtub3cuZ2V0TWludXRlcygpfS0ke25vdy5nZXRTZWNvbmRzKCl9YCxcbiAgICAgIGpvYkRlZmluaXRpb246IHByb2Nlc3MuZW52LkpPQl9ERUZJTklUSU9OX0FSTixcbiAgICAgIGpvYlF1ZXVlOiBwcm9jZXNzLmVudi5KT0JfUVVFVUVfQVJOLFxuICAgIH0pLFxuICApO1xuICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShqb2IpKTtcbiAgcmV0dXJuIHtcbiAgICBqb2JJZDogam9iLmpvYklkLFxuICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogam9iLmpvYklkLFxuICB9O1xufTtcblxuaW50ZXJmYWNlIFdhaXRDb25kaXRpb25SZXF1ZXN0Qm9keSB7XG4gIFN0YXR1czogXCJTVUNDRVNTXCIgfCBcIkZBSUxVUkVcIjtcbiAgVW5pcXVlSWQ6IHN0cmluZztcbiAgUmVhc29uPzogc3RyaW5nO1xuICBEYXRhPzogc3RyaW5nO1xufVxuXG5jb25zdCBpc0pvYkNvbXBsZXRlID0gYXN5bmMgKGV2ZW50OiBDZGtDdXN0b21SZXNvdXJjZUlzQ29tcGxldGVFdmVudCkgPT4ge1xuICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09IFwiRGVsZXRlXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgSXNDb21wbGV0ZTogdHJ1ZSxcbiAgICB9O1xuICB9XG4gIGNvbnN0IGpvYnMgPSBhd2FpdCBiYXRjaC5zZW5kKFxuICAgIG5ldyBEZXNjcmliZUpvYnNDb21tYW5kKHtcbiAgICAgIGpvYnM6IFtldmVudC5qb2JJZF0sXG4gICAgfSksXG4gICk7XG4gIGNvbnN0IGpvYiA9IGpvYnMuam9icz8uWzBdO1xuICBpZiAoIWpvYikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSm9iICgke2V2ZW50LmpvYklkfSkgaXMgbWlzc2luZ2ApO1xuICB9XG4gIHN3aXRjaCAoam9iLnN0YXR1cykge1xuICAgIGNhc2UgXCJTVUNDRUVERURcIjpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIElzQ29tcGxldGU6IHRydWUsXG4gICAgICB9O1xuICAgIGNhc2UgXCJGQUlMRURcIjpcbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBgJHtqb2Iuc3RhdHVzUmVhc29ufS5gO1xuICAgICAgaWYgKGpvYi5jb250YWluZXI/LmxvZ1N0cmVhbU5hbWUpIHtcbiAgICAgICAgY29uc3QgZW5jb2RlID0gKHN0cjogc3RyaW5nKSA9PlxuICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7XG4gICAgICAgIGNvbnN0IGNsb3VkV2F0Y2hMb2dzVXJsQmFzZSA9IGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL2Nsb3Vkd2F0Y2gvaG9tZT9yZWdpb249JHtyZWdpb259I2xvZ3NWMjpsb2ctZ3JvdXBzL2xvZy1ncm91cC9gO1xuICAgICAgICBjb25zdCBjd0xvZ3NVcmwgPSBgJHtjbG91ZFdhdGNoTG9nc1VybEJhc2V9JHtlbmNvZGUoXCIvYXdzL2JhdGNoL2pvYlwiKX0vbG9nLWV2ZW50cy8ke2VuY29kZShqb2IuY29udGFpbmVyLmxvZ1N0cmVhbU5hbWUpfWA7XG4gICAgICAgIGVycm9yTWVzc2FnZSArPSBgRm9yIG1vcmUgZGV0YWlscywgcGxlYXNlIHNlZSAke2N3TG9nc1VybH0gLmA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIElzQ29tcGxldGU6IGZhbHNlLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQ29tcGxldGU6IENka0N1c3RvbVJlc291cmNlSXNDb21wbGV0ZUhhbmRsZXIgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgY29uc3Qgd2FpdENvbmRpdGlvblJlc3BvbmQgPSBhc3luYyAoYm9keTogV2FpdENvbmRpdGlvblJlcXVlc3RCb2R5KSA9PlxuICAgIGZldGNoKGV2ZW50LndhaXRDb25kaXRpb25DYWxsYmFja1VSTCwge1xuICAgICAgbWV0aG9kOiBcIlBVVFwiLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAvLyBDb250ZW50LVR5cGUgbXVzdCBiZSBlbXB0eVxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcIlwiLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIH0pO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGlzSm9iQ29tcGxldGUoZXZlbnQpO1xuICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuSXNDb21wbGV0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgSXNDb21wbGV0ZTogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHdhaXRDb25kaXRpb25SZXNwb25kKHtcbiAgICAgIFN0YXR1czogXCJTVUNDRVNTXCIsXG4gICAgICBSZWFzb246IFwiQ29tcGlsZSBTdWNjZXNzXCIsXG4gICAgICBVbmlxdWVJZDogZXZlbnQuam9iSWQsXG4gICAgICBEYXRhOiBwcm9jZXNzLmVudi5BUlRJRkFDVF9TM19QUkVGSVgsXG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coXCJyZXNwb25zZVwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB3YWl0Q29uZGl0aW9uUmVzcG9uZCh7XG4gICAgICBTdGF0dXM6IFwiRkFJTFVSRVwiLFxuICAgICAgUmVhc29uOiAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UsXG4gICAgICBVbmlxdWVJZDogZXZlbnQuam9iSWQsXG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coXCJyZXNwb25zZVwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5jb25zdCBsYW1iZGEgPSBuZXcgTGFtYmRhQ2xpZW50KCk7XG5leHBvcnQgY29uc3QgZW50cnlwb2ludDogQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUhhbmRsZXIgPSBhc3luYyAoXG4gIGV2ZW50LFxuICBjb250ZXh0LFxuKSA9PiB7XG4gIGNvbnNvbGUubG9nKGV2ZW50KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBsYW1iZGEuc2VuZChcbiAgICAgIG5ldyBJbnZva2VDb21tYW5kKHtcbiAgICAgICAgRnVuY3Rpb25OYW1lOiBwcm9jZXNzLmVudi5QUk9WSURFUl9BUk4sXG4gICAgICAgIFBheWxvYWQ6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgICB3YWl0Q29uZGl0aW9uQ2FsbGJhY2tVUkw6XG4gICAgICAgICAgICBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMud2FpdENvbmRpdGlvbkNhbGxiYWNrVVJMLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgYXdhaXQgY2ZuUmVzcG9uZChcbiAgICAgIGV2ZW50LFxuICAgICAgY29udGV4dCxcbiAgICAgIFwiU1VDQ0VTU1wiLFxuICAgICAge30sXG4gICAgICBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIGF3YWl0IGNmblJlc3BvbmQoXG4gICAgICBldmVudCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBcIkZBSUxFRFwiLFxuICAgICAge30sXG4gICAgICBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH1cbn07XG4iXX0=