RubyでクラウドサービスのAPIを叩くノウハウは、ネット上にも結構載っています。
**「SDKでいいんじゃね?」**というご意見もごもっともです。AWSをはじめ大抵のパブリッククラウドはRuby用のSDKを備えているのですが、ニフティクラウドのように途中で提供を終了してしまったり、ドコとは言いませんが恐ろしいことに全くSDKを提供していない恐ろしいパブリッククラウドも世の中にはあります。
いい加減、自分でリクエストを作ってcurlを叩く生活にも疲れたので、RubyでAPIを叩くラッパーを作ってみたいと思い立ちました。SDKを提供していない素敵クラウドについてはちょっと書けないので、たまたま自分が契約しているDigitalOceanを練習台にしてみます。
まずは普通にSDKを使ってみよう
DigitalOceanには公式Ruby用SDK(DropletKit)があります。
gemで普通に突っ込めばいいや、と思いましたが、怒られました。
gem install droplet_kit
とすると、ERROR: Error installing droplet_kit: activesupport requires Ruby version >= 2.2.2.
と怒られます。私が使っているEl CapitanのRubyは2.0…orz。
いささか面倒くささを感じながらもrbenvでRubyのバージョンを2.3.1にします。
今度は入った。
DigitalOceanのサイトからトークンを取っておき、まずは簡単なアクセスをしてみます。
require 'droplet_kit'
token = '取得したトークン'
client = DropletKit::Client.new(access_token: "#{token}")
droplets = client.droplets.all
droplets.each do |droplet|
p droplet
end
droplet.allで取ってきた場合、eachにしないと駄目みたいです。
こういう出力になります。
<DropletKit::Droplet {:@id=>26530455, :@name=>"centos-512mb-sgp1-01", :@memory=>512, :@vcpus=>1, :@disk=>20, :@locked=>false, :@created_at=>"2016-09-22T11:49:56Z", :@status=>"active", :@backup_ids=>[], :@snapshot_ids=>[], :@action_ids=>nil, :@features=>["virtio"], :@region=><DropletKit::Region {:@slug=>"sgp1", :@name=>"Singapore 1", :@sizes=>["512mb", "1gb", "2gb"], :@available=>true, :@features=>["private_networking", "backups", "ipv6", "metadata"]}>, :@image=><DropletKit::Image {:@id=>19779752, :@name=>"6.8 x64", :@distribution=>"CentOS", :@slug=>"centos-6-x64", :@public=>true, :@regions=>["nyc1", "sfo1", "nyc2", "ams2", "sgp1", "lon1", "nyc3", "ams3", "fra1", "tor1", "sfo2", "blr1"], :@type=>"snapshot"}>, :@networks=>#<struct DropletKit::NetworkHash v4=[#<struct DropletKit::Network ip_address="(グローバルIP)", netmask="255.255.192.0", gateway="(グローバルIP)", type="public", cidr=nil>], v6=[]>, :@kernel=>nil, :@size_slug=>"512mb", :@tags=>[], :@names=>nil, :@volumes=>nil, :@ssh_keys=>nil, :@backups=>nil, :@size=>nil, :@ipv6=>nil, :@user_data=>nil, :@private_networking=>nil}>
Dropletを2つ起動していれば、2つ分の情報が出力されます(貼り付けませんが)。
DropletのIDが分かっていれば、削除も簡単です。
require 'droplet_kit'
token = '取得したトークン'
id = '対象のID'
client = DropletKit::Client.new(access_token: "#{token}")
client.droplets.delete(id: "#{id}")
Dropletの削除はtagからでもできる(droplets.delete_for_tag)のですが、それ以外の操作全般には結局IDが必要なので、早めに操作対象のIDを取得しておくに越したことはないようです。
最後に、順序は逆っぽいですがDropletの作成。
require 'droplet_kit'
token = '取得したトークン'
client = DropletKit::Client.new(access_token: "#{token}")
droplet = DropletKit::Droplet.new(
name: "test",
region: "sgp1",
size: "512mb",
image: "ubuntu-14-04-x64",
ipv6: false
)
client.droplets.create(droplet)
ほぼAPIサンプルのままですが、これだけで適当なDropletがすぐ作成できます(パラメータはもっとありますし、SSH鍵も指定してないので上記では不完全です)。
結論:SDKは
やっぱり楽ですね:-)。
自分でURLを叩いて行こうとすると、今回droplet_kitが裏でやってくれていることを全部面倒見ないといけないわけです…。
こんな便利なライブラリがある以上、DigitalOceanであえてRubyから直接APIを叩く理由なんてほとんどないわけですが、そこは修行の一環ということで、次回から徐々にAPIにアクセスしていきたいと思います。