Google Compute Engineのインスタンスの操作

GAEから、GCEのインスタンスを操作するためにCompute Engine APIを使ってみました。

2016/6/10

GCEのインスタンスは、分単位での課金であり、起動の時間も短くとても扱いやすいインスタンスです。
それが故に、手軽にStart,Stopをしたくなります。

当然、GoogleさんもWeb、CLI、スマホアプリなど色々な方法を提供してくれていますので、基本的にはそれで事は足ります。
でもね。やっぱり自分で操作したいこともあるじゃないですか。
というわけで、エンジニアとしては初級レベルの僕が試せた部分だけ紹介しますね。

Githubで公開してみました

ちなみに、GAEのスペシャリストsinmetalさんがMinecraftのために作ったライブラリがとても参考になります。
僕が使ったもの以上の事をたくさんされているので、本格的に使う方はこちらを参考にされるといいと思います。

GCEを操作するためには

Google Compute Engineを操作するために、 Compute Engine API が用意されています。
これを、Golangで扱うためもライブラリも公開されています。

実際にライブラリの中身を見て頂けると分かるのですが、色々な事が出来すぎて見ているだけで気持ち悪くなります。(少なくとも僕は。。)

というわけで、今回触った部分だけをかい摘んで書いてみたいと思います。

なにはともあれ、ライブラリをimport

ライブラリのインポート、APIライブラリを使う上での認証をするために、oauth2などのライブラリもインポートしています。
その他、必要なパッケージをインポートして下さい。

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

computeをエイリアスを書いておくと、VSCodeでソースを認識してくれるので便利でした。
context,oauth2,googleの3つは、次の項目でAppEngineのClientを作成する際に使用しています。

ComputeServiceを作る

操作を始める上では、GCEを操作するためのServiceを作ります。
instanceだけでなく、zoneやnetworkなど様々な操作をする為の基本となるServiceです。
ポイントは、clientを作る際に「AppEngineTokenSource」を使うことですね。これを使うと特別な認証が不要になるのでとても簡単になります。

client := &http.Client{
    Transport: &oauth2.Transport{
        Source: google.AppEngineTokenSource(ctx, compute.ComputeScope),
        Base:   &urlfetch.Transport{Context: ctx},
    },
}
s, err := compute.New(client)

zoneのリストを取得する

instanceは、zoneを指定して取得することになりますので、まずはzoneを取得します。

zs := compute.NewZonesService(s)
zoneList, err := zs.List(project).Do()

取得したzoneのリストをfor文で回しながらinstanceのリストを取得します。

instanceのリストを取得する

instanceのリストを取得します。

is := compute.NewInstancesService(s)
insList, err := is.List(project, zone.Name).Do()

External IPを取得する。

ここ一番苦労したところです!

External IPは、instanceの奥の方に入っています。
instanceのリスト(insList)をfor文で回しながら、instance(ins)を取り出し、その中の情報を掘り起こします。
AccessConfigのNatIPが、External IPになります。

natIp := ins.NetworkInterfaces[0].AccessConfigs[0].NatIP

instanceに入っていると思ってはいたのですが、NetworkInterfaces>AccessConfigs>NatIPにたどり着くのに時間がかかりました。
それらは、リストになっているのですが、良くわからないので、とりあえず一つ目を取得しています。。

インスタンスを起動、停止する

インスタンスの起動、停止は、instanceが取得できていれば簡単です。

起動

ope, err = is.Start(project, zone, instance).Do()

停止

ope, err = is.Stop(project, zone, instance).Do()

ちなみに、projectIDは、appengineパッケージをimportして、以下で取得が可能です。

projectID := appengine.AppID(ctx)

最後に

各種メソッドだけを抜粋してみました。
今回は、GAEからGCEのinstanceを起動、停止する機能を作ってみました。

By nuki_pon

Related articles

--- AD ---