Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
11
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@daxanya1

HubotからDigitalOceanAPIを叩いてみる

Hubot-scriptは、hubot経由で外部APIを叩く機能も多いですね。(本来それが目的のような気もします)

さて、最近1時間1円で話題のクラウドホスティングのDigitalOceanは、APIもシンプルでhubotから管理しやすそうなので、ちょっと試してみました。

準備

1.DigitalOceanのアカウントを取得します。参考URL
2.DigitalOceanにログインして、APIのページからClient IDとAPI Keyを取得します。
3.とりあえず1つサーバを立ち上げてみます。(DigitalOcean上のサーバ1つの単位をdropletと呼んでいるようです)

今回叩くAPI

DigitalOceanのAPIページを参考にします。

DigitaiOceanのAPIだけで、dropletを作って、電源OFFして、スナップショット取って、破棄するのができてしまうので、気づくとお金をちゃりんちゃりん払う事にもなります。

といっても最低構成のdropletだと、1時間1セント(最低金額が0.007$なのですが請求時に1セント未満は繰り上げられて0.01$になります)なので、そうそうたいしたことにはならないと思います。

でも最初ですので、プログラムがバグってて悪影響が出ても大丈夫なように、閲覧系のAPIだけ叩いてみましょう。

/droplets - Show All Active Droplets
/images - All Images
の2つのAPIを叩きます。

ちなみに、「APIを叩く」という表現は単純にDigitalOceanのAPIにアクセスするというだけのことです。

サンプルプログラム

モジュールを2つ使います。
APIを叩くのに、scoped-http-clientを利用しています。
また、APIを連続で叩く際に、ネストが深くならないように、async.jsを利用しています。
coffeescriptだと、インデントでcallback配列の制御ができるので楽でいいですね。

digitalocean.coffee
HttpClient     = require 'scoped-http-client'
async = require 'async'

CLIENT_ID = '__YOUR_CLIENT_ID__'
API_KEY = '__YOUR_API__KEY__'

class DigitalOcean
  constructor: (debug = false) ->

  get : (path, params, callback) ->
    params.client_id=CLIENT_ID
    params.api_key=API_KEY
    url = "https://api.digitalocean.com/#{path}/?"+("#{k}=#{v}" for k,v of params).join('&')
    console.log(url) if debug
    HttpClient.create(url)
      .header("User-Agent", "Hubot/#{@version}")
        .get() (err,res,body) =>
          try
            callback(JSON.parse(body))
          catch e
            console.log(e)
            console.log("can't load")

  check_api_status : (json) ->
    json.status == 'OK'

  show_droplets : (droplets) ->
    ("#{droplet.name}(#{droplet.id})" for droplet in droplets).join('\n')

  show_images : (images) ->
    ("#{image.name}(#{image.id})" for image in images).join('\n')

module.exports = (robot) ->
  api = new DigitalOcean(debug=false)

  robot.respond /digitalocean\s*(リスト|list)/i, (msg) ->
    async.waterfall [
      (callback)->
        api.get("droplets", {}, (json) ->
          if api.check_api_status(json)
            if (json.droplets.length > 0)
              msg.reply '今動いているdropletはこれだけありますー。\n' + api.show_droplets(json.droplets)
            else
              msg.reply '今はdropletは一つも立ち上がってないですー。'
            callback null
          else
            msg.reply "digitaloceanのdroplets_apiが正常に動いていないようですー。"
        )
      (callback)->
        api.get("images", {filter:"my_images"}, (json)->
          if api.check_api_status(json)
            if (json.images.length > 0)
              msg.reply '今動いている自前管理のimageはこれだけありますー。\n' + api.show_images(json.images)
            else
              msg.reply '今は自前管理のimageは一つもないですー。'
            callback null
          else
            msg.reply "digitaloceanのimages_apiが正常に動いていないようですー。"
        )
    ], (err) ->

package.jsonのdependenciesにも忘れず追加してください。

package.json
        :
        :  
  "dependencies": {
        :
    "scoped-http-client": "0.9.8",
    "async": "0.2.9",
        :
  },

動かし方

hubotの名前が、@hubotだとして、
@hubot digitalocean リスト」と話しかけましょう。

hubotがAPIを叩いて調べにいってくれます。名前とIDでdropletとsnapshotイメージについて教えてくれます。

こんな人にどうぞ

いちいちDigitalOceanのWEBページにログインして、リンククリックして…というのが面倒な人はぜひどうぞ。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
11
Help us understand the problem. What are the problem?