Goとlibsaloudでさくらのクラウド用CLIを素早く作ろう


# 概要

## libsacloudってなに？
さくらのクラウドAPIライブラリとして[saklient](http://sakura-internet.github.io/saklient.doc/)というのがあるのですが、残念ながらGo向けはありませんでした。

そこで[saklient](http://sakura-internet.github.io/saklient.doc/)を参考に、Go用にスクラッチ開発したのが[**libsacloud**](https://github.com/yamamoto-febc/libsacloud)です。

ある程度の使用感は[saklient](http://sakura-internet.github.io/saklient.doc/)と同じまま、Goでさくらのクラウドが容易に操作できるようになりました。

Goで開発すれば、各プラットフォーム向けにクロスコンパイルして単一バイナリにできるので
ツールの配布が非常に楽ですよ:+1::+1::+1: 


## libsacloudの利用例

今回は[libsacloud](https://github.com/yamamoto-febc/libsacloud)の紹介を兼ねて簡単なCLIツール`sacloud-upload-image`を作成してみました。

[libsacloud](https://github.com/yamamoto-febc/libsacloud)を使って、さくらのクラウド上にISOイメージのアップロードを行うためのCLIです。
[libsacloud](https://github.com/yamamoto-febc/libsacloud)の[README](https://github.com/yamamoto-febc/libsacloud/blob/master/README.md)にあるファイルアップロードサンプルの応用例となっています。

:star2: サンプルはGoで作成していますので、 **Windows/Linux/Mac(OSX)全てで動かせます！**  :star2: 

libsacloudを使うことでソースコードの総行数200行以下のシンプルな作りすることが出来ました。

----

# サンプルアプリ`sacloud-upload-image`

**:bulb:サンプルアプリ`sacloud-upload-image`は以下のリポジトリで公開しています。:bulb:**

>[sacloud-upload-image(GitHub)](https://github.com/yamamoto-febc/sacloud-upload-image)

## 概要

さくらのクラウドには[ISOイメージ](http://cloud.sakura.ad.jp/specification/server-disk/)という機能があります。
通常さくらのクラウドでサーバを作成する際はあらかじめ初期設定済みのOSイメージ(アーカイブ)からOSを選択するのですが、自分でISOイメージをアップロードして好きなOSをインストールすることも可能です。

ただ、ISOイメージのアップロードは割と煩雑な作業です。詳細は[こちらのページ](https://help.sakura.ad.jp/app/answers/detail/a_id/2520)に記載されているのですが、

    1) コントロールパネル上でISOファイル用領域を作成
    2) ファイル領域へのFTP接続情報が表示されるため控えておく
    3) FTPS+PASV対応のFTPクライアントからアップロード

という手順が必要になります。

`sacloud-image-upload`ではこれらの作業を自動化しました。
curlなどのコマンドで取得したISOイメージをパイプで`sacloud-image-upload`に渡すことでさくらのクラウド上へアップロード出来ます。

## インストール方法

こちらの[リリースページ](https://github.com/yamamoto-febc/sacloud-upload-image/releases/latest)から最新バージョンのバイナリをダウンロードして展開、実行権を付与してください。

以下のプラットフォーム用のバイナリを用意しています。

  * darwin(i386/amd64)
  * linux(i386/amd64)
  * windows(i386/amd64)


## コマンド書式

オプション、イメージのパス、イメージ名を指定するとアップロード実施します。
以下の書式で実行できるようにします。

```bash

$ sacloud-upload-image [オプション] [イメージ名]

```

#### オプション
 
    -token  : さくらのクラウドのAPIキー(アクセストークン)
    -secret : さくらのクラウドのAPIキー(シークレット)
    -zone   : 作成するゾーン (is1a/is1b/tk1a) デフォルト:is1a
    -file   : アップロードするISOファイルのパス

`zone`は以下の値をとります
> 
    is1a : 石狩第１ゾーン
    is1b : 石狩第２ゾーン
    tk1a : 東京第１ゾーン

#### APIキーの設定方法

上記のオプションで指定する、または環境変数も利用できます。

```オプションで指定する場合
$ sacloud-upload-image -token=[アクセストークン] -secret=[シークレット] [イメージ名]
```

```環境変数で指定する場合
$ export SAKURACLOUD_ACCESS_TOKEN=[アクセストークン]
$ export SAKURACLOUD_ACCESS_TOKEN_SECRET=[シークレット]
$ sacloud-upload-image [イメージ名]

```

#### ISOファイルの指定方法

ISOファイルは`-file`オプション、またはパイプなどで他コマンドの結果を受け取れるようにもしておきます。
`curl`などでISOファイルを取得、即さくらのクラウドへアップロード出来ちゃいますよ!

```パイプ/リダイレクトの例

# curlからパイプで受け取る
$ curl -L http://[ISOイメージのURL] | sacloud-upload-image [オプション] [イメージ名]

# リダイレクトで受け取る(CoreOS.isoというファイルをアップロードする例)
$ sacloud-upload-image [オプション] [イメージ名] < CoreOS.iso

```


### 利用例：curlでweb上からISOイメージをダウンロード & さくらのクラウドへアップロード

#### CentOS Atomic Hostの例

```bash
# APIキーを環境変数で指定する
$ export SAKURACLOUD_ACCESS_TOKEN=[アクセストークン]
$ export SAKURACLOUD_ACCESS_TOKEN_SECRET=[シークレット]

# CentOS Atomic Host(http://www.projectatomic.io)の例
$ curl -L http://cloud.centos.org/centos/7/atomic/images/CentOS-Atomic-Host-7-Installer.iso | \
  ./sacloud-upload-image "CentOS Atomic Host"

```

#### CoreOSの例

```bash
# APIキーを環境変数で指定する
$ export SAKURACLOUD_ACCESS_TOKEN=[アクセストークン]
$ export SAKURACLOUD_ACCESS_TOKEN_SECRET=[シークレット]

# CoreOS(https://coreos.com)の例
$ curl -L https://stable.release.core-os.net/amd64-usr/current/coreos_production_iso_image.iso | \
  ./sacloud-upload-image "CoreOS stable"

```


## [開発者向け]実装のポイント

200行に満たないソースコードですので実際に[ソース](https://github.com/yamamoto-febc/sacloud-upload-image)を見ていただくのが早いです。
数点だけポイントを解説します。

#### ライブラリのインポート

import文で`github.com/yamamoto/febc/libsacloud/api`を指定します。
お好みで別名を当ててもいいでしょう。今回は`API`という名前でインポートしています。

```cli.go(import部分)
// libsacloudを"API"という名前でインポート
import API "github.com/yamamoto-febc/libsacloud/api"

```

#### API利用開始

API利用前にAPIクライアントの初期化が必要です。
初期化には`NewClient`関数でアクセストークン、シークレット、ゾーンを指定します。
以後は`NewClient`関数の戻り値`api`を使えばAPI呼び出しができるようになります。

```cli.go(APIクライアント作成)
    // APIクライアント作成
	api := API.NewClient(params.token, params.secret, params.zone)

```

#### さくらのクラウド上へリソース作成

今回のサンプルアプリで利用するリソース(ISOイメージ)の作成を行います。
この辺りの使用感が[saklient](http://sakura-internet.github.io/saklient.doc/)と若干異なりますので注意が必要です。


```cli.go(さくらのクラウド上にISOイメージ格納領域を作成)
	// 1) 空のISOイメージオブジェクトを作成
	newImage := api.CDROM.New()

	// 2) 必要な値を設定
	newImage.Name = params.imageName
	newImage.SizeMB = 5120

	// 3) API呼び出しでリソース作成
	image, ftp, err := api.CDROM.Create(newImage)

```

`api`配下にlibsacloudで操作できるリソースがぶら下がっています。
どんなリソースが利用できるかは[APIドキュメント](https://godoc.org/github.com/yamamoto-febc/libsacloud/api)などを参照ください。


# 最後に

Goによる開発パワーをさくらのクラウドで活かせる[libsacloud](https://github.com/yamamoto-febc/libsacloud)をぜひお試しください。