2014-10-31 2 views
0

Я хочу посмотреть, выполняется ли программа в EC2 или нет.Перейти к проверке среды EC2? Или DNS-доменное имя?

Один из способов - запустить hostname -d в EC2, чтобы получить DNS domain name.

Как получить это доменное имя DNS в Go.

Я смотрел на net пакет с помощью http://golang.org/pkg/net/#LookupNS

Но мне нужно передать аргумент.

Как проверить, находится ли он в EC2 или нет?

Благодаря

+0

Можете ли вы объяснить, почему вы это делаете? –

+0

Некоторые из вещей, которые я могу себе представить, что вы делаете с этим (например, переключатели режима «dev mode» и «prod mode»), могут быть лучше выполнены с конфигурацией, которую вы передаете в переменные файла или среды или флаги командной строки при запуске программы , а не путем обнаружения того, где он запускается. – twotwotwo

ответ

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.

1

Правильный путь, ИМО, чтобы попытаться попасть в API метаданных в http://169.254.169.254/latest/meta-data от самой машины. Поразительная часть состоит в том, что вы чувствуете необходимость знать это в коде. Я не совсем уверен, что такое прецедент для этого, но мне кажется, что вам следует знать об этом за пределами вашего кода.

Тем не менее:

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)) 

} 
Смежные вопросы