我想解决的问题是如何使我的代码在EC2实例中运行,该实例是负载均衡的AWS集群的一部分,知道有多少其他EC2实例使用相同的集群/负载均衡器。
我有以下代码,当给出LoadBalancer的名称时,可以告诉我有多少EC2实例与该Loadbalancer相关联。
DescribeLoadBalancersResult dlbr = loadBalancingClient.describeLoadBalancers();
List<LoadBalancerDescription> lbds = dlbr.getLoadBalancerDescriptions();
for( LoadBalancerDescription lbd : lbds )
{
if( lbd.getDNSName().equalsIgnoreCase("MyLoadBalancer"))
{
System.out.println(lbd.getDNSName() + " has " + lbd.getInstances().size() + " instances") ;
}
}
工作正常并打印出loadbalancer名称,并且实例数与之关联。
但是我想知道是否可以在不提供Loadbalancer名称的情况下获取此信息。在我们的设置中,EC2实例只会与一个Loadbalancer相关联,那么有没有办法从EC2实例返回到Loadbalancer?
我想我可以沿着从所有区域获取所有负载均衡器的路线,遍历它们直到找到包含我的EC2实例的那个,但我想可能有更简单的方法?
答案 0 :(得分:1)
一个有趣的挑战 - 我不得不自己与代码争论,但我的第一反应是在这里使用AWS CLI,并从Java / C#中调用它。
您可以拨打此电话:
aws elb describe-load-balancers
获取有关任何和所有ELB的所有方式的信息,并且可以简单地通过实现调用的实例的实例ID来查询 - 以便找出实例已加入其中的其他朋友同样的ELB。只需调用内部实例元数据即可获取该ID:
http://169.254.169.254/latest/meta-data/instance-id
或者另一种有趣的方法是引导您的实例AMI,以便在它们生成并加入ELB时,它们将自己注册到SimpleDB或DynamoDB表中。我们一直这样做是为了保持网站或软件的当前库存等等。这样你就有了一个列表,然后你可以通过检查“运行”状态来修剪它。
编辑 - 2015年4月13日
@MayoMan我不得不在当前的一些工作中使用它 - 在自动缩放组中识别附加到ELB的健康实例,然后对它们采取行动。我发现'jq'是一个非常有用的命令行工具。您也可以将这些调用直接发送给ELB,但这里描述的是ASG:
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names <ASG Name> | jq -r .AutoScalingGroups[0].Instances[0].HealthStatus
或者列出InstanceIds本身:
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names <ASG Name> | jq -r .AutoScalingGroups[0].Instances[0-3].InstanceId