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

时间:2014-10-31 20:46:54

标签: amazon-ec2 dns go

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

一种方法是在EC2中运行hostname -d以获取DNS domain name

如何在Go中获取此DNS域名。

我使用http://golang.org/pkg/net/#LookupNS

查看了net

但我需要传递一个论点。

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

由于

2 个答案:

答案 0 :(得分:1)

IMO正确的方法是尝试从机器本身点击http://169.254.169.254/latest/meta-data的元数据API。令人担忧的是,您觉得需要在代码中知道这一点。我不太确定这个用例是什么,但在我看来,你应该有一种方法让你在你的代码之外知道这个。

尽管如此:

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 :(得分:1)

您可以使用此功能查看是否存在具有特定名称的界面:

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。