在AWS中启动新实例时,公共IP地址和DNS名称不会作为响应的一部分返回。
创建的计算机分配了公共IP和DNS名称,正如我在Web控制台中看到的那样,但对SDK方法调用的响应没有分配IP和DNS字段值。
我正在使用以下代码:
output, err := ec2session.RunInstances(input)
...
if output.Instances[0].PublicIpAddress == nil {
//... that is the case
}
我相信公共IP地址的分配会以某种方式延迟,即使我无法注意到使用Web控制台。
创建实例后,如何获取公共IP地址和DNS名称? 轮询DescribeInstances是正确的方法吗?
答案 0 :(得分:0)
RunInstances方法可以在创建实例之前返回,因此尚未分配公共IP地址。
要获取地址,我们需要发出额外的Describe ...请求,但不仅如此 - 我们需要等到创建实例。 Go AWS SDK中有各种Wait *方法,使用Descibe *系列方法进行轮询,直到获得请求状态。在这种情况下,您可以使用WaitUntilInstanceExists
方法(我使用方法的..WithContext版本):
reservation, err := ec2session.RunInstancesWithContext(ctx, input)
if err != nil {
log.Errorf("error creating instances %v", err)
return nil, nil, err
}
if !q.needsPublicAddress() {
return reservation, nil, nil
}
instanceIds := make([]*string, len(reservation.Instances))
for k, v := range reservation.Instances {
instanceIds[k] = v.InstanceId
}
statusInput := ec2.DescribeInstancesInput{
InstanceIds: instanceIds,
}
log.Debugf("waiting for instances to exist...")
instanceOkErr := ec2session.WaitUntilInstanceExistsWithContext(ctx, &statusInput)
if instanceOkErr != nil {
log.Errorf("failed to wait until instances exist: %v", instanceOkErr)
return nil, nil, instanceOkErr
}
log.Debugf("describing existing instances ...")
description, descriptionErr := ec2session.DescribeInstancesWithContext(ctx, &statusInput)
if descriptionErr != nil {
log.Errorf("failed to describe instances: %v", descriptionErr )
return nil, nil, descriptionErr
}
return reservation, description, nil
在内部,它会生成多个Describe ...请求,直到实例达到所需状态,然后可以使用Describe ...请求获取实例状态。响应将包含分配给实例的公共IP地址。