連携できるアプリは3000個以上!さくらのクラウド+iPaaS(Zapier)で広がる世界

f:id:febc_yamamoto:20211201153742p:plain

はじめに

最近Zapierを触る機会がありました。 これまでiPaaS的なことをやるときにIFTTTのPro版を使っていたのですが、Zapierを試してみるとなかなか使い勝手が良かったので試した内容を残しておきます。

Zapierとは

ZapierとはいわゆるiPaaSで、さまざまなWebアプリケーションを統合/自動化してくれます。

こちらの動画を見ると、カタカナだと「ザピアー」と読むのが近いですかね。
youtu.be

サポートしているappは3000を超えており、よく使うようなアプリ(GmailやTrello、Slack/Discord、スプレッドシートなど)にきちんと対応しています。

https://zapier.com/apps

対応していないアプリについては、アプリ側がWeb APIを提供していれば自分でIntegrationを作成することで対応させることができます。

zapier.com

IntegrationはGUI上でポチポチ(Zapier Platform UI) またはCLI経由で作成することが可能です。

platform.zapier.com

BASIC認証にも対応してますのでさくらのクラウドにも対応できそうです。

Zapier+さくらのクラウドで何ができるの?

Actions

ZapierからAPIを叩けますので、何かをトリガーにAPIを叩くことが可能です。
この記事では例としてDiscordに書き込んだらサーバを起動するという仕組みを作ってみます。

Triggers

また、ZapierにはAPIなどでデータをポーリングしてデータが追加/変更されたことを検知する仕組みが備わっています。 例えば

  • 新しいサーバが追加されたら何かをする
  • サーバの起動状態(起動 or シャットダウン)が変わったら何かをする
  • DNSレコードが追加されたら何かをする

みたいなことが可能です。 この記事ではサーバの起動状態が変わったことを検知してみます。

Actionsを試してみる

まず動きを理解しやすいActionsから取り組んでみます。
Actionとは何かしらのトリガー(Gmailでのメール受信とかSlackでのメッセージ受信とかWebhookとか)を受けた時に実行される処理の事です。 何かしらのトリガーを用意した上でさくらのクラウドAPIを呼ぶ処理を実装してみます。

トリガーの準備(Discord)

トリガーはなんでも良いのですが、今回は手軽に試せるようにDiscordの特定チャンネルに書き込みがあったら何かするようにしてみます。 Discordのサーバを用意し、専用のチャンネルを用意します。

参考: Discord: サーバ作成の仕方

今回チャンネル名はzapier_testとしました。

Integrationの作成

こちらからIntegrationの作成を開始します。 (アカウントがない場合は作っておいてください。無料プランでも問題ないです)

developer.zapier.com

NameやDescriptionなどを適当に入力していきます。 下の方のIntended AudienceRoleは以下のようにしてください。

  • Intended Audience: Private
  • Role: I have no affiliation with __

Intended Audienceは公開範囲です。Publicにしたい場合にはいくつかの条件をクリアする必要があります。(詳細はToSを要確認) Roleは統合対象のアプリ(今回はさくらのクラウド)との関係(雇用関係があるか?)です。作成対象のIntegrationを公式ディレクトリで公開したい場合に設定が必要です。
今回はI have no affiliation with __(無関係)を選びます。

Authenticationの作成

次にアクションで使う認証情報を指定します。この設定は後ほどトリガーでも利用可能です。
画面左のメニューからAuthenticationを選び、Basic Authを選択してから保存します。

次に認証情報のテスト用のURLを指定します。 さくらのクラウドには認証情報を確認するAPIが用意されていますのでこちらを利用します。

GET:https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/auth-statusと入力して保存してください。

テスト用のAPIキーの登録

続いて認証情報のテストを行います。

まずはAPIキーを登録します。Sign in to ...というボタンをクリックするとポップアップ画面が表示されますのでさくらのクラウドAPIキーを入力します。

登録したらTest Authenticationをクリックして動作確認しておきます。

Actionの作成

次にアクションを作成します。 今回はサーバの電源をONにする処理を実装してみます。

左のメニューからActionsを選びAdd Actionボタンから新規作成画面を開きます。 Settingsタブは以下のように入力します。

f:id:febc_yamamoto:20211201140949p:plain

入力後は一度保存してください。

Inputs

次にInput Designerタブでこのアクションを実行するのに必要な入力項目(Input)を指定していきます。
今回は操作対象のサーバが属するゾーンとサーバのIDを指定可能にします。
手作業で入力すると大変なので、ゾーンとサーバをドロップボックスで選べるようにします。
こんな感じの動きになります。

Zone

まずはZoneを追加します。Input Fieldを追加します。

KeyとLabelにはZoneと入力してください

Dropdown Sourceには以下のJSONを入力します。

[
  {
    "sample": "is1a",
    "value": "is1a",
    "label": "石狩第1ゾーン"
  },
  {
    "sample": "is1b",
    "value": "is1b",
    "label": "石狩第2ゾーン"
  },
  {
    "sample": "tk1a",
    "value": "tk1a",
    "label": "東京第1ゾーン"
  },
  {
    "sample": "tk1b",
    "value": "tk1b",
    "label": "東京第2ゾーン"
  },
  {
    "sample": "tk1v",
    "value": "tk1v",
    "label": "Sandbox"
  }
]

サーバのID

次にサーバのIDを指定可能にします。 Dynamic Fieldを追加し、コードは以下をコピペします。

const options = {
  url: 'https://secure.sakura.ad.jp/cloud/zone/{{bundle.inputData.Zone}}/api/cloud/1.1/server',
  method: 'GET'
}

return z.request(options)
  .then((response) => {
    response.throwForStatus();
    const results = response.json;

    return { 
      key: 'ServerID', 
      label: "ServerID",
      required: true,
      choices: results.Servers.map(v => {
        return { label: v.Name , sample: v.Name, value: v.ID }
      })
    }
  });

{{bundle.inputData.Zone}}で前に指定したZoneのinputの値を参照できます。
その後APIの戻り値からZapierが理解できる形に変換して返しています。 参考: How to add Dynamic and Custom Fields

API設定

さくらのクラウドAPIを呼ぶ設定をしていきます。 API Configurationタブを開きStep1に入力していきます。 以下のように入力してください。

  • メソッド: PUT
  • URL: https://secure.sakura.ad.jp/cloud/zone/{{bundle.inputData.Zone}}/api/cloud/1.1/server/{{bundle.inputData.ServerID}}/power

先ほども出てきた{{...}}という記法でInputを参照してURLを組み立てます。

保存したらStep2でテストしてみます。

API設定のテスト

Configure Test Dataでは定義しておいたInputを入力できるのですが、Dynamic Fieldにはうまく対応していないためRawを選んで直接入力します。 以下のJSONを入力します。(ゾーンとIDは各自の値に置き換えてください)

{
  "inputData": {
    "Zone": "is1a",
    "ServerID": "111111111111"
  }
}

うまくいけば以下の表示が出るはずです。

f:id:febc_yamamoto:20211201145057p:plain

Integrationを試す

これでActionが出来ましたのでIntegrationを試してみましょう。 ダッシュボードからCreate Zapボタンを押しましょう。

zapier.com

画面左上の入力欄でZap名を指定し、App EventではDiscordを検索して選択します。

Discordトリガーの設定

次にTrigger TypeをNew Message Posted to Channelにします。

次にDiscordにサインインするように促されます(初回のみ)

Discord側で権限の確認画面が出ますのでサーバを間違えないように選択してから許可を出します。

次に対象のチャンネルを選択します。

作成したActionの設定

次に作成したActionの設定を行います。 App Eventに作成したアクションの名前を入れて検索&選択します。

Eventとして先ほど作成したActionが選べるはずです。

Actionを選んだらパラメータを指定します。 Zoneを選んだら該当ゾーンにあるサーバがドロップダウンで選択できるようになります。

テストはスキップしても構いませんしここでテストしてもOKです。

最後にTurn on ZapをクリックしてZapを有効化しておきます。

動作確認

最後に動作確認してみます。Discordの指定チャンネルになんでも良いので書き込みしてみます。 サーバが起動したら成功です!

お好みでサーバ起動後に通知を出したり、Discordで任意の文字列が書き込まれたら起動するように修正するとグッと実用的になるかと思います。

例: Discordからの書き込み内に起動という文字が存在している場合だけ処理するようにフィルターを設定

Triggersでさくらのクラウド上のリソースの変更を検知してみる

続いてTriggersを試してみます。

ZapierのTriggers

Zapierは以下2つのトリガーをサポートしています。

  • REST Hook Trigger
  • Polling Trigger

REST Hook Trigger

REST Hook Triggerは統合対象のアプリケーションの側から通知をしてもらう方式です。
統合対象のアプリケーション側でデータが増えたり更新された時にZapierに通知することで即時トリガーすることが可能です。
ただし、統合対象のアプリケーション側がREST Hooksに対応している必要があります。

残念ながらさくらのクラウドはREST Hooksに対応していませんので次のPolling Triggerを使用する必要があります。

Polling Trigger

Polling Triggerはその名の通りポーリングでデータの追加/更新を検知する方式です。
統合対象からAPIでデータを定期的に取得し、追加や更新があったかをZapier側で判断してトリガーしてくれます。

ただし、APIでデータを取得する際にデータをZapierが理解できる形に変換しておく必要があります。 platform.zapier.com

具体的には、

  • 配列
  • 各要素はidというフィールドを持つオブジェクト
  • 作成/更新時間の逆順でソートされていること(新しいデータがより前にあること)

という形式である必要があります。

例:

[
  { id: 2, name: "example2"},
  { id: 1, name: "example1"}
]

例えば1回目のAPIコールで上記のデータを返したとします。Zapierはこれを保持しており、次回リクエスト時の結果と比較して追加/変更を検知してくれます。

例:

[
  { id: 3, name: "example3"},
  { id: 2, name: "example2"},
  { id: 1, name: "example1"}
]

というデータが来たらid:3のデータでトリガーしてくれます。

詳細はこちらを参照してください。 zapier.com

ということで実際にPolling Triggerを作成していきます。

Polling Triggerの作成

では例としてサーバの起動状態が変わったことを検知するPolling Triggerを作成してみます。

まずこんな感じで基本的な項目を入力します。

次にInputは先ほど作ったActionと同じようにZoneを追加しておきます。

API Configuration

次にAPI Configurationです。 ここではAPIでデータを取得した後Zapierが理解できる形にデータを変換します。
コードを用いるため、Switch to Code Modeボタンを押してコード入力モードに切り替え、以下のコードを入力します。

const options = {
  url: `https://secure.sakura.ad.jp/cloud/zone/${bundle.inputData.Zone}/api/cloud/1.1/server`,
  method: 'GET'
}

return z.request(options)
  .then((response) => {
    response.throwForStatus();
    const results = response.json;

    return results.Servers.map( (v) => {
      v.originalId = v.ID;
      v.id = z.hash('md5', v.ID + v.Instance.StatusChangedAt);
      return v;
    });
  });

ポイントは以下の部分です。

return results.Servers.map( (v) => {
      v.originalId = v.ID;
      v.id = z.hash('md5', v.ID + v.Instance.StatusChangedAt);
      return v;
    });

APIからの戻り値のIDフィールドと、起動状態が最後に変わった日時を保持しているフィールドInstance.StatusChangedAtを結合した値からハッシュを算出してidにしています。
こうすることでサーバの起動状態が変わったらidが変更されZapierから変更を検知できるようになります。

あとはActionの時と同じでテストを行い保存しておきます。

Zapを作成して動作確認

ではIntegrationを使ってみます。 今回はサーバの起動状態が変わったらDiscordの特定チャンネルにメッセージを投稿してみます。

Triggerの選択〜編集

Zapの作成画面を開き、Zap名を入力、作成したIntegrationの名前を入力して検索&選択してください。

トリガーとして先ほど作成したものが選択できるようになっているはずです。

アカウント選択〜ゾーンの選択を行いテストまでしておきましょう。 うまくいけばこんな画面が表示されます。

Actionの選択〜編集

次にDiscordの特定チャンネルにメッセージを送るためのアクションを設定します。 Discordを選択し、Action EventとしてSend Channel Messageを選択します。

次に送信先チャンネルの選択やメッセージの設定を行います。 メッセージ本文にはTriggerが取得したサーバの情報が利用可能です。

いい感じに設定しましょう。

投稿するBotの名前やアイコンも変更できますのでお好みで変更してみてください。

あとはTurn on Zapをクリックして有効化しましょう!

動作確認

それではサーバの起動状態を変えるためにシャットダウンしたり起動したりしてみましょう。 うまくいけばDiscordにこんな感じのメッセージが届くはずです。

f:id:febc_yamamoto:20211201181214p:plain

良さそうですね!!

ポーリングの間隔は?

ポーリングの間隔はプランごとに決まっているようです。 f:id:febc_yamamoto:20211201182311p:plain

Free/Starterプランで15分ごと、Professionalプランで2分ごと、Team/Companyプランで毎分となっています。
用途に合わせて適切なプランを選びましょう。 (個人的にはProfessionalがもうちょっと安くなってくれれば、、、と感じてます)

まとめ

ということで今回はZapierとさくらのクラウドを組み合わせてみました。
日々の運用に、レポート作成にと様々な用途で利用できるかと思います。夢が広がりますね!

ただIntegrationの作成で若干のコードを書かないといけないのが不満です。
これはさくらのクラウド向けPublic Integrationを作成して公開すると解決できそうです。

例えばDigitalOceanであればこんな形でPublic Integrationが公開されておりすぐに利用できるようになっています。 zapier.com

今はこの記事で試したことをベースにCLIによるIntegrationの作成を試してみているところですので、それが上手くいったら公開したいと思っています。
何とか今年中には公開したいですね。開発を頑張ります…

ということでZapier+さくらのクラウドはなかなかに便利だと思いますので是非お試しくださいー!

以上です。

おまけ: 他のiPaaS的なもの

今回の記事を書くにあたりZapier以外のいくつかのiPaaS(的なものも含む)でもさくらのクラウドAPIを使って連携できるか試してみました。

IFTTTはAPIをポーリングして変更を検知というのが難しかったです(結構ガッツリとコード書く必要がありそう)。
またWorkatoについては最終的なお値段は問い合わせないとわからないということだったので途中で試すのをやめちゃいました(なかなかいいお値段との情報もちらほら…)。

残るPower Automateやn8n.ioはそれぞれZapierとは違った魅力を感じました。
Zapierだと結構いいお値段ですので、割と手軽なお値段のPower Automateやオンプレにも立てられるn8n.ioは環境/状況次第では選択肢になりそうでした。
この辺についてはまた機会があれば記事にしようかと思っています。

最後のRed Hat Fuse Online/Syndesisについてですが、個人的にはApache Camel大好きなので是非試したかったところなのですが時間がなくて今回は試せませんでした。また時間を見つけてチャレンジしてみるつもりです。

それでは今度こそ以上です。