我想看看程序是否在EC2中运行。
一种方法是在EC2中运行hostname -d
以获取DNS domain name
。
如何在Go中获取此DNS域名。
我使用http://golang.org/pkg/net/#LookupNS
查看了net
包
但我需要传递一个论点。
我如何检查它是否在EC2中?
由于
答案 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。