eureka-js-client-aws
Version:
Eureka Client based on eureka-js-client, with AWS ECS support
102 lines (82 loc) • 4.19 kB
JavaScript
;
exports.__esModule = true;
var _request = require('request');
var _request2 = _interopRequireDefault(_request);
var _Logger = require('./Logger');
var _Logger2 = _interopRequireDefault(_Logger);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/*
Utility class for pulling AWS metadata that Eureka requires when
registering as an Amazon instance (datacenter) on ECS Fargate v4 (1.4.0).
https://docs.aws.amazon.com/AmazonECS/latest/userguide/task-metadata-endpoint-v4-fargate.html
*/
var AwsFargateMetadata = function () {
//TODO Add support for another versions of ECS Fargate metadata endpoints (v3 and future versions). Currently (July 2022) only v4 is supported.
function AwsFargateMetadata() {
var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, AwsFargateMetadata);
this.logger = config.logger || new _Logger2.default();
this.host = process.env.ECS_CONTAINER_METADATA_URI_V4;
}
AwsFargateMetadata.prototype.fetchMetadata = function fetchMetadata(resultsCallback) {
var _this = this;
_request2.default.get({
url: this.host
}, function (error, response, body) {
if (error || response.statusCode !== 200) {
console.error('Eureka Client - Error requesting metadata: ' + error);
resultsCallback(null);
} else {
console.debug('Eureka - Received metadata: ' + JSON.stringify(body));
var metadata = JSON.parse(body);
var results = {
'ami-id': _this.lookupMetadataKey('ImageID', metadata),
'instance-id': _this.lookupMetadataKey('DockerId', metadata),
'instance-type': 'FARGATE',
'local-ipv4': _this.lookupNetworkMetadata('IPv4Addresses', metadata),
'local-hostname': _this.lookupNetworkMetadata('PrivateDNSName', metadata),
'availability-zone': _this.lookupMetadataKey('AvailabilityZone', metadata),
'public-hostname': _this.lookupNetworkMetadata('PrivateDNSName', metadata),
'public-ipv4': _this.lookupNetworkMetadata('IPv4Addresses', metadata),
'mac': _this.lookupNetworkMetadata('MACAddress', metadata),
'vpc-id': 'awsvpc',
'accountId': _this.lookupInstanceIdentity(metadata)
};
console.debug('Eureka - Parsed Instance AWS Metadata: ' + JSON.stringify(results));
var filteredResults = Object.keys(results).reduce(function (filtered, prop) {
if (results[prop]) filtered[prop] = results[prop];
return filtered;
}, {});
resultsCallback(filteredResults);
}
});
};
AwsFargateMetadata.prototype.lookupMetadataKey = function lookupMetadataKey(key, metadata) {
if (metadata[key] === null || metadata[key] === undefined) {
return null;
}
return metadata[key];
};
AwsFargateMetadata.prototype.lookupNetworkMetadata = function lookupNetworkMetadata(key, metadata) {
if (metadata.Networks && metadata.Networks.length > 0) {
var property = metadata.Networks[0][key];
if (!property) {
return null;
}
return Array.isArray(property) ? property[0] : property;
}
};
AwsFargateMetadata.prototype.lookupInstanceIdentity = function lookupInstanceIdentity(metadata) {
if (metadata.ContainerARN) {
// ContainerARN.split(':')[4] (arn:aws:ecs:us-west-2:111122223333)
var arn = metadata.ContainerARN.split(':');
if (arn.length >= 5) {
return arn[4];
}
}
return null;
};
return AwsFargateMetadata;
}();
exports.default = AwsFargateMetadata;