Pergunta

I am using the Amazon AWS ELB command line tools. Is there a way of finding out the instances attached to a particular Elastic Load Balancer (ELB)?

Foi útil?

Solução

2013/12/18: To update this and since the links are dead!

I installed the new AWS cli tools:

$ pip install awscli

Then ran:

$ aws configure                                                                                                                                                
AWS Access Key ID [None]: my-key
AWS Secret Access Key [None]: my-secret
Default region name [None]: us-east-1
Default output format [None]:

This data is saved into ~/.aws/config.

Then I can find instances connected to a loadbalancer like so:

$ aws elb describe-load-balancers --load-balancer-name "my-name"
{
    "LoadBalancerDescriptions": [
        {
            "Subnets": [],
            "CanonicalHostedZoneNameID": "ID",
            "CanonicalHostedZoneName": "my-name-foo.us-east-1.elb.amazonaws.com",
            "ListenerDescriptions": [
                {
                    "Listener": {
                        "InstancePort": 80,
                        "LoadBalancerPort": 80,
                        "Protocol": "HTTP",
                        "InstanceProtocol": "HTTP"
                    },
                    "PolicyNames": []
                },
                {
                    "Listener": {
                        "InstancePort": 80,
                        "SSLCertificateId": "arn:aws:iam::x:server-certificate/x-ssl-prod",
                        "LoadBalancerPort": 443,
                        "Protocol": "HTTPS",
                        "InstanceProtocol": "HTTP"
                    },
                    "PolicyNames": [
                        "AWSConsole-SSLNegotiationPolicy-api-production"
                    ]
                }
            ],
            "HealthCheck": {
                "HealthyThreshold": 10,
                "Interval": 30,
                "Target": "HTTP:80/healthy.php",
                "Timeout": 5,
                "UnhealthyThreshold": 2
            },
            "BackendServerDescriptions": [],
            "Instances": [
                {
                    "InstanceId": "i-FIRST-INSTANCEID"
                },
                {
                    "InstanceId": "i-SECOND-INSTANCEID"
                }
            ],
            "DNSName": "my-name-foo.us-east-1.elb.amazonaws.com",
            "SecurityGroups": [],
            "Policies": {
                "LBCookieStickinessPolicies": [],
                "AppCookieStickinessPolicies": [],
                "OtherPolicies": [
                    "AWSConsole-SSLNegotiationPolicy-my-name"
                ]
            },
            "LoadBalancerName": "my-name",
            "CreatedTime": "2013-08-05T16:55:22.630Z",
            "AvailabilityZones": [
                "us-east-1d"
            ],
            "Scheme": "internet-facing",
            "SourceSecurityGroup": {
                "OwnerAlias": "amazon-elb",
                "GroupName": "amazon-elb-sg"
            }
        }
    ]
}

The data is in LoadBalancerDescriptions.Instances.

My loadbalancer is called my-name — this is the name you selected when you created it.

Old answer below!

I'm not familiar with the cli tool, but I used the API.

I'd check these two requests:

The cli tool probably has something to resemble these?

HTH!

Outras dicas

Assuming you have aws-cli and jq installed, you can use the following command to get associated ec2 instance ids:

aws elb describe-load-balancers --load-balancer-name my-elb \
  | jq -r '.LoadBalancerDescriptions[].Instances[].InstanceId'

This will return the ec2 ids associated with that ELB.

Side note: I recommend you setup aws cli profiles so you don't have to fiddle with environment variables and region params (as much).

Because I love answers that can be used with a minimum of search/replace and copy paste

Prerequisites : aws-cli configured

pip install awscli
aws configure

Configure : your ELB name

$ELB_NAME = "Your-elb-name"

Copy-n-Paste in terminal

for ID in $(aws elb describe-load-balancers --load-balancer-name $ELB_NAME \
    --query LoadBalancerDescriptions[].Instances[].InstanceId \
    --output=text);
do
    aws ec2 describe-instances --instance-ids $ID \
        --query Reservations[].Instances[].PublicIpAddress \
        --output text
done

Will output a list of Public IPs. You could also just execute the query inside the parenthesis of the for ID in $(...) to just get the instance IDs

Want something different ?

Feel free to have a look at the structure of

aws elb describe-load-balancers --load-balancer-name $ELB_NAME
aws ec2 describe-instances --instance-ids $INSTANCE_ID

and change the query accordingly!

If anyone arrives here from a search as to why the elb-describe-lbs command returns nothing when they have ELBs up and running, what I realised was I needed to add EC2_REGION=eu-west-1 to my environment variables (or use elb-describe-lbs --region command)

If you want to see all your ELB's and the instances attached use JMESPath like this:

aws elb describe-load-balancers --query "LoadBalancerDescriptions[*].{ID:LoadBalancerName,InstanceId:Instances[*].InstanceId}[*]. {ELB:ID,InstanceId:InstanceId[*]}" --output=json

Result

[
    {
        "ELB": "my_name",
        "InstanceId": [
            "i-0cc72"
        ]
    },
    {
        "ELB": "my_name2",
        "InstanceId": [
            "i-02ff5f",
            "i-09e467"
        ]
    }
]

If you know the name of the ELB and want to see what is attached use JMESPath like this:

aws elb describe-load-balancers --load-balancer-name "my_name" --query "LoadBalancerDescriptions[].{ID:LoadBalancerName,InstanceId:Instances[].InstanceId}[].{ELB:ID,InstanceId:InstanceId[]}" --output=json

Result:

[
    {
        "ELB": "my_name",
        "InstanceId": [
            "i-02ff5f72",
            "i-09e46743"
        ]
    }
]

replace INSTANCEID with actual instance id

aws elb describe-load-balancers --query "LoadBalancerDescriptions[*].{ID:LoadBalancerName,InstanceId:Instances[?InstanceId=='INSTANCEID'].InstanceId}[*].{ID:ID,InstanceId:InstanceId[0]}" --output=text | grep INSTANCEID | awk '{print $1}'

In node.js you can do this by using aws-sdk.

var AWS = require('aws-sdk')
var options = {
  accessKeyId: 'accessKeyId',
  secretAccessKey: 'secretAccessKey',
  region: 'region'
}
var elb = new AWS.ELB(options)

elb.describeLoadBalancers({LoadBalancerNames: ['elbName']}, function(err, data) {
  if (err) {
    console.log('err: ', err)
  }
  else {
    console.log('data: ', data.LoadBalancerDescriptions)
  }
})

data.LoadBalancerDescriptions is an array and each element in the array is an object with the property Instances that has the instance id.

You can loop trough all you load balancer instance ids as follows:

while read -r lb ; do echo -e "\n\n start lb: $lb " ; \
echo run cmd on lb: $lb ; echo " stop  lb: $lb" ; \
done < <(aws elb describe-load-balancers --query \
'LoadBalancerDescriptions[].Instances[].InstanceId' \
 --profile dev|perl -nle 's/\s+/\n/g;print')

You can loop trough your load balancers names as follows :

    # how-to loop trough all your load balancer names 
    while read -r lb ; do \
        echo -e "\n\n start lb: $lb " ; \
        echo run cmd on lb: $lb ; \
        echo " stop  lb: $lb" ; \
    done < <(aws elb describe-load-balancers --query \
    'LoadBalancerDescriptions[].LoadBalancerName' \
    --profile rnd|perl -nle 's/\s+/\n/g;print')

Provided that you have configured your aws cli : src: http://docs.aws.amazon.com/cli/latest/topic/config-vars.html cat << "EOF" > ~/.aws/config

[profile dev]
output = text
region = us-east-1
[profile dev]
output = text
region = us-east-1
[default]
output = text
region = Global

EOF 

And configured your security credentials:

    # in aws admin console :
    # Services => iam => users => <<your_username>> => Security Credentials => Access Keys
    # configure the aws cli
    cat << "EOF" > ~/.aws/credentials
    [dev]
    aws_access_key_id = <<your_aws_access_key_id_in_the_dev_environment>>
    aws_secret_access_key = <<your_aws_secret_access_key_in_dev_env>>
    [dev]
    aws_access_key_id = <<your_aws_access_key_id_in_the_dev_environment>>
    aws_secret_access_key = <<your_aws_secret_access_key_in_dev_env>>
    [default]
    aws_access_key_id = <<your_aws_access_key_id_in_the_dev_environment>>
    aws_secret_access_key = <<your_aws_secret_access_key_in_dev_env>>
    EOF

aws elb describe-load-balancers --load-balancer-name "LB_NAME" | grep "InstanceId" | awk '{print $2}' | sed 's/\"//g'

First do elb-describe-lbs to get a list of your load balancers and their names.

Then do elb-describe-instance-health <LB_NAME> to get a list of instances behind that load balancer. LB_NAME is the value of the 2nd column in the output of elb-describe-lbs.

You can use AWS command line tools with some bash piping:

elb-describe-instance-health loadbalancer_name --region eu-west-1 | awk '{ print $2 }' | xargs ec2-describe-instances --region eu-west-1 | grep ^INSTANCE | awk '{ print $4 }'

This will give you the public DNS name for every instance attached to the ELB, you can change the awk columns respectively to get other details.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top