UNPKG

eureka-js-client-aws

Version:

Eureka Client based on eureka-js-client, with AWS ECS support

102 lines (82 loc) 4.19 kB
'use strict'; 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;