我想看看这个程序是否在EC2中运行。
一种方法是在EC2中运行EC2以获得DNS domain name。
如何在Go中获得这个DNS域名。
我使用net查看了http://golang.org/pkg/net/#LookupNS包
但我需要通过一场辩论。
我如何检查它是否在EC2中?
谢谢
发布于 2014-11-01 00:45:55
您可以看到是否有带有此函数的具有特定名称的接口:
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。
发布于 2014-11-01 00:17:17
正确的方法是尝试从机器本身访问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))
}https://stackoverflow.com/questions/26683158
复制相似问题