in lambda/index.js [37:166]
async function handler(event, context) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _l, _m, _o, _p;
try {
let AWS;
if (!latestSdkInstalled && event.ResourceProperties.InstallLatestAwsSdk === 'true') {
try {
installLatestSdk();
AWS = require('/tmp/node_modules/aws-sdk');
} catch (e) {
console.log(`Failed to install latest AWS SDK v2: ${e}`);
AWS = require('aws-sdk'); // Fallback to pre-installed version
}
} else if (latestSdkInstalled) {
AWS = require('/tmp/node_modules/aws-sdk');
} else {
AWS = require('aws-sdk');
}
console.log(JSON.stringify(event));
console.log('AWS SDK VERSION: ' + AWS.VERSION);
event.ResourceProperties.Create = decodeCall(event.ResourceProperties.Create);
event.ResourceProperties.Update = decodeCall(event.ResourceProperties.Update);
event.ResourceProperties.Delete = decodeCall(event.ResourceProperties.Delete);
// Default physical resource id
let physicalResourceId;
switch (event.RequestType) {
case 'Create':
physicalResourceId = (_j = (_f = (_c = (_b = (_a = event.ResourceProperties.Create) === null || _a === void 0 ? void 0 : _a.physicalResourceId) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : (_e = (_d = event.ResourceProperties.Update) === null || _d === void 0 ? void 0 : _d.physicalResourceId) === null || _e === void 0 ? void 0 : _e.id) !== null && _f !== void 0 ? _f : (_h = (_g = event.ResourceProperties.Delete) === null || _g === void 0 ? void 0 : _g.physicalResourceId) === null || _h === void 0 ? void 0 : _h.id) !== null && _j !== void 0 ? _j : event.LogicalResourceId;
break;
case 'Update':
case 'Delete':
physicalResourceId = (_o = (_m = (_l = event.ResourceProperties[event.RequestType]) === null || _l === void 0 ? void 0 : _l.physicalResourceId) === null || _m === void 0 ? void 0 : _m.id) !== null && _o !== void 0 ? _o : event.PhysicalResourceId;
break;
}
let data = {};
const call = event.ResourceProperties[event.RequestType];
if (call) {
if (call.assumedRoleArn) {
const timestamp = (new Date()).getTime();
const params = {
RoleArn: call.assumedRoleArn,
RoleSessionName: `${physicalResourceId}-${timestamp}`,
};
AWS.config.credentials = new AWS.ChainableTemporaryCredentials({
params: params,
});
}
const awsService = new AWS[call.service]({
apiVersion: call.apiVersion,
region: call.region,
});
try {
const response = await awsService[call.action](call.parameters && decodeSpecialValues(call.parameters, physicalResourceId)).promise();
console.log('TaskDef Response:', JSON.stringify(response));
let taskDefinition = response.taskDefinition;
taskDefinition.containerDefinitions[0].image = event.ResourceProperties['imagePlaceHolder']
let taskdef = JSON.stringify(taskDefinition);
const s3 = new AWS['S3']({
apiVersion: call.apiVersion,
region: call.region,
});
let zip = new AdmZip();
zip.addFile('taskdef.json', taskdef)
const zippedContent = zip.toBuffer();
let s3Param = {
Body: zippedContent,
Bucket: event.ResourceProperties['s3Bucket'],
Key: event.ResourceProperties['s3Key'],
}
const s3Response = await s3['putObject'](s3Param).promise();
data = {
...s3Response
}
} catch (e) {
if (!call.ignoreErrorCodesMatching || !new RegExp(call.ignoreErrorCodesMatching).test(e.code)) {
throw e;
}
}
if ((_p = call.physicalResourceId) === null || _p === void 0 ? void 0 : _p.responsePath) {
physicalResourceId = flatData[call.physicalResourceId.responsePath];
}
}
await respond('SUCCESS', 'OK', physicalResourceId, data);
} catch (e) {
console.log(e);
await respond('FAILED', e.message || 'Internal Error', "failed", {});
}
function respond(responseStatus, reason, physicalResourceId, data) {
const responseBody = JSON.stringify({
Status: responseStatus,
Reason: reason,
PhysicalResourceId: physicalResourceId,
StackId: event.StackId,
RequestId: event.RequestId,
LogicalResourceId: event.LogicalResourceId,
NoEcho: false,
Data: data,
});
console.log('Responding', responseBody);
// eslint-disable-next-line @typescript-eslint/no-require-imports
const parsedUrl = require('url').parse(event.ResponseURL);
const requestOptions = {
hostname: parsedUrl.hostname,
path: parsedUrl.path,
method: 'PUT',
headers: {'content-type': '', 'content-length': responseBody.length},
};
return new Promise((resolve, reject) => {
try {
// eslint-disable-next-line @typescript-eslint/no-require-imports
const request = require('https').request(requestOptions, resolve);
request.on('error', reject);
request.write(responseBody);
request.end();
} catch (e) {
reject(e);
}
});
}
}