Как получить public_dns_name в соответствии с экземпляром ресурса ec2? - PullRequest
1 голос
/ 27 марта 2020

Теперь я хочу получить public_dns_name, а затем войти в систему на экземпляре aws, чтобы получить загрузку ЦП. Я знаю, что могу проверить это с помощью 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

Ответы [ 2 ]

0 голосов
/ 27 марта 2020


Попробуйте это ...

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

0 голосов
/ 27 марта 2020

Значение для public_dns_name еще не назначено.

Это может быть связано с

  1. Экземпляр еще не running. Вы пытаетесь получить имя DNS, как только вызывается метод create_instances. Экземпляру требуется несколько секунд, чтобы достичь состояния running. public_dns_name недоступен, пока экземпляр не достигнет состояния running. Проверьте состояние экземпляра и дождитесь его запуска, прежде чем пытаться получить DNS-имя Publi c.

Простое исправление без нарушения остального кода:

Обновление: Объект instance необходимо перезагрузить после того, как официант обнаружит обновленные атрибуты экземпляра.

instance = instance[0]
instance.wait_until_running()
instance.reload()
print("1",instance.private_ip_address)
print("2",instance.public_dns_name)
DNS-имена хостов не включены в вашем VP C.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...