midPoint 新機能：シミュレーションを試す

[midPoint by OpenStandia Advent Calendar 2024](https://qiita.com/advent-calendar/2024/midpoint-by-openstandia) の24日目は、比較的新しい機能である「シミュレーション（Simulation）」について紹介します。


# シミュレーションとは

[公式ドキュメント](https://docs.evolveum.com/midpoint/reference/support-4.8/simulation/)では以下のように紹介されています。

> The "simulation" is an umbrella term covering various mechanisms of "what-if" analysis in midPoint. It could be characterized as an ability to see the expected effects of some actions without the risk of damaging the system state.
>
> （翻訳）
> 「シミュレーション」とは、midPointにおける「もしこうしたらどうなるか」という分析のさまざまな仕組みを包括的に指す用語です。これは、システムの状態を損なうリスクを負うことなく、特定のアクションの予想される影響を確認できる機能として特徴づけられます。


IDM/IGAは、外部の源泉システムからデータを取り込み、加工した上で、さまざまな外部システムにプロビジョニングします。このようにIDM/IGAは企業内システムの中心に位置しているため、その設定変更が企業全体のシステムに大きな影響を与える恐れがあります。midPointが提供するシミュレーション機能は、こうしたリスクを軽減するためにデータを壊すことなく、変更による影響を事前に安全に確認できる仕組みとして有用です。

## SaaSアプリケーションのプロビジョニングが抱える課題

こうしたリスク軽減は、特に近年一般化しているSaaSアプリケーションのプロビジョニングで重要なポイントとなります。SaaSアプリケーションの場合、専用の開発/検証環境を用意することが難しく、接続先が共用環境となることが多いです。さらに、予算の制約などで検証環境を準備できないケースもあります。このような状況では、設定ミスや操作ミスが企業に重大な影響を与えるリスクがあります。midPointのシミュレーション機能は、こうした背景に対応するために提供されていると考えられます。

## 従来型オンプレミス環境におけるシミュレーションの価値

もちろん、従来のオンプレミス環境の連携先に対しても、シミュレーション機能は役に立ちます。オンプレミス環境では、SaaSアプリケーションと比べると開発/検証環境を準備しやすいですが[^1]、それでも本番環境と同等のデータを準備することは難しい場合があります。従来のプロセスでは、まず検証環境にデータを準備してプロビジョニングを行い、その結果を確認して、想定外の箇所があればまたデータを戻してやり直す...という作業を繰り返しながら品質を確認し、最終的に本番環境に適用する流れです。シミュレーションを活用すれば、データに変更を加えることなく、設定変更が想定通りに機能するかを事前に確認できます。これにより、従来のプロセスよりも効率的に確認作業を行うことができます。また、最後に本番環境に適用する際にも、シミュレーションを使用することで、検証環境と本番環境の差異に起因するリスクを軽減してくれるでしょう。

[^1]:オンプレミス環境のアプリケーションは、多くの場合はCSV、AD、LDAP、RDBMSといった汎用的なデータソースをインタフェースとして使って連携することが多いため、比較的環境の準備が容易と考えています。

## 参考情報

シミュレーション機能に関しては、公式ドキュメントの以下にまとまっています。

https://docs.evolveum.com/midpoint/reference/support-4.8/simulation/

また、上記から辿れるチュートリアルもあります。

https://docs.evolveum.com/midpoint/reference/support-4.8/simulation/tutorial/


その他、シミュレーション機能に関する動画解説もあります。1つは、毎年開催されているヨーロッパ最大のアイデンティティー系カンファレンスである、EIC（European Identity and Cloud Conference）2023でのセッション動画です。

<iframe width="560" height="315" src="https://www.youtube.com/embed/kSV_2sYhqhk?si=ETQRceK7lofhjUOT" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

もう1つは、シミュレーション機能のWebinar動画です。実際に動いている様子を見ることができますので、参考になるかと思います。

<iframe width="560" height="315" src="https://www.youtube.com/embed/egVzcbGp-VM?si=Gu7qzmdyopehKsha" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


# シミュレーションのユースケース

公式ドキュメントを読むと、様々なユースケースで使えそうです。個人的にはやっぱりプロビジョニング先への影響を気にすることが多いので、以下のユースケースがマッチしそうです。

1. 新規にプロビジョニング先となる連携先システムを追加する（連携先システムはまだ未運用）
2. 新規にプロビジョニング先となる連携先システムを追加する（連携先システムは既に運用済みでデータがある）
3. 既にプロビジョニング先となる連携先システムがある中で、源泉取り込みのインバウンドマッピングやオブジェクトテンプレートのマッピングを変更する

1は連携先システムがまっさらな状態なので、あまりシミュレーションの価値はないかもですが、データを連携させずに事前確認できるのでその点便利かと思います（検証時のお掃除の頻度を減らせるという意味で）。2と3は、連携先システムにデータが既にあり、それを破壊しないことが要求されるため、非常にフィットしそうです。


# 実際に試してみよう

[16日目の記事](https://qiita.com/wadahiro/items/b5c9fa2d69c5cae0a8b9)でADにユーザーをプロビジョニングするように設定を追加しましたが、これをあらためてシミュレーションを使って試してみます。

なお、作業しやすいように一旦データはクリアして実施します。`docker compose down -v`で環境をデータも含めて破棄します。その後、`docker compose up -d --build`で再度環境を起動した状態から始めます。

## リソース設定の修正

作成済みの「AD」リソースの詳細画面を開き、「ライフサイクル状態」を変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/415eab14-3377-5094-375e-c1e89eafd6d3.png)

`Proposed (simulation)`にスイッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/002685d4-b513-9a79-655c-b7448d516463.png)

確認ダイアログが表示されるので「はい」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/e9a921dd-b32f-6cf2-971a-6d67adca07f6.png)

変更された状態となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/ba343352-0ea0-30d3-91e8-de1182889524.png)

## HRシステムからのデータの取り込み

今回、環境を再構築しているため、midPointにはHRシステムからのデータは未取り込み状態に戻っています。再度、以下の作成済みタスクを実行します。

1. 「HR recon orgs」リコンシリエーションタスク
2. 「HR import users」インポートタスク

取り込んだユーザーを確認しておきます。すると、 **「AD」リソースを`Proposed (simulation)`に変更したため、プロジェクションに「AD」リソースが存在しない（つまり、ADにプロビジョニングされていない）** ことが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/c4873606-49d0-5f6c-10bb-5aafeded4cd6.png)


## HRシステムのインポートタスク（シミュレーション用）の作成

先ほど実行した「HR import users」インポートタスクとは別に、もう一つシミュレーション用のインポートタスクを作成します。

「HR Users」リソースの編集画面を開き、「アカウント」メニューをクリックしてアカウント一覧を表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/7e63204c-3e30-bea0-4466-75825f6d9d70.png)


画面上部にある「タスク」メニューを開き、「タスク作成」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/63181f7a-0cd2-b371-b218-13b91a08ee64.png)


タスクの作成画面が開きます。今回はインポートタスクとして作成するため「Import Task」を選択します。また、シミュレーション機能を使いたいので、「Simulate task」を「ON」に設定します。これで「タスク作成」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/9c33ccd0-802d-ef20-94f8-f3f31d9d2133.png)


基本設定画面が表示されるので、以下を設定して「次へ：リソース・オブジェクト」ボタンをクリックします。

- **名前**：`HR import users (simulation)`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/36ad2797-fa71-e6ce-ee62-06fd789ac866.png)

リソース・オブジェクトの設定画面が表示されるので、以下を追加設定して「次へ：実行」ボタンをクリックします。

- **オブジェクトクラス**：`AccountObjectClass`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/1b41e66f-7c16-ed88-3aa8-f159953b7d78.png)

実行の設定画面が表示されます。ここで実行モード（シミュレーションを実行するのか、実際の実行を行うか）を設定します。今回、シミュレーションモードで作成しようとしているため、すでにその設定が入っています。そのまま「次へ：ディストリビューション」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/36033912-f650-c7e4-30e5-de010ea0c9ff.png)

ディストリビューションの設定画面が表示されます。以下を設定して「設定を保存」をクリックします。

- **ワーカー・スレッド**：`1`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/71a89b3e-a55e-b281-0a5b-151a565fc6c9.png)


## タスク（シミュレーション）の実行とシミュレーション結果の確認

作成したインポートタスクの詳細画面を開き、「再開する」ボタンをクリックします。しばらく待つとタスクが完了するので、「シミュレーション結果の表示」ボタンをクリックしてシミュレーション結果を確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/dfb723f5-c880-a8fa-fd18-b55879a81b25.png)

シミュレーション結果が表示されます。タスク実行によりどのような変化があるか確認できます。「オブジェクトの追加」に「10」とありますが、これがADへのプロビジョニング結果を示しています。「10」をクリックすると、より詳細の画面を参照できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/d5c79908-9b57-c818-02d2-f8a68ff06c2b.png)

10件のユーザーがADにプロビジョニングされる予定であることを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/7d7cfbc4-0740-0b77-1238-20536e72b76d.png)

アカウント名をクリックすると、その1件の詳細情報を確認できます。ADにどういう属性をプロビジョニングしようとしたか詳細に確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35233/a418852e-3028-9ae0-421a-c5a5d994bab3.png)



# まとめ

24日目では、midPointの新しい機能である「シミュレーション」について紹介しました。シミュレーションを活用することで、midPointの設定変更による影響を事前に安全に確認することができます。（自分が知る限り）他のIDM/IGAにはない、非常にユニークな機能だと思います。今まで本番環境でドキドキしながら最初のデータ連携を実施していましたが、うまく活用すれば、今まで以上に自信を持って取り組むことができそうです:muscle:


:xmas-tree::xmas-tree::xmas-tree:明日はいよいよ最終日です:xmas-tree::xmas-tree::xmas-tree:

最後は、「midPoint 最新情報 - 2024 Winter」と題して、ここ数年のmidPointのアップデートをまとめて紹介したいと思います！