我在这个网站和谷歌上搜索过但未能得到答案。
我从EC2实例运行代码,该实例使用boto创建和管理EMR集群。 我可以使用这个框架来获取flow_id(或cluster_id,不确定哪个是正确的名称),它以" j开始 - "并且具有固定数量的字符以识别集群。
使用框架我可以建立一个emr或ec2连接,但对于我的生活,我不能使用boto执行以下操作:
aws emr --list-clusters --cluster-id=j-ASDFGHJKL | json '["instances"].[0].["privateipaddress"]
**以上是有点捏造的,我记不起json格式以及json命令是什么或它想要什么args,但仍然是cli。
我已经使用inspect.getmembers()进行了pprint.pprint()和检查连接,将conn获取到特定的cluster_id,但是我还没有看到这个字段/ var / attribute with或没有方法调用。
我在亚马逊和博托上下,他们是怎么做的 here?
在
中 def test_list_instances(self): #line 317
...
self.assertEqual(response.instances[0].privateipaddress , '10.0.0.60')
...
P.S。我试过this但是python抱怨"实例"属性不可迭代,数组可访问(我忘了" var [0]"命名),以及我尝试过的其他东西,包括检查。 顺便说一句,我可以从这里访问publicDNSaddress,还有很多其他的东西,而不是privateIP ...
请告诉我,如果我在某个地方搞砸了,我可以在哪里找到答案,我使用子流程进行丑陋的修复!
答案 0 :(得分:0)
使用检查您的boto版本
pip show boto
我的猜测是您使用2.24或更早版本,因为此版本未解析实例信息,请参阅https://github.com/boto/boto/blob/2.24.0/tests/unit/emr/test_connection.py#L117
相比
https://github.com/boto/boto/blob/2.25.0/tests/unit/emr/test_connection.py#L313
如果您将您的boto版本升级到2.25或更高版本,您将能够执行以下操作
from boto.emr.connection import EmrConnection
conn = EmrConnection(<your aws key>, <your aws secret key>)
jobid = 'j-XXXXXXXXXXXXXX' # your job id
response = conn.list_instances(jobid)
for instance in response.instances:
print instance.privateipaddress
答案 1 :(得分:0)
如果您要求获取emr的主IP,则以下命令将起作用:
list_intance_resp = boto3.client('emr',region_name='us-east-1').list_instances(ClusterId ='j-XXXXXXX')
print list_intance_resp['Instances'][len(list_intance_resp['Instances'])-1]['PrivateIpAddress']
答案 2 :(得分:0)
您只需要借助EMR群集ID从主实例组中查询主实例。如果您有多个主服务器,则可以解析boto3输出并获取IP(如果第一个列出的主服务器)。
您的Boto3执行环境应有权访问描述群集及其实例组的EMR。这是
emr_list_instance_rep = boto_client_emr.list_instances(
ClusterId=cluster_id,
InstanceGroupTypes=[
'MASTER',
],
InstanceStates=[
'RUNNING',
]
)
return emr_list_instance_rep["Instances"][0]["PrivateIpAddress"]
您可以在https://scriptcrunch.com/script-retrieve-aws-emr-master-ip/
中找到完整的boto3脚本及其说明。