2012-06-08 64 views
4

我想通過boto獲取LoadBalancer上的所有實例,我該如何實現這一點?如何獲取使用Boto綁定到LoadBalancer的所有EC2實例的地址?

這是我到目前爲止有:

<ErrorResponse xmlns="http://webservices.amazon.com/AWSFault/2005-15-09"> 
    <Error> 
    <Type>Sender</Type> 
    <Code>InvalidAction</Code> 
    <Message>Could not find operation DescribeInstances for version 2012-03-01</Message> 
    </Error> 
    <RequestId>c6aab70d-b22b-11e1-a990-a747bbde9f63</RequestId> 
</ErrorResponse> 

我使用博託2.4.1:

import boto 
from boto.regioninfo import RegionInfo 
from boto import ec2 

ACCESS_KEY_ID = '*****' 
SECRET_ACCESS_KEY = '********' 

reg = RegionInfo(
    name='ap-southeast-1', 
    endpoint='elasticloadbalancing.ap-southeast-1.amazonaws.com') 

conn = boto.connect_elb(
    aws_access_key_id=ACCESS_KEY_ID, 
    aws_secret_access_key=SECRET_ACCESS_KEY, 
    region=reg) 

ec2_connection = boto.ec2.connection.EC2Connection(
    aws_access_key_id=ACCESS_KEY, 
    aws_secret_access_key=SECRET_ACCESS_KEY, 
    region=reg) 

instances = [ instance.id for instance in conn.get_all_load_balancers()[3].instances ] 
# instances is now [u'i-62448d36'], so far so good. 
ec2_connection.get_all_instances(instances) 

與結束。

+0

這是因爲您創建的RegionInfo對象在其中具有彈性負載平衡端點,而不是ec2端點。你必須創建另一個RegionInfo爲EC2或者您可以使用 「導入boto.ec2; ec2_connection = boto.ec2.connect_to_region( 'AP-southest-1')」 來獲得EC2Connection對象。 – garnaat

+0

@garnaat嗯,我注意到過了一會兒。我不能在該地區使用同一個對象,這有點違反直覺。 –

回答

10

這是我結束了:

import boto 
from boto import regioninfo 
from boto import ec2 

ACCESS_KEY_ID = '***********' 
SECRET_ACCESS_KEY = '***********' 

elb_region = boto.regioninfo.RegionInfo(
    name='ap-southeast-1', 
    endpoint='elasticloadbalancing.ap-southeast-1.amazonaws.com') 

elb_connection = boto.connect_elb(
    aws_access_key_id=ACCESS_KEY_ID, 
    aws_secret_access_key=SECRET_ACCESS_KEY, 
    region=elb_region) 

ec2_region = ec2.get_region(
    aws_access_key_id=ACCESS_KEY_ID, 
    aws_secret_access_key=SECRET_ACCESS_KEY, 
    region_name='ap-southeast-1') 

ec2_connection = boto.ec2.connection.EC2Connection(
    aws_access_key_id=ACCESS_KEY_ID, 
    aws_secret_access_key=SECRET_ACCESS_KEY, 
    region=ec2_region) 

load_balancer = elb_connection.get_all_load_balancers(load_balancer_names=['MediaPopClients'])[0] 
instance_ids = [ instance.id for instance in load_balancer.instances ] 
reservations = ec2_connection.get_all_instances(instance_ids) 
instance_addresses = [ i.public_dns_name for r in reservations for i in r.instances ] 

給出:

[u'ec2-46-137-194-58.ap一南1.compute.amazonaws。 com']

+0

使用上面的腳本時,我收到InvalidCertificateException,看起來像是ssl證書有問題。 –

+0

@ManjitKumar它與腳本無關。您的計算機證書可能已過時,可能是防火牆的事情,可能是博託需要更新,可能是一個暫時的呃逆。 –

4

我覺得這樣的事情應該工作:

>>> import boto 
>>> elb = boto.connect_elb() 
>>> load_balancer = elb.get_all_load_balancers(['my_lb_name'])[0] 
>>> for instance_info in load_balancer.instances: 
... print instance_info.id 

負載均衡器對象的實例屬性是InstanceInfo對象的列表。這些不是實際的Instance對象,但它具有實例ID,因此您可以查找與其關聯的Instance對象。

+0

謝謝,這就是我昨天得到的。當我嘗試獲取實例ID的詳細信息時,似乎AWS正在抱怨,您是否設法自己檢索了詳細信息? –

相關問題