4

I created one ELB and attached a few instances to this ELB. So when I login into one of these attached instance, I would like to type a command or run a nodejs script that can return me the its ELB name. Is it possible? I know I can look up on AWS console but I'm looking for a way to look it up programmatically. If possible, I would like to see how it is done in either command or AWS Nodejs SDK.

Thanks!

Nam Nguyen
  • 169
  • 1
  • 5

6 Answers6

7

If anybody comes here looking for a pure bash solution.

Using jq to filter and parse the response of AWS CLI :

aws elb describe-load-balancers | jq -r '.LoadBalancerDescriptions[] | select(.Instances[].InstanceId == "<YOUR-INSTANCE-ID>") | .LoadBalancerName ' 

Also in aws-codedeploy-samples they define this function in common_functions.sh. I haven't tested it as I use ASG, but I suppose it will work

# Usage: get_elb_list <EC2 instance ID>
#
#   Finds all the ELBs that this instance is registered to. After execution, the variable
#   "INSTANCE_ELBS" will contain the list of load balancers for the given instance.
#
#   If the given instance ID isn't found registered to any ELBs, the function returns non-zero
get_elb_list() {
    local instance_id=$1

    local elb_list=""

    local all_balancers=$($AWS_CLI elb describe-load-balancers \
        --query LoadBalancerDescriptions[*].LoadBalancerName \
        --output text | sed -e $'s/\t/ /g')

    for elb in $all_balancers; do
        local instance_health
        instance_health=$(get_instance_health_elb $instance_id $elb)
        if [ $? == 0 ]; then
            elb_list="$elb_list $elb"
        fi
    done

    if [ -z "$elb_list" ]; then
        return 1
    else 
        msg "Got load balancer list of: $elb_list"
        INSTANCE_ELBS=$elb_list
        return 0
    fi
}
Nestor Pina
  • 71
  • 2
  • 5
2

I'm not the greatest in JavaScript but I tested the code below and works. It basically uses the "describeLoadBalancers" API call to get a list of all your ELBs and then iterates through the result to look for your instance. If your instance is registered with a particular load balancer, it's name is output to the console:

// Require AWS SDK for Javascript
var AWS = require('aws-sdk');

// Set API Keys and Region
AWS.config.update({
    "accessKeyId": "<your access key>", 
    "secretAccessKey": "<your secret key>",
    "region": "us-west-1" // specify your region
});

// Get All Load Balancers
function GetLoadBalancers(fn)
{
    var elb = new AWS.ELB();
    elb.describeLoadBalancers(null,function(err, data) {
        fn(data)
    });
}

// Loop through response to check if ELB contains myInstanceId
var myInstanceId = "<your instance id>";
GetLoadBalancers(function(elbs){
    elbs.LoadBalancerDescriptions.forEach(function(elb){
      if(elb.Instances[0] != undefined){
        if (elb.Instances[0].InstanceId == myInstanceId){
            console.log(elb.LoadBalancerName);
        }
      }
    });
});
Arjs
  • 3
  • 2
Ameer Deen
  • 3,598
  • 4
  • 26
  • 27
  • Good but doesn't work with `AWS.ELBv2`. Field `LoadBalancerDescriptions` absent in JSON response of `describeLoadBalancers` in that case. – Atul Aug 02 '19 at 14:42
2

try this script:

#!/bin/bash

instanceId='i-XXXXXXXXXXXXX'

aws elb describe-load-balancers --query \
"LoadBalancerDescriptions[?Instances[?InstanceId=='${instanceId}']].LoadBalancerName"
1

Sure. Use the aws cli:

$ aws elb describe-load-balancers --load-balancer-name "your-elb-name"

The information you're looking for is in LoadBalancerDescriptions.Instances.

EEAA
  • 109,363
  • 18
  • 175
  • 245
  • "your-elb-name" is the one that I don't have and also is the one that I want to get. – Nam Nguyen Apr 03 '14 at 05:26
  • 1
    Well then run the above command without the name flag to get all the ELBs and iterate through them. The information is all there. You just need to filter it out. – EEAA Apr 03 '14 at 06:45
0

An instance could be attached to any number of ELBs.

You could use the API to search all ELBs for your instance.

You might want to consider adding a TAG to your EC2 with information about which ELB it's attached to, so you can query it (the EC2) directly.

Drew Khoury
  • 4,637
  • 8
  • 27
  • 28
  • so there is no such command or file that can retrieve that info. Thanks Drew Khoury – Nam Nguyen Apr 03 '14 at 05:46
  • 1
    @NamNguyen - that's incorrect. All of the AWS API tools support tagging and querying via tags. Even the web console supports this. I think you'd be well-served by spending a couple hours reading AWS docs. – EEAA Apr 03 '14 at 06:54
0

I'd like to add to Paul's excellent answer. This script will prompt for an EC2 instance ID

echo "Enter EC2 instance name?" 

read instanceId

echo
echo The instance name is: $instanceId
echo

aws elb describe-load-balancers --query \
"LoadBalancerDescriptions[?Instances[?InstanceId=='${instanceId}']].LoadBalancerName"
chicks
  • 3,793
  • 10
  • 27
  • 36