我只需要从AWS获得RUNNING IP,该功能仅提取列为EIP的IP,其中包括非关联IP。
def gather_public_ip():
ACCESS_KEY = config.get('aws','access_key')
SECRET_KEY = config.get('aws','secret_key')
regions = ['ap-northeast-1']
all_EIP = []
for region in regions:
client = boto3.client('ec2',aws_access_key_id=ACCESS_KEY,aws_secret_access_key=SECRET_KEY,region_name=region,)
addresses_dict = client.describe_addresses()
for eip_dict in addresses_dict['Addresses']:
print eip_dict['PublicIp']
return eip_dict['PublicIp']
有人可以帮帮我吗?
答案 0 :(得分:0)
您可以通过以下查询获得
aws ec2 describe-instances --filters "Name=instance-state-code, Values=16" --query "Reservations[*].Instances[*].PrivateIpAddress" --output text
aws ec2 describe-instances --filters "Name=instance-state-code, Values=16" --query "Reservations[*].Instances[*].PublicIpAddress" --output text
要转换为python代码,您可以执行类似
的操作response = client.describe_instances(
Filters=[
{
'Name': 'instance-state-code',
'Values': [
'16',
]
},
],)
然后,您需要阅读有关Reservations[*].Instances[*].PrivateIpAddress
和Reservations[*].Instances[*].PublicIPAddress
instance-state-code
的定义/可能值为
实例的状态,为16位无符号 整数。高字节是一个不透明的内部值,应该是 忽略。基于所表示的状态设置低字节。有效 值为:0(挂起),16(运行),32(关闭),48 (终止),64(停止)和80(停止)。
答案 1 :(得分:0)
如下所示,您需要通过查看预留/实例数据来过滤掉正在运行的实例。我还添加了一个检查主机是否有公共IP
e = client.describe_instances()
for r in e['Reservations']:
if r['Instances'][0]['State']['Name'] == 'running'\
and 'PublicIpAddress' in r['Instances'][0]:
print r['Instances'][0]['PublicIpAddress']
答案 2 :(得分:0)
关联的EIP将具有相应的PrivateIpAddress
。如果没有关联EIP,则eip_dict将没有PrivateIpAddress
。所以只需在代码中添加一个额外的检查:
for eip_dict in addresses_dict['Addresses']:
if 'PrivateIpAddress' in eip_dict:
print eip_dict['PublicIp']
这将打印所有关联的弹性IP地址 - 无论实例是否正在运行。如果您真的只想要运行实例的弹性IP地址,那么您必须应用另一个过滤器。使用Vorsprung提出的解决方案来获取正在运行的实例并过滤列表。