キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 
cancel
2558
閲覧回数
0
いいね!
4
返信

APIを利用したWebexユーザの一括削除

shoko-fukami
Level 1
Level 1

今回お客様から4000名程度のユーザを削除したいとの要望を受けており、御社ご提供のスクリプト使用を検討しています。以下のリンクでは最大100名まで削除可能と記載されていますが、100名以上の大量のユーザを一括で削除するには、どのようにスクリプトを修正すればいいか、アドバイスいただくことは可能でしょうか。

※スクリプト内の「if totalUsers > 100」を単純に「4000」などへ変更すれば動作するのか、

他の行も(大幅に)修正が必要なのか、判断ができない状況です。

 

■参考にした手順

https://help.webex.com/ja-JP/article/hglkq6/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4

 

■サンプルスクリプト

https://github.com/mklawiter/webexControlHubScripts/blob/primary/BulkDeleteUsers.py にある参照スクリプト。

※一部文字コードの指定を修正することで、100名までのユーザは削除できることを確認済み。

 

1 件の受理された解決策

受理された解決策

詳細なご説明ありがとうございました。

おかげ様で大量のユーザをスクリプトで効率的に削除することができました。

元の投稿で解決策を見る

4件の返信4

Tohru Ohzono
Cisco Employee
Cisco Employee

こんにちは。

該当のスクリプトをざっと見てみましたが、
構造的には、"if totalUsers > 4000:"とすれば、最大4000ユーザまで削除する意味になります。
動きとしてはCSVで指定できるユーザ数がこのif文で制限されています。

仕組みとしてはCSVを読み込んで、
emailをキーにユーザ情報を取得(GET /v1/people)して、削除する(DELETE /v1/people/{id})を繰り返しているだけになります。

処理の効率性はそれほど考慮された実装ではないので、4000件処理するのには、
かなりの時間がかると思います。
順調に進んでも2時間から3時間くらいはかかるんじゃないかと思います。
HTTPレスポンスの429の処理が、「とりあえず30秒待つ」になっているので、
HTTPレスポンスコードの429を受信するようなケースが多くなると、
その分、処理時間がどんどん長くなると思います。
リクエストが多すぎると、APIサーバー側で動的な判断でリクエストを受け付けなくなり、
429エラーとなって、"Retry-After"ヘッダーで待つべき秒数を返す仕組みになっています。
動的な処理なので、具体的にどのくらいこのエラーが発生するかは予測が難しいです。

また、エラーは429しか処理していないので、その他のエラー発生時は、
エラー用のファイルに書き込み仕組みになっているので、スクリプトを動かした後に、
エラーファイルを検証して、そのユーザだけ再度削除を試みるかの検討が必要かと思います。
エラーファイルを見て、エラーコードが404だったら、その項目は無視してもいいと思います。
(ユーザがすでに存在しないのに削除しようとした意味になります。)

効率性を追求した実装になっていないとか、エラー発生時の処理も理想的ではないということを理解したうえで、
運用上、単発的に活用するのであれば、特に問題ないかと思います。

"https://api.ciscospark.com/"というAPIのパスがちょっと古くて、まだ使えるのですが、
"https://webexapis.com/"に変えてもいいかもしれません(動きは変わらないはずですが)。

WebexのAPIとは異なる理由で落ちる可能性もあるので、その場合は柔軟に対応する必要が出てくるかもしれません。
処理中に利用しているライブラリ内部から例外が送出される可能性とか、
CSV関連の処理でメモリ系の問題が発生するなどの可能性も一応あります(4000件程度なのでメモリ的には普通は問題ないと思っています)。

該当のスクリプトに関しては、サポートが提供されるものではないのですが(フッターにDiscrimerがあります)、
コミュニティでは気軽に相談いただいて構いません。
対応はベストエフォートとなります。

ご返信ありがとうございます。

 

emailをキーにユーザ情報を取得(GET /v1/people)して

今回のお客様はもともとAzureADからユーザをプロビジョニングして使用されていたのですが、AzureADから削除されたユーザは以下のようなメールアドレスに自動的に変更されています。このようなメールアドレスでも動作すると考えておりますが

何か懸念点などございますでしょうか。

02ef80a5276c4ef29b44cdcb5fd7c3cetest_tmp758@testdomain.jp

 

>HTTPレスポンスの429の処理が、「とりあえず30秒待つ」

こちらは1件の処理につき、30秒でしょうか?ここの秒数を変更するシチュエーションがあるのか、よくわかっておらず。

 

>"https://webexapis.com/"

スクリプトを上記に修正して使用してみます。

 

処理負荷や時間が読めない部分があるため、ひとまず100件程度で実施し、そのあと1000件×4回など小分けで実施してみようと思います。

また結果はご報告させてください。

こんにちは。

WebexのアカウントIDとして該当のメールアドレス形式のIDが存在するのであれば、
その組織内の管理者から"GET /v1/people" APIで情報は取得できるはずです。

HTTP 429のレスポンスが返ってきた際は、
本来は、Retry-Afterヘッダーの値からAPIサーバが指示している待つべき秒数を取得して、
その秒数(+1秒くらい)待つのがお勧めです。
該当のスクリプトでは、このヘッダは確認せずに、「とりあえず30秒待つ」という処理をしているので、
最適な処理にはなっていません。
APIサーバ側がRetry-Afterで指示した待つべき秒数が、30秒よりもかなり短ければ、
余計に時間がかかる結果になり、指示した秒数が30秒よりも長い場合は、
次のリクエストも失敗する可能性が高くなります。
通常は、Retry-Afterで指示される待ち時間は30秒よりも短いので、
余計な待ち時間が発生するようになる可能性の方が高いです。

4000件分の処理を実行した場合は、何もエラーが発生しない前提では、
GET -> DELETEの各リクエストを4000回ずつ実行しているので、
合計8000リクエスト行うことになります(厳密には最初に1回GET /v1/people/meを実行するので8001リクエストです)。

確率の問題だけでいえば、HTTP 429のレスポンスは、各リクエストで発生する可能性はゼロではありません。
今の実装では各リクエストごとに発生すれば、とりあえず30秒間は何もせず、30秒後にリトライするような実装になっています。
現実的にはHTTP 429のレスポンスは今回の実装ではあまり発生しないとは思います。
GET -> DELETEの2回のリクエストで1秒から2秒くらいはかかるんじゃないかと思いますが、
このペースであれば、HTTP 429はそれほど発生しないと思います。
ただし、APIサーバー側の状況によるので、発生しない保証もないです。

非同期のAsync IOを活用して処理を最適化した場合は、大幅に時間短縮できるはずですが、
そのような最適化した実装をした場合は、HTTP 429を適切に扱う実装をした方がいいと思います。
今回、それほどの最適化を意図しないのであれば、あまり気にしなくてもいいと思いますが、
該当スクリプトでは、HTTP 429を受信した際に、
"Webex returned a 429 response (too many API calls at once). Pausing script for 30 seconds..."
というメッセージをコンソールに出力する実装になっているようなので、
このメッセージが頻発していないかは見ておいた方がいいと思います。
例えば、このメッセージが約30秒おきに何度も出力された場合は、エラーのループになっているかもしれません。
(40秒待つ必要がある状況で、30秒後にリクエストを続けていると、エラーループになる可能性はあります。)

詳細なご説明ありがとうございました。

おかげ様で大量のユーザをスクリプトで効率的に削除することができました。