はじめに
最近Zapierを触る機会がありました。
これまでiPaaS的なことをやるときにIFTTTのPro版を使っていたのですが、Zapierを試してみるとなかなか使い勝手が良かったので試した内容を残しておきます。
Zapierとは
ZapierとはいわゆるiPaaSで、さまざまなWebアプリケーションを統合/自動化してくれます。
こちらの動画を見ると、カタカナだと「ザピアー」と読むのが近いですかね。
VIDEO 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認証 にも対応してますのでさくらのクラウド にも対応できそうです。
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 Audience
とRole
は以下のようにしてください。
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タブは以下のように入力します。
入力後は一度保存してください。
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 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
でテストしてみます。
Configure Test Data
では定義しておいたInputを入力できるのですが、Dynamic Fieldにはうまく対応していないためRaw
を選んで直接入力します。
以下のJSON を入力します。(ゾーンとIDは各自の値に置き換えてください)
{
"inputData ": {
"Zone ": "is1a ",
"ServerID ": "111111111111 "
}
}
うまくいけば以下の表示が出るはずです。
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:
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にこんな感じのメッセージが届くはずです。
良さそうですね!!
ポーリングの間隔は?
ポーリングの間隔はプランごとに決まっているようです。
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 大好きなので是非試したかったところなのですが時間がなくて今回は試せませんでした。また時間を見つけてチャレンジしてみるつもりです。
それでは今度こそ以上です。