错误检索EC2实例的公共DNS名称

问题描述 投票:0回答:2

我试图检索EC2实例的公共DNS名称。

这是我的python3脚本。

import sys
import boto3
from botocore.exceptions import ClientError

instance_id = "i-03e7f6391a0f523ee"
action = 'ON'

ec2 = boto3.client('ec2')


if action == 'ON':
    # Do a dryrun first to verify permissions
    try:
        ec2.start_instances(InstanceIds=[instance_id], DryRun=True)
    except ClientError as e:
        if 'DryRunOperation' not in str(e):
            raise

    # Dry run succeeded, run start_instances without dryrun
    try:
        response = ec2.start_instances(InstanceIds=[instance_id], DryRun=False)
        print(response)
    except ClientError as e:
        print(e)
else:
    # Do a dryrun first to verify permissions
    try:
        ec2.stop_instances(InstanceIds=[instance_id], DryRun=True)
    except ClientError as e:
        if 'DryRunOperation' not in str(e):
            raise

    # Dry run succeeded, call stop_instances without dryrun
    try:
        response = ec2.stop_instances(InstanceIds=[instance_id], DryRun=False)
        print(response)
    except ClientError as e:
        print(e)

instance = ec2.Instance('i-1234567890123456')
while instance.state['Name'] not in ('running', 'stopped'):
        sleep(5)
        print("the instance is initializing")

#pubdns=instance.PublicDnsName

#print ("public dns name"+pubdns)
def get_name(inst):
    client = boto3.client('ec2')
    response = client.describe_instances(InstanceIds = [inst[0].instance_id])
    foo = response['Reservations'][0]['Instances'][0]['NetworkInterfaces'][0]['Association']['PublicDnsName']
    return foo


foo = get_name(instance_id)
print (foo)

如果我使用

ec2 = boto3.client('ec2')

在上面的代码中,我得到以下错误:

AttributeError的:“EC2”对象有没有属性“实例”

如果我使用

ec2 = boto3.resource('ec2')

然后我得到这个错误,而不是:

AttributeError的:“ec2.ServiceResource”对象有没有属性“start_instances”

我想要做的是能够连接到一个EC2实例并检索其publicdns名。

我现在已经改变了代码基于下面的建议

import sys
import boto3


instance_id = "i-03e7f6391a0f523ee"
action = 'ON'

ec2 = boto3.client('ec2')
#instance = ec2.resource('ec2').instance(instance_id)
if action == 'ON':
   response = ec2.start_instances(InstanceIds=[instance_id], DryRun=False)
else:
    response = ec2.stop_instances(InstanceIds=[instance_id], DryRun=False)
print(response)



def get_name(inst):
    client = boto3.client('ec2')
    response = client.describe_instances(InstanceIds = [inst[0].instance_id])
    foo = response['Reservations'][0]['Instances'][0]['NetworkInterfaces'][0]['Association']['PublicDnsName']
    return foo


foo = get_name(instance_id)
print (foo)

但现在我得到错误

in get_name
    response = client.describe_instances(InstanceIds = [inst[0].instance_id])
AttributeError: 'str' object has no attribute 'instance_id'
python python-3.x amazon-web-services amazon-ec2 boto3
2个回答
0
投票

你在一个混为一谈两个概念。

boto3.client创建,通过它您查找的资源,如EC2的对象。

一旦你有资源,你就可以开始操纵它。

采用

ec2 = boto3.client('ec2')

接着

instance = ec2.resource('ec2').instance(instance_id)

第二个从EC2资源,而不是boto3 EC2客户端查找您的EC2实例。


0
投票

这是在任何情况下命中一个在这里将来我张贴切换它们后it.This将打印所有实例的公共DNS名称的工作代码,然后关闭它们。

  import boto3
from pprint import pprint


ec2=boto3.client('ec2')
response=ec2.describe_instances()
print (response)

instancelist = []
for reservation in (response["Reservations"]):
    for instance in reservation["Instances"]:
        instancelist.append(instance["InstanceId"])
print (instancelist)


action ='ON'
if action == 'ON':
   response = ec2.start_instances(InstanceIds=instancelist, DryRun=False)

ec2client = boto3.resource('ec2')
#response = ec2client.describe_instances()


instances = ec2client.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running','stopped']}])
ids = []

for instance in instances:
    print(instance.id, instance.instance_type)
    ids.append(instance.id)
    resp=ec2.describe_network_interfaces();
    print ("printing pub dns name")
    print(resp['NetworkInterfaces'][0]['Association']['PublicDnsName'])


ec2client.instances.filter(InstanceIds=ids).stop()
© www.soinside.com 2019 - 2024. All rights reserved.