如何获取新启动的AWS实例的公共IP地址?

时间:2018-01-15 20:24:13

标签: amazon-web-services aws-sdk-go

在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是正确的方法吗?

1 个答案:

答案 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地址。