-
Notifications
You must be signed in to change notification settings - Fork 15
/
LookupAMIId.js
90 lines (82 loc) · 2.64 KB
/
LookupAMIId.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/**
*
* Handler called by Lambda function.
* @param {object} event - event parameter gets the attributes from CFN trigger.
* @param {object} context - context parameter used to log details to CloudWatch log stream.
*
*/
exports.handler = function(event, context) {
var aws = require('aws-sdk');
var https = require('https');
var url = require('url');
if (event.RequestType === 'Delete') {
sendResponse(event, context, 'SUCCESS');
return;
}
var responseStatus = 'FAILED';
var responseData = {};
var ec2 = new aws.EC2({ region: event.ResourceProperties.Region });
var describeImagesParams = {
Filters: [
{
Name: 'name',
Values: [event.ResourceProperties.AMIName]
}
],
Owners: [event.ResourceProperties.AMIOwner]
};
// Get AMI IDs with the specified name pattern and owner
ec2.describeImages(describeImagesParams, function(err, data) {
if (err) {
responseData = { Error: 'DescribeImages call failed' };
console.log(responseData.Error + ':\n', err);
}
else {
var images = data.Images;
// Sort images by name in descending order -- the names contain the AMI version formatted as YYYY.MM.Ver.
images.sort(function(x, y) { return y.Name.localeCompare(x.Name); });
for (var i = 0; i < images.length; i++) {
responseStatus = 'SUCCESS';
responseData.Id = images[i].ImageId;
break;
}
console.log('AMI ID is ', responseData.Id);
}
sendResponse(event, context, responseStatus, responseData);
});
};
// Sends a response to the pre-signed S3 URL
var sendResponse = function(event, context, responseStatus, responseData) {
var responseBody = JSON.stringify({
Status: responseStatus,
Reason: 'See the details in CloudWatch Log Stream: ' + context.logStreamName,
PhysicalResourceId: context.logStreamName,
StackId: event.StackId,
RequestId: event.RequestId,
LogicalResourceId: event.LogicalResourceId,
Data: responseData
});
console.log('RESPONSE BODY:\n', responseBody);
var parsedUrl = url.parse(event.ResponseURL);
var options = {
hostname: parsedUrl.hostname,
port: 443,
path: parsedUrl.path,
method: 'PUT',
headers: {
'Content-Type': '',
'Content-Length': responseBody.length
}
};
var req = https.request(options, function(res) {
console.log('STATUS:', res.statusCode);
console.log('HEADERS:', JSON.stringify(res.headers));
context.succeed('Successfully sent stack response!');
});
req.on('error', function(err) {
console.log('sendResponse Error:\n', err);
context.fail(err);
});
req.write(responseBody);
req.end();
};