さくらのクラウドでつくるワークフロー: Workflowsをやってみよう(3) サービスプリンシパルを用いたサービス間連携

前回までのおさらい

前回の記事では作成したワークフローの内部で外部APIを呼び出す例と、ワークフロー自体をさくらのクラウドAPIを用いて呼び出す例をご紹介しました。

第三回目の本記事では、サービスプリンシパル という新しいコンセプトと実際のサンプルをご紹介します。

サービスプリンシパルとは

サービスプリンシパルとは従来のAPIキーによる認証と並行して利用可能な、新たな認証方式です

従来のAPIキーは人間による操作やCLIなどでの利用を想定しており、引き続きご利用いただけます。一方、システム間連携、例えばさくらのクラウドのサービスから別のサービスを呼び出すようなEDA (Event Driven Architecture) の場合、より細かい権限の制御や有効期限の設定などが求められます。それを視野に入れて開発されているのがサービスプリンシパル というものです。

さくらのクラウドのコントロールパネルからサービスプリンシパル を作成するとリソースID というものが生成されます。これをワークフロー作成時に設定しておくことで、トークンに相当する文字列を共有することなく当該ワークフローはサービスプリンシパル が持つ権限の範囲内でさくらのクラウドのサービスを呼び出すことができるため、APIキー方式よりセキュアといえます。

トークン不要で呼び出しが可能となるのは、呼び出し元と呼び出し先が同じ基盤につながっているためですので、ローカル環境などからさくらのクラウドAPIを呼び出していただく場合は引き続きAPI キーをご利用いただくことになります。

サービスプリンシパルは将来的にはさくらのクラウドの様々なサービスで利用可能になる予定ですが、リリース直後はWorkflowsにのみ関連付けが可能です。サービスの操作権限は以下に対応しています。つまり作成されたワークフローはAPIキー不要で以下のサービス群を操作できるようになります。

さっそくやってみる

1. サービスプリンシパルの作成

さくらのクラウドのホーム画面、左ペインからサービスプリンシパル を選択してください。

サービスプリンシパル の作成をクリックしてください。

適当な名前を付けて保存してください。

2. サービスプリンシパルへの権限付与

左ペインからIAMポリシー をクリックします。

アクセス権の付与 をクリックしてください。

先ほど作成したサービスプリンシパルを一覧から選択し、ロールにワークフローを指定します。これによりサービスプリンシパルが関連付けされたさくらのクラウドのリソースがワークフローを操作できるようになりました。前述の通りサービスプシンシパルは複数のサービスの操作権限を保有できますが、このブログでは対象をワークフローとしてみます。

以下の様にロールが関連付けされていれば完了です。

現時点でサービスプリンシパルを関連付け可能なサービスはWorkflowsのみで今後拡張を予定していますので楽しみにお待ち下さい。では次のステップとして早速このサービスプリンシパルを用いたワークフローを作成していきます。

3. サービスプリンシパルと関連付けられたワークフローの作成

既存の作成済ワークフローにはサービスプリンシパルは関連付けできないため、新たにワークフローを作成します。この際、サービスプリンシパルのトークンは不要でリソースIDのみで動作します。先ほど作成したサービスプリンシパルの詳細画面でリソースIDをメモしておきます。

次にワークフロー作成画面でリソースIDを設定します。あとは過去の手順と同じです。

Runbookに以下のyamlを投入します。

version: v1

steps:
  runSample:
    call: sakuraCloud.request
    args:
      endpoint: https://secure.sakura.ad.jp/cloud/zone/tk1b/api/workflow/1.0/workflows/{workflowid}/executions
      method: POST
      headers:
        Content-Type: "application/json"
      timeout: 30
    result: response

  done:
    return: ${json.decode(response.body)}

{workflowid} は前回の記事で使用したSample ワークフローのIDに置き換えて下さい。IDがわからない場合以下のコマンドで取得できます。

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

 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": "230702027864",
  "name": "sample"
}

このワークフローには、ワークフローへの操作権限を持つサービスプリンシパルが関連付けされているため、APIキー不要で別のワークフローを起動できます。このためRunbookにAPIキーの指定がないことに注目して下さい。

4. Sample ワークフローの修正

前回の記事で作成したSampleワークフローは、数字を外部パラメータのインプットとして受け取り、2倍にして戻すものでした。テストをよりシンプルにするためにRunbookを以下に変更します。

version: v1

meta:
  description: 引数なしでPOSTするシンプルなサンプルワークフロー

steps:
  post:
    call: http.post
    args:
      url: ${"https://sakuraworkflows.requestcatcher.com/"}
      timeout: 10
      headers:
        "Content-Type": application/json
      body:
        note: "simple request from Sakura Cloud Workflows"
    result: resp

  done:
    return: ${resp.statusCode}

ワークフローの詳細画面でリビジョンの作成 をクリックすると、上記Runbookを登録し新しいリビジョンが発行されます。

5. いよいよテスト

ではサービスプリンシパルが関連付けされたワークフローを実行します。

最新のリビジョンで実行をクリックすると、そのたびにSampleワークフローが実行され https://sakuraworkflows.requestcatcher.com/ に値がPOSTされていることがわかります。

まとめ

さくらのクラウドのWorkflows シリーズはいかがでしたでしょうか。第三回はサービスプリンシパルを用いたさくらのクラウドサービスの呼び出し方法についてご紹介しました。

また気になるサービスや解説が必要なサービスなどがあればご要望をお寄せください。