使用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