Cloud Automator のAPI を呼び出すCLI をgolang で作ってみた #cloudautomator #golang #swx

知ってますか?

Cloud Automatorというサービスがあるんですが・・・知ってますか?

cloudautomator.com

簡単に言うと 画面からのカンタン操作でAWSの運用を自動化 することが出来るサービスかなーと。画面から操作できるのは大変便利なのですが、大量の定型処理を行う場合にはやっぱりしんどいですよね・・・

しかし、最近Cloud AutomatorAPIが公開されました。

blog.serverworks.co.jp

Cloud Automator API
https://cloudautomator.com/api_docs/v1/api.html

APIはあるけど・・・

APIが公開されていれば、プログラムの中から使えるから画面からの操作じゃなくてもなんとかなる!と、現実はそんなに簡単ではないのでなかなか難しいところもありますよね。

じゃーターミナルでcurlを使って頑張ればいいじゃないか!と、思うじゃないですかー

qiita.com

・・・黒い画面大好きな国の人でもちょっと大変という感想がっ! SDKとかCLI何かがあれば多少は違うのかなぁーと思いつつ、Cloud Automatorのサービススタンスとしては、CLIは難しいラインなのかなぁーとも思いつつ

そこで

仕事で考えるからややこしい話になるんだなぁーと気がついた & 最近議事録や予定調整などしていて、コードも書いてなければAWSも触れてないと気がついたので、せっかくだから公開されているAPIドキュメントを見ながらCLIを作ってみることにしました。

f:id:uchimanajet7:20170808195605g:plain

CLIを作るにあたって、身近なCLIを参考にするのが良さそうなので以下の2つを色々見てみました。

aws.amazon.com

github.com

自分が使うだけなので、手元のMacAmazon Linuxで動けばいいのでPythonって選択肢もアリでしたが、やっぱりここは仕事では書く機会がありそうもない大好きな言語であるgolangで作ってみようかと。

golangにはcobraというちょー便利なパッケージがあるので、もちろんこれを利用して作っています。

github.com

他にも色々と便利なパッケージがあり、今回は

github.com

github.com

github.com

github.com

github.com

なんかを利用しています。

awesome-go.com

go.libhunt.com

また、上記のようにgolangのパッケージをまとめているサイトがいくつかあるので、こういうサイトを利用して必要なパッケージを検索出来るのはありがたいです。

とりあえず

自分用ということで作っていて、とりあえず動くところまではできた感じです↓

github.com

golangのクロスコンパイルでMac/Linux/Windows用のバイナリファイルは作りましたが・・・MacLinuxは動くのは確認しています。Windowsは動かなかったらゴメンなさいw

github.com

インストールとか操作については、README.md&ヘルプコマンドの表示で何とかしていただければ・・・

github.com

分かりにくいところ

Create JobAPIで受け取るパラメータのrule_valueaction_valueが直感的ではないので、少々分かりにくいかもしれません。

Cloud Automator API
https://cloudautomator.com/api_docs/v1/api.html#ジョブ-post

上記のAPIドキュメントを確認すると、rule_valueaction_valueについてはobject型の値を渡さないといけないようです。

object型JSONになるのですが、CLIJSONは結構大変なので今回は以下の例のように対応しています。

$ ./ca job create \
--name "ca job create exsample" \
--aws-account-id 1 \
--rule-type cron \
--rule-value hour=2,minutes=0,schedule_type=weekly,weekly_schedule=monday,friday \
--action-type create_image \
--action-value region=ap-northeast-1\
,specify_image_instance=identifier\
,instance_id=i-xxxxxxxxxxxxxxxxx\
,generation=1\
,image_name=exsample-ami\
,description="Job Create Exsample Cloud Automator CLI"\
,reboot_instance=true\
,additional_tag_key=name\
,additional_tag_value=exsample\
,add_same_tag_to_snapshot=true\
,trace_status=true\
,recreate_image_if_ami_status_failed=true

–rule-value hour=2,minutes=0,schedule_type=weekly,weekly_schedule=monday,friday

APIのパラメータ名=値” の形で指定して、パラメータ同士は",“で繋いで表現してください。また、配列を表現する場合は”APIのパラメータ名=値,値,値“のように値を”,“で繋いで表現してください。

作ってみて

  • golang はやっぱり楽しいねーもっと使えるようになりたい
  • 各種パッケージで色々できるのは楽でいい
  • SORACOMさんのCLIAPI定義からSDKなんかと一緒に自動生成みたい
  • 手で組んでも作れるけど、同じようなコードになっていくから自動生成は幸せになれそうで素敵
  • Cloud AutomatorAPIも確か API Blueprintを使っていたはずなのでワンチャンあるかも?

API Blueprint | API Blueprint
https://apiblueprint.org/

  • object型CLIで表現するのに困った
  • AWS CLIの引数指定の仕方を参考にしてみたが、APIパラメータを知らないと使えない感じもするので悩ましい
  • 自分用に作ったのでテストがなかったり、コメントだらけのソースだったりすのでなんとかしたい
  • Circleci2.0を使ってみれたのはよかった。速くてすばらしい
  • Codeshipも気になるので時間があるときに使ってみたい
  • golangで作られたツールのリポジトリを見ると、AppVeyorを利用してWindows環境でテストとビルドをしているところも多いみたいなので気になる

circleci.com

codeship.com

www.appveyor.com

  • 使ってみたかったslideshipをやっと使えた

slideship.com

  • Markdownでサクサク書けるのは便利
  • 簡単に作れるので使っていきたい

slideship.com

  • APIドキュメントが間違っている可能性?

Cloud Automator API
https://cloudautomator.com/api_docs/v1/api.html#ジョブ-patch

  • API定義からAPIとドキュメントが生成されていない?
  • ドキュメントだけ間違っている場合は、このドキュメントを元に作っているので間違った仕様になってしまう
  • 上記の場合だとedit処理なのに、id意外も必須とされている・・・

まとめ

  • 楽しいのはやっぱり大事だよね
  • 手を動かして作っていかないと知らないことも多くなってる
  • 自分用でもちゃんと最初からテスト書こう
  • もうちょっと頑張ろうと思った

以上になります