首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >去检查EC2环境吗?还是DNS域名?

问去检查EC2环境吗?还是DNS域名?
EN

Stack Overflow用户
提问于 2014-10-31 20:46:54
回答 2查看 143关注 0票数 0

我想看看这个程序是否在EC2中运行。

一种方法是在EC2中运行EC2以获得DNS domain name。

如何在Go中获得这个DNS域名。

我使用net查看了http://golang.org/pkg/net/#LookupNS包

但我需要通过一场辩论。

我如何检查它是否在EC2中?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-01 00:45:55

您可以看到是否有带有此函数的具有特定名称的接口:

代码语言:javascript
复制
package main

import (
    "log"
    "net"
    "strings"
)

func trace(fmt string, args ...interface{}) {
    log.Printf(fmt, args...)
}

func HasAddrWithName(name string) (bool, error) {
    ifaces, err := net.Interfaces()
    if err != nil {
        return false, err
    }
    for _, iface := range ifaces {
        addrs, err := iface.Addrs()
        if err != nil {
            trace("%s", err)
            continue
        }
        for _, addr := range addrs {
            ipaddr, _, err := net.ParseCIDR(addr.String())
            if err != nil {
                trace("%s", err)
                continue
            }
            hosts, err := net.LookupAddr(ipaddr.String())
            if err != nil {
                trace("%s", err)
                continue
            }
            for idx, h := range hosts {
                trace("%d: %s\n", idx, h)
                if strings.Contains(h, name) {
                    return true, nil
                }
            }
        }
    }
    return false, nil
}

func main() {
    hasAddr, err := HasAddrWithName(".ec2.internal")
    if err != nil {
        log.Fatal(err)
    }
    if hasAddr {
        log.Println("inside ec2")
        return
    }

    log.Println("Not inside ec2")
}

该函数将尝试查找所有接口,将ip解析为dns名称。如果名称包含特定字符串,则返回true。

票数 1
EN

Stack Overflow用户

发布于 2014-11-01 00:17:17

正确的方法是尝试从机器本身访问http://169.254.169.254/latest/meta-data上的元数据API。令人担忧的是,您觉得有必要在代码中了解这一点。我不太清楚这是什么用例,但在我看来,应该有一种方法让您在代码之外了解这一点。

然而:

代码语言:javascript
复制
package main
import (
    "fmt"
    "io/ioutil"
    "net/http"
    "os"
    "time"
)

func main() {
    /* if you just need the hostname */
    name, _ := os.Hostname()
    fmt.Println(name)

    /* if you must hit the EC2 metadata API */
    client := http.Client{
        Timeout: time.Duration(2 * time.Second),
    }

    resp, err := client.Get("http://169.254.169.254/latest/meta-data/public-hostname")
    if err != nil {
        fmt.Println("Probably not on EC2")
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26683158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档