Я должен был написать что-то подобное сегодня, и поиск в поисках примеров оказался на удивление мало.я написал то, что узнал ниже, однако, я довольно новичок в golang, поэтому, возможно, умные люди могут предложить улучшения.
моя работа в процессе: https://github.com/grenade/rubberneck
если вы хотите запустить свою программу go с компьютера разработчика, который не находится на платформе Google Compute:
- настройте gcloud cli для запуска на вашем компьютере (инструкции: https://cloud.google.com/sdk/gcloud)
- создайте учетную запись службы для запуска приложения go (инструкции: https://cloud.google.com/docs/authentication/production#creating_a_service_account)
- предоставьте разрешения учетной записи службы (используйте ту же ссылку, приведенную выше)
- создайте локальную учетную записьфайл ключа, содержащий учетные данные вашей новой учетной записи службы (используйте ту же ссылку для инструкций выше)
- задайте для переменной среды
GOOGLE_APPLICATION_CREDENTIALS
путь к вашему локальному файлу ключа - напишите свое приложение go.это:
package main
import (
"golang.org/x/net/context"
"google.golang.org/api/compute/v1"
"golang.org/x/oauth2/google"
"fmt"
"strings"
)
func main() {
projects := [...]string{
"my-project-one",
"my-project-two",
}
filters := [...]string{
"status = RUNNING",
"name != my-uninteresting-instance-one",
"name != my-uninteresting-instance-two",
}
ctx := context.Background()
client, err := google.DefaultClient(ctx,compute.ComputeScope)
if err != nil {
fmt.Println(err)
}
computeService, err := compute.New(client)
for _, project := range projects {
zoneListCall := computeService.Zones.List(project)
zoneList, err := zoneListCall.Do()
if err != nil {
fmt.Println("Error", err)
} else {
for _, zone := range zoneList.Items {
instanceListCall := computeService.Instances.List(project, zone.Name)
instanceListCall.Filter(strings.Join(filters[:], " "))
instanceList, err := instanceListCall.Do()
if err != nil {
fmt.Println("Error", err)
} else {
for _, instance := range instanceList.Items {
if workerType, isWorker := instance.Labels["worker-type"]; isWorker {
m := strings.Split(instance.MachineType, "/")
fmt.Printf("cloud: gcp, zone: %v, name: %v, instance id: %v, machine type: %v, worker type: %v, launch time: %v\n",
zone.Name,
instance.Name,
instance.Id,
m[len(m)-1],
workerType,
instance.CreationTimestamp)
}
}
}
}
}
}
}