gpt4 book ai didi

amazon-web-services - 如何获取新启动的 AWS 实例的公网 IP 地址?

转载 作者:行者123 更新时间:2023-12-01 04:44:12 33 4
gpt4 key购买 nike

在 AWS 中启动新实例时,公共(public) IP 地址和 DNS 名称不会作为响应的一部分返回。

正如我在 Web 控制台中看到的那样,创建的机器分配了公共(public) IP 和 DNS 名称,但是对 SDK 方法调用的响应没有分配 IP 和 DNS 字段值。

我正在使用以下代码:

output, err := ec2session.RunInstances(input)
...
if output.Instances[0].PublicIpAddress == nil {
//... that is the case
}

我相信公共(public) IP 地址的分配会以某种方式延迟,即使我无法注意到使用 Web 控制台。

创建实例后如何获取公网IP地址和DNS名称?
轮询 DescribeInstances 是正确的方法吗?

最佳答案

RunInstances 方法可以在实例创建之前返回,所以还没有分配公网 IP 地址。

为了获取地址,我们需要发出一个额外的 Describe... 请求,但不仅如此——我们需要等到实例创建完成。 Go AWS 开发工具包中有多种 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... 请求获取实例状态。响应将包含分配给实例的公共(public) IP 地址。

关于amazon-web-services - 如何获取新启动的 AWS 实例的公网 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48270167/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com