さくらのクラウドでつくるワークフロー: Workflowsをやってみよう(2) 外部API呼び出しと、ワークフローのAPIによる起動

はじめに

本連載では、さくらのクラウドの新サービス「Workflows」を使ってワークフローを作成する方法を紹介しています。前回の記事ではさくらのクラウドのWorkflowsの基本機能を見てきました。今日は第二弾として以下の2つを見ていきます。

  1. ワークフロー内部での外部API呼び出し
  2. ワークフローのAPIによる起動

ワークフロー内部での外部API呼び出し

https://manual.sakura.ad.jp/cloud/appliance/workflows/reference-call.html

上記リンク先が公式ドキュメントとなっています。call ステップの中でhttpエンドポイントに対して以下のオペレーションが可能となっています。

  • get
  • post
  • put
  • delete
  • patch

その他のオペレーションとしては以下が用意されています。

  • sakuraCloud : さくらのクラウドAPIを呼び出します。
  • sys : sleep, sleep until により処理を一時停止させます。例えば、ある程度時間のかかる処理を外部API呼び出しで行った場合、処理を待って再開させる、などのケースに用います。
  • feed : 外部からhttp.getしたxmlデータをparseによりJSONへ変換します。

今日はhttp.get, http.post を見ていきます。

さっそくやってみる

まずは Request Catcher というサイトを使ってテスト用RESTエンドポイントを作成します。登録不要でsakuraworkflowsと入力して Get started ボタンをクリックするだけです。

次に前回作成したワークフローのRunbookを以下に置き換えます。

meta:
  description: サンプルワークフロー(HTTP POST)

args:
  sample:
    type: number
    description: サンプル引数

steps:
  calc:
    assign:
      doubled: ${args.sample * 2}

  post:
    call: http.post
    args:
      url: ${"https://sakuraworkflows.requestcatcher.com/"}  # 任意に変更可
      timeout: 10
      headers:
        "Content-Type": application/json
      body:
        sample: ${args.sample}
        doubled: ${doubled}
        note: "sent from Sakura Cloud Workflows"
    result: resp

  result:
    return: ${resp.statusCode}   

ワークフローのコンソールでリビジョンを作成 をクリックします。

上記のyamlを貼り付けて保存 をクリックします。リビジョンは自動で採番されていきますので指定は行わなくても問題ありません。

次に 最新のリビジョンで実行 をクリックすれば実行されます。

実行結果としてHTTP Statusコードの200、つまりpost成功が戻ってきています。

Request Catcher 側でも以下の通りworkflowsから値がpostされていることがわかります。

ワークフローのAPIによる起動

では次に作成したワークフローをAPI経由で起動します。下記のドキュメントも参考にしてください。

https://manual.sakura.ad.jp/api/cloud/workflows/#section/%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9

さくらのクラウド API キーの発行

まずさくらのクラウドのコントロールパネル左ペインから APIキー を選択し APIキーの作成 をクリックします。

アクセスレベルは アクセス不可 以外を選択し ワークフロー にチェックを付けて作成をクリックします。

画面に表示されるアクセストークンアクセストークンシークレットを手元にメモしておきます。

テスト環境で環境変数の設定

ZONE=tk1b
BASE="https://secure.sakura.ad.jp/cloud/zone/${ZONE}/api/workflow/1.0"
TOKEN="1b028010-9169-42c9-xxxx-4b39db061750"
SECRET="09xX6xaJm5jeICSjtTRsLlxxxxpMbaa03zcIdeYyqAuVHemON6rvXZsJpBQcyzpf"

WorkflowsのAPIはcurl経由で実行を行います。curlコマンドをシンプルに保つために上記4つの環境変数を設定しておきます。TOKEN,SECRETは先ほど発行したAPIキーのそれぞれの値をセットします。

次に設定済ワークフローの一覧を取得します。

 curl -s -u "$TOKEN:$SECRET" \
  -X GET -H 'Content-Type: application/json' -H 'X-Requested-With: XMLHttpRequest' \
  "$BASE/workflows/" | jq '.Workflows[] | {id: .Id, name: .Name}'
{
  "id": "113702027864",
  "name": "sample"
}
{
  "id": "113702027501",
  "name": "条件テスト"
}
{
  "id": "113702027485",
  "name": "並列テスト"
}

sample のワークフローIDを環境変数にセットします。

WORKFLOW_ID="取得したID"

ワークフローの引数用JSONを作成します。

ARGS_JSON=$(jq -c -n --argjson v 123 '{sample:$v}')
jq -n --arg args "$ARGS_JSON" '{Args:$args}' > exec_body.json

いよいよ実行です。

curl -s -u "$TOKEN:$SECRET" \
  -X POST -H 'Content-Type: application/json' -H 'X-Requested-With: XMLHttpRequest' \
  -d @exec_body.json \
  "$BASE/workflows/${WORKFLOW_ID}/executions" | tee exec_resp.json

実行履歴は以下のコマンドで取得可能です。

EXEC_ID=$(jq -r '.Execution.ExecutionId' exec_resp.json)
curl -s -u "$TOKEN:$SECRET" \
  -X GET -H 'Content-Type: application/json' -H 'X-Requested-With: XMLHttpRequest' \
  "$BASE/workflows/${WORKFLOW_ID}/executions/${EXEC_ID}/exec_history" | jq .

コンソールを見ると実行履歴が増えていることがわかります。

まとめ

今回は作成したワークフローからの外部API呼出しと、ワークフローそのもののAPI呼び出しを試してみました。第3回はAPIキーと対をなすサービスプリンシパルという新しい認証認可メカニズムを用いたワークフローの実行を見ていきます。