3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SAP Build Process AutomationでBTPのユーザ登録を自動化する

Last updated at Posted at 2023-02-20

はじめに

SAP BTPを使うプロジェクトにおいては、開発者やベーシスのメンバーが新たに参画したり、メンバーに新たなロールコレクションの割当が必要になったりする場面があります。SAP Build Process Automationを使い、そのような作業をできるだけ自動化してみることにしました。
※この記事で紹介するフローはPoC的に作成したもので、実際に運用で使われているものではありません

作成したプロジェクトは以下のリポジトリからダウンロード可能です。
https://github.com/miyasuta/btp-user-role-request

フロー

  1. 申請者がフォームに必要事項(メールアドレス、必要なロール等)を記入して申請を行う
  2. 所属チームのリーダーが承認する
  3. BTPサブアカウントにユーザが作成され、ロールコレクションが割り当たる
  4. 登録対象者がS-Userをまだ持っていない場合、またはCloud Foundryのスペースにユーザ追加が必要な場合はシステム管理者に依頼が届く。システム管理者はマニュアルでこれらを登録する
  5. 処理が完了すると、申請者にメールで通知する

image.png

前提

  • 承認者となる各チームのリーダーは、事前にBTPサブアカウントへの登録されていること
  • Process Automationのフォームを使うにはBTPサブアカウントのユーザが必要なため、申請者は共通ユーザを使用すること
  • Identity ProviderにはSAP ID Serviceを使用する。他のIdPを利用する場合はプロセスの設定変更が必要

動作

  • 共通ユーザでログインし、フォームから申請を行います。リクエストカテゴリは「新規ユーザの登録」とし、スペースにユーザを追加してもらいます。
    image.png

  • 承認者が受信ボックスから承認します。
    image.png

  • システム管理者にタスクが届きます。
    システム管理者は依頼された作業(ここではスペースへのユーザ追加)を実施し、"Submit"を押します。
    image.png

  • 登録されたユーザにメールが届きます。
    image.png

  • サブアカウントにユーザが登録され、ロールコレクションが割り当たった状態になっています。
    image.png

事前準備

1. Authorization and Trust Management ServiceのDestination登録

BTPサブアカウントへのユーザ登録、およびロールコレクション割当には、Authorization and Trust Management ServiceのAPIを使用します。このAPIを使用するためのDestinationをサブアカウントに登録しておきます。

  • XSUAAのサービスインスタンスを登録
    プラン"apiaccess"で登録し、サービスキーを登録します。
    image.png

  • Destinationを登録
    サービスキーを参照してDestinationを登録します。Process Automationから使うために、以下のプロパティが必要です。
    sap.applicationdevelopment.actions.enabled: true
    sap.processautomation.enabled: true
    image.png
    ※サービスキーとDestinationの項目マッピングは、こちらのブログをご参照ください

  • Process AutomationにDestination追加
    Process AutomationのSettings > Destinationsのメニューで、"New Destination"ボタンから上で作成したDestinationを追加します。
    image.png

2. メール送信用のDestination登録

ヘルプを参考に、Process Automaionのフローからメールを送信するためのDestinationを登録します。ここではGmailを使用しています。
image.png

Gmailで2要素認証を有効化している場合、以下の手順でApp password(アプリごとのパスワード)を作成する必要があります。作成したパスワードをDestinationのPasswordに設定します。
https://help.warmupinbox.com/en/articles/4934806-configure-for-google-workplace-with-two-factor-authentication-2fa

作成したプロセス

作成したプロセスは以下になります。番号を振ったステップについて説明します。
image.png

1. 承認者決定

リクエストフォームで選択したチームによって承認者を振り分ける処理です。
image.png
ここでは承認者のメールアドレスを直接指定しています。承認可能な人が複数いる場合は、ロールコレクションを設定してもよいでしょう。
image.png

2. サブアカウントへユーザ登録

新規ユーザの場合、サブアカウントへユーザ登録を行います。プロセスから直接APIを呼ぶために、Actionのプロジェクトを事前に登録しておきます。
image.png

2.1. Actionプロジェクト登録

Process Automationのロビーより、Create > Build an Automated Process > Actionsを選択します。
image.png
SAP API Business HubからダウンロードしたAPI Specification (JSON)をアップロードします。
image.png
image.png
使用するエンドポイントにチェックを入れます。
image.png
今回は、"Creates a user"のエンドポイントを使用します。Bodyを使用する項目だけに絞り、決まった値を入れる項目には固定値を設定しました。
image.png

2.2. アクションを使用

プロセスでアクションを使用します。まず、Destination variableを定義します。これはこのプロセスの環境変数となり、実行時にDestinationを指定できます。
image.png
Inputsタブでフォームで入力された名前やメールアドレスなどをAPIの項目にマッピングします。アクション側で項目を絞ったおかげで、ここでは最小限の設定で済みます。
image.png

3. ロールコレクションをリスト型の変数にマッピング

リクエストフォームは必要なロールコレクションにチェックを入れる形式になっています。後続のロールコレクションの割り当て処理は、ロールコレクションをリストで受け取るため、マッピングが必要です。そのため、Automationのスクリプトを使ってマッピングを行いました。
※Business Application Studioのワークフローエディタには「スクリプトタスク」が用意されているのですが、Process Automationにはそのようなものがないため、こちらの方法を使用しました

インプットはロールコレクションにチェックがついているかをBoolean型で受け取り、アウトプットはString型のリストです。
image.png

スクリプトは以下のようになっています。

let roleCollections = [];

if(Subaccount_Viewer){
    roleCollections.push('Subaccount Viewer');
}

if(Business_Application_Studio_Developer){
    roleCollections.push('Business_Application_Studio_Developer');
}

if(Launchpad_Admin){
    roleCollections.push('Launchpad_Admin');
}

return roleCollections;

4. ロールコレクションの割り当て

ロールコレクションの割り当ては、対象のメールアドレスとロールコレクションのリストをインプットとして受け取り、ロールコレクションの件数分、割り当て処理のサブフローを実行します。

4.1. メインのフロー

メインのフローの最初の3ステップは、ユーザのメールアドレスをもとにIDを取得する処理です。
image.png
BTPサブアカウントのユーザを特定するキーはメールアドレスではなくIDなので、以下のリクエストを発行してIDを取得します。以下の画面ショットはPostmanでのリクエストのイメージです。
/Users?filter=origin eq 'sap.default' and userName eq '<メールアドレス>'
image.png

4.1.1. リクエストオブジェクトの編集

スクリプトを使ってAPIに渡すためのリクエストオブジェクトの編集を行います。
image.png

スクリプトの中身は以下のようになっています。

let url = "/Users?filter=origin eq 'sap.default' and userName eq '" + email + "'";

return {
  'method': 'GET',
  'url': url ,
  'responseType':'json', // parse the body of the result as a JSON object
  'resolveBodyOnly':true // get only the body of the response
};
4.1.2. API呼び出し

"Call Web Service with Destination"ステップに対し、前のステップで編集したリクエストオブジェクトを渡してAPIを呼び出します。
image.png

4.1.3. IDを変数に設定

"Create Variable"ステップで、取得したIDを変数に設定します。
image.png

4.1.4 ロールコレクション割当のループ

"For Each"ステップでインプットのロールコレクションをループし、サブフローを呼び出します。
image.png
サブフローに対しては、IDとロールコレクションを渡します。
image.png

4.2. サブフロー

サブフローでは、ユーザをロールコレクションに割り当てます。
image.png
ロールコレクションの割り当ては、Patchリクエストにより行うため、Etag(If-Matchヘッダ)が必要です。そのため、最初にGetリクエストによりEtagを取得しておく必要があります。
image.png

4.2.1. Etag取得用リクエストオブジェクトの編集

Etag取得用のGetリクエストを送るためのリクエストオブジェクトを編集します。
image.png

Etagはレスポンスヘッダに設定されるため、resolveBodyOnlyをfalseにします。

let url = '/Groups/' + roleCollection;

return {
  'method': 'GET',
  'url': url ,
  'responseType':'json', // parse the body of the result as a JSON object
  'resolveBodyOnly':false // get only the body of the response
};
4.2.2. Etag取得

"Call Web Service with Destination"ステップに対し、前のステップで編集したリクエストオブジェクトを渡してAPIを呼び出します。
image.png

4.2.3. Etagを変数に設定

"Create Variable"ステップで、取得したEtagを変数に設定します。
image.png

4.2.4. Role Collection割り当て用リクエストオブジェクトの編集

Role Collection割り当て用てのPatchリクエストを送るためのリクエストオブジェクトを編集します。ロールコレクション、ユーザのID、Etagをインプットにします。
image.png

let url = '/Groups/' + roleCollection;
let headers = { 
    'Content-Type': 'application/json',
    'If-Match': etag
};
let body = {
    'members': [{
      'origin': 'sap.default',
      'type': 'USER',
      'value': id
    }]
};
return {
  'method': 'PATCH',
  'url': url ,
  'headers': headers,
  'body': JSON.stringify(body),
  'responseType':'json', // parse the body of the result as a JSON object
  'resolveBodyOnly':true // get only the body of the response
};
4.2.5. Role Collection割り当て

"Call Web Service with Destination"ステップに対し、前のステップで編集したリクエストオブジェクトを渡してAPIを呼び出します。
image.png

5. システム管理者のステップが必要かどうか判断

S-Userの登録が必要な場合、またはCloud Foundryのスペースにユーザ追加が必要な場合にシステム管理者のステップを実行するため、Decisonステップにより判断を行います。

image.png

If-Elseにより、以下のルールを設定しています。
image.png

改善ポイント

1. Cloud Foundryのスペースへのユーザ登録

Cloud Foundryのスペースへのユーザ登録はAPIがないため自動化に含められませんでした。このためシステム管理者のステップで手動で行うこととしています。btp-setup-automatorなどを参考に、Cloud Foundry CLIをAPIで呼ぶことができないかを検討してみたいです。

2. ロールコレクションの選択

リクエストフォームでのロールコレクションの選択は、現状チェックボックスにより行うこととしています。しかし、これだと選択させたいロールコレクションが増えたときにマニュアルで追加が必要です。
フォームのドロップダウンで"From data set"を選択するとデータソースを外部から引っ張ってくることができそうなので、対象のサブアカウントのロールコレクションをAPIで取得して出すといったことができるか検討してみたいです。
image.png

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?