使用Go语言获取GCE实例列表

使用谷歌/谷歌 API Go 客户端。

获取的处理本身如下所示。

import (
  "google.golang.org/api/compute/v1"
  "net/http"
)

func listInstances(client *http.Client, project_id string, zone string) (*compute.InstanceList, error) {
    service, err := compute.New(client)  // Newを使うとServiecオブジェクトがつくれる。各サービスのインスタンスを初期化してくれる。
    if err != nil {
        return nil, err
    }

    t := services.instasces  // compute.NewInstancesService(service) と等価
    list, err := t.List(project_id, zone).Do() // いろんなメソッドがある Listを使うと一覧を取得する命令を構築する。 Doで実際のアクセスが発生する。
    if err != nil {
        return nil, err
    }
    return list, err
}

需要http.Client、ProjectID和ZONE。
http.Client是指已设置了用于访问Google API的信息。这将在后文中提到。

检查GCE实例获取API的列表后,我们可以了解到项目(project)和区域(zone)是必需的。在调用Do函数时,可以指定可选参数。

获取 http.Clint

使用DefaultClient可以创建使用gcloud auth login等已执行的信息,已授权在创建GCE实例时的http.Client。
不需要额外准备API密钥,可以以与CLI工具相同的权限运行,非常方便。

参考代码。

import (
  "golang.org/x/oauth2/google"
  "golang.org/x/net/context"
)

func client() *http.Client {
    ctx := context.Background()
    client, _ := google.DefaultClient(ctx)
    return client
}

使用google.DefaultClient时,需要Context。

如果是Google AppEngine的情况下

如果想在Google App Engine上使用,需要进行一些修改。

import (
    "golang.org/x/net/context"
    "golang.org/x/oauth2"
    "golang.org/x/oauth2/google"
    "google.golang.org/api/compute/v1"
    newurlfetch "google.golang.org/appengine/urlfetch"
    "net/http"
)

func client(c *context.Context) *http.Client {
    source, err := google.DefaultTokenSource(c, compute.ComputeScope)
    if err != nil {
        return nil, err
    }
    client := &http.Client{
        Transport: &oauth2.Transport{
            Source: source,
            Base:   &newurlfetch.Transport{Context: c},
        },
    }
    return client
}

看起来是在使用 Managed VMs 时使用了与 Google App Engine SDK 套件不同的库。

最后,我会附上一个将所有信息整合在一起的源代码示例。

package main

import (
    "fmt"
    "golang.org/x/net/context"
    "golang.org/x/oauth2"
    "golang.org/x/oauth2/google"
    "google.golang.org/api/compute/v1"
    newurlfetch "google.golang.org/appengine/urlfetch"
    "net/http"
    "os"
)

const project = "XXXXXXXX"  // project id
const zone = "XXXXXXX"      // east-asia1-bとか

func listInstances(client *http.Client, project_id string, zone string) (*compute.InstanceList, error) {
    service, err := compute.New(client)
    if err != nil {
        return nil, err
    }
    t := compute.NewInstancesService(service)
    list, err := t.List(project_id, zone).Do()
    if err != nil {
        return nil, err
    }
    return list, err
}

// CLI
func main() {
    ctx := context.Background()
    client, err := google.DefaultClient(ctx)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
    }

    list, err := listInstances(client, project, zone)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    for _, v := range list.Items {
        fmt.Println(v.Name)
    }
}

// Google App Engine
func init() {
    http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := context.Background()
    if err != nil {
        return nil, err
    }
    client := &http.Client{
        Transport: &oauth2.Transport{
            Source: source,
            Base:   &newurlfetch.Transport{Context: c},
        },
    }
    list, _ := listInstances(client, project, zone)
    for _, v := range list.Items {
        fmt.Fprintln(w, v.Name)
    }
}

文献引用

    • https://github.com/google/google-api-go-client

 

    • https://github.com/golang/oauth2

 

    https://godoc.org/google.golang.org/api/compute/v1
bannerAds