LoginSignup
2
2

More than 5 years have passed since last update.

gophercloudでConoHa APIに接続する

Last updated at Posted at 2017-12-25

この記事はConoHa Advent Calendar20日目です。

ワンボタンでキミのConoHaにGentooが! (前) < | > (次)スタートアップスクリプトでこのはちゃんにしゃべってもらいたかった


こんにちは、ひろのぶです。メリークリスマス🎄🎄🎄

というわけで代打エントリーです。大分前に作ったnovasshというツールをもとに、GoからConoHa APIを叩く話(導入編)をゆるく書いてみたいと思います。

gophercloud

APIを叩くのにGoの標準パッケージである[net/http(https://golang.org/pkg/net/http/)を使っても良いのですが、OpenStack API(ConoHa API)は複数回のリクエストを行うことが多いので、SDKを使った方が簡単に実装できます。

gophercloudRackspace社が開発しているGo言語のOpenStack SDKです。RackspaceのクラウドはOpenStackをベースにしていて、このライブラリは自社クラウド向けのSDKという位置づけのようです。ただ一般的なOpenStack基盤でも利用できるようネームスペースが分かれていて、OpenStackをベースにしているConoHaでも使うことができます。

ちなみに、Rackspaceは大分前にパブリッククラウドを止めてマネージドクラウドのみになったので、現在はお手軽に試すことはできなくなってしまいました。

使い方

ConoHa APIのリファレンスも併せてご覧ください

ConoHa APIを使う順番として、まずIdentity APIで認証を行い、その後各サービスのAPI(ComputeやBlockStorageやNetworkなど)を呼ぶことになります。

gophercloudはこのあたりを抽象化してくれるので非常に簡単です。

package main

import (
    "github.com/rackspace/gophercloud"
    "github.com/rackspace/gophercloud/openstack"
)

func main() {
    // APIの認証情報を設定する
    opts := gophercloud.AuthOptions{
        IdentityEndpoint: "https://identity.tyo1.conoha.io/v2.0",
        Username:         "gncu********",
        TenantName:       "gnct********",
        Password:         "************",
    }

    // AuthenticatedClient() は内部で認証を行い、
    // 各サービス(Compute, Network, Storageなど)の
    // 接続に使われるクライアントを返します。
    client, err := openstack.AuthenticatedClient(opts)
    if err != nil {
        panic(err)
    }

    // このclientは内部に token を保持しています。
    println(client.TokenID)
}

例としてCompute APIを呼んでみます。サーバー一覧を表示するサンプルは以下のようになります。

    // 今回は例としてCompute APIを使います。
    // gophercloudでは各サービスへのAPIアクセスをProvider構造体に抽象化されていて、
    // openstackパッケージにあるNewComputeV2()を呼ぶと、
    // Compute APIへアクセスする情報がセットされたクライアントが返ってきます。
    eo := gophercloud.EndpointOpts{
        Type:   "compute",
        Region: "tyo1",
    }
    compute, err := openstack.NewComputeV2(client, eo)
    if err != nil {
        panic(err)
    }

    // Compute APIの各機能は
    // github.com/rackspace/gophercloud/openstack/compute/v2/servers
    // パッケージにあります。
    // 各機能を実行するにはクライアント(compute)を渡す必要があります。
    listOpts := servers.ListOpts{}
    pager := servers.List(compute, listOpts)
    pager.EachPage(func(page pagination.Page) (bool, error) {
        serverList, err := servers.ExtractServers(page)
        if err != nil {
            return false, err
        }
        for _, server := range serverList {
            fmt.Printf("%v\n", server)
        }
        return true, nil
    })

もう一つの例としてVPSを作成してみましょう。servers.CreateOpts構造体にパラメータを埋めてCreate()を叩くだけでとても簡単です。

    // VPSを作成するような複雑なリクエストもとても簡単です。
    // ただ、gophercloudはConoHa独自のパラメータに対応していません。
    // たとえば管理者パスワードを設定する"adminPass"や、
    // SSHの公開鍵を指定する"key_name"などです。
    //
    // これらを指定する場合はuser_dataを使うことになります。
    // https://www.conoha.jp/guide/startupscript.php
    copts := servers.CreateOpts{
        Name:      "gophercloud-test",
        ImageRef:  "b9e54c41-cda9-4d84-8248-808bfaf6c793",
        FlavorRef: "7eea7469-0d85-4f82-8050-6ae742394681",
        SecurityGroups: []string{
            "default",
            "gncs-ipv4-all",
            "gncs-ipv6-all",
        },
        Metadata: map[string]string{
            "instance_name_tag": "gophercloud-test",
        },
    }
    r := servers.Create(compute, copts)
    if r.Err != nil {
        panic(r.Err)
    }

上記のスクリプトは抜粋で、全文はGistにあります。

また、私が作ったconoha-netでは、同じ要領でNetwork APIを実行しているので、こちらもご参考までに

https://github.com/hironobu-s/conoha-net/blob/master/conoha/network.go

gophercloudを使うと、ConoHa APIを使った開発がとても簡単になると思います。

ちょっとnovasshの話

novasshはIPアドレスの代わりにインスタンス名でVPSにSSHできるツールで、ConoHaで使うとなかなか便利です。コントロールパネルからIPアドレスをコピペする必要がなくなります。またシリアルコンソール接続もできるので、SSHが落ちた場合でもVPSに接続できます。

良かったら下記の記事もご覧ください。

OpenStackインスタンスに簡単にSSHできるツールnovasshを作った

github.com/hironobu-s/novassh

おわりに

Gopherくんかわいいよね! ʕ◔ϖ◔ʔ

2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2