【问题标题】:How to get public_dns_name according to ec2 resource instance?如何根据ec2资源实例获取public_dns_name?
【发布时间】:2020-03-27 21:29:30
【问题描述】:

现在我想获取public_dns_name,然后登录到一个aws实例来获取CPU利用率。我知道用cloudwatch可以查,但是现在不想依赖amazon提供的功能直接基于linux查。我怎样才能得到它?

ec2 = boto3.resource('ec2',
                     aws_access_key_id=settings.AWS.get("aws_access_key_id"),
                     aws_secret_access_key=settings.AWS.get("aws_secret_access_key"),
                     region_name=settings.AWS.get("region_name"))

user_data_script = """#cloud-config
   runcmd:
    - sudo systemctl start docker
    - cd /srv/app/kfquantum
    - sudo docker run --env broker=%s \
                      --env result=redis://10.0.0.245:6379/0 \
                      --env host=kf-db.cluster-crietao0wrdu.rds.cn-northwest-1.amazonaws.com.cn \
                      --env user=db \
                      --env pw=y6y83aGagY8hgXZ \
                      -w /kfquantum -d --restart unless-stopped --name kf-celery kf-celery \
                      celery -A kfquantum worker --pool=solo -l info
   """ % settings.BROKER_URL
instance_type = "c5.large"
instance = ec2.create_instances(
    BlockDeviceMappings=[
        {
            "DeviceName": "/dev/xvda",
            'Ebs': {
                'DeleteOnTermination': True,
                'VolumeSize': 8
            },
        },
    ],
    ImageId="ami-09feea664bfc54194",
    MinCount=1,
    MaxCount=1,
    Placement={'AvailabilityZone': 'cn-northwest-1a'},
    InstanceType=instance_type,
    UserData=user_data_script,
    NetworkInterfaces=[
        {
            'DeviceIndex': 0,
            'SubnetId': "subnet-093161e8b00deb367",
            'AssociatePublicIpAddress': True
        },
    ]
)
instance = instance[0]
print("1",instance.private_ip_address)
print("2",instance.public_dns_name)

控制台

1,10.0.0.73
2

【问题讨论】:

    标签: python amazon-web-services amazon-ec2 boto3


    【解决方案1】:


    试试这个...

    instance= instance[0]
    print('***Success!! instance:', instance.id, 'created, and instance-state-name:', instance.state['Name'])           
    
    instance.wait_until_running()           
    instance.reload()
    
    print('***instance:', instance.id, 'is now up, and instance-state-name:', instance.state['Name'])
    print('***private ipa:', instance.private_ip_address)
    print('***public ipa:', instance.public_dns_name)
    

    希望对您有所帮助...
    r0ck

    【讨论】:

      【解决方案2】:

      public_dns_name 的值尚未分配。

      这可能是由于

      1. 实例还不是running。您正在尝试在调用 create_instances 方法后立即获取 DNS 名称。实例需要几秒钟才能达到running 状态。在实例达到running 状态之前,public_dns_name 不可用。检查实例状态并等待它运行,然后再尝试获取公共 DNS 名称。

      在不干扰其余代码的情况下,一个简单的修复方法是,

      更新: instance 对象必须在等待检测到更新的实例属性之后重新加载。

      instance = instance[0]
      instance.wait_until_running()
      instance.reload()
      print("1",instance.private_ip_address)
      print("2",instance.public_dns_name)
      
      1. 您的 VPC 中未启用 DNS 主机名。

      【讨论】:

      • Thx,我试过了,我在aws控制台看到,3秒后,这个实例一直在运行,然后我花了几秒钟得到public_dns_name,仍然没有得到。请问如何通过boto.resource和create_instances的方法获取public_dns_name?有代码可以参考吗? (我知道客户端创建的实例比较容易获取。但是资源方法很难,它是高级aws实例)
      • 您在控制台中签入时是否分配了公共 DNS 名称?
      • 是的,它确实有公共 DNS 名称,就像这个 ec2-52-82-27-49.cn-northwest-1.compute.amazonaws.com.cn。现在我想从我的 python 代码中得到这个。
      • 当然,在此之前您可以更新问题中的代码,以显示您在尝试获取 DNS 之前如何等待实例达到运行状态?
      • 没有错误,但仍然返回 None,需要添加 "instance.reload()" ,谢谢 :)
      猜你喜欢
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 2022-08-06
      • 1970-01-01
      • 2019-10-19
      相关资源
      最近更新 更多