Azモジュールにも「Microsoft Graph化」の影響がある
はじめに
Azure ADの操作に必要なAPIは、元々「Azure AD Graph API」が使われていましたが、「Microsoft Graph API」に置き換わる予定になっています。
公式ドキュメント上は、2022/6までにMicrosoft Graphに移行せよとなっています。
しかしどうやら2022/6を待たずして、「Azure AD Graph」を利用している機能に影響が出ているものがあるようで、今回はそれでハマった話を共有します。
アップデートされた内容
ハマったのはAzure Powershell、Azモジュールで利用するコマンドです。
クラウド操作系のSDKでは、ユーザー側のインターフェースは言語に合ったコマンドが用意されていますが、裏側(クラウドとのインターフェース)はREST APIになっているというのは一般的な構成かと思います。
Azモジュールにおいてもそうなっていたようでしたが、「Azure AD Graph API」で実装されていた特定のコマンドで、2021/12にされたアップデート(v7.0.0)により「Microsoft Graph API」に変更されたものがあるようです。
Azure AD GraphとMicrosoft Graphで100%仕様が引き継がれていないことから、Azモジュールにおいても「見た目上のコマンドは変わってないけど、引き数や戻り値が変更になった」というパターンが存在します。
「New-AzADServicePrincipal」で受けた影響
私の運用している環境では、上記のコマンドを使ってサービスプリンシパルを作成するにあたり、これまで下記のようなコマンドで、「初期PW」および「有効期限」を指定して作成していました。
$credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential -Property @{ StartDate=Get-Date; EndDate=$spkey_enddate; Password=$APPLICATION_PW}
$sp = New-AzADServicePrincipal -DisplayName $userName `
-PasswordCredential $credentials
ところが、2021/12頃のUpdateでAzモジュールがバージョン7.0.0になり、
New-Objectの作成に失敗するようになります。
Cannot find type [Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential]: verify that the assembly containing this type is loaded.
(2022/1/12現在、既に更新されてしまってますが…!)ドキュメントを見ると、
サービスプリンシパルの作成にあたり、初期パスワードは指定できなくなりランダム文字列で作成される。サービスプリンシパルの作成後、下記の方法で取得せよと書いてありました。$sp = New-AzADServicePrincipal -DisplayName ServicePrincipalName
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sp.Secret)
$UnsecureSecret = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
ところが、このNew-AzADServicePrincipalの戻り値には「Secret」というプロパティは含まれておらず。
初期値の設定もできないし、作成されたはずの初期値が取得できない。詰んだ。
という年末年始を過ごしました…
対処方法
Azureのサポートに問い合わせたところ、下記となっていることが分かりました。
- 1/4にリリースされたv7.1.0で修正済み、
- 「$sp.PasswordCredentials.SecretText」でシークレットを取得可能
公式ドキュメントも新バージョンで公開されています
背景
この動作変更、冒頭に書いた通り、裏で使われるAPIがAAD graphからmicrosoft graphに切り替わったためとのこと。(サポートの方曰く)
確かに、microsoft graphの公式ドキュメントを見ると、サービスプリンシパルの作成時に「初期パスワードの指定」は出来なくなっています。
引用するとこんなメッセージが。
servicePrincipals 作成時に passwordCredential を追加することはサポートされていません。 servicePrincipal のパスワードを追加するには、addPassword メソッドを使用します。
この仕様自体は別に良いのですが、ちょっとした破壊的変更ですよね。AAD graphからmicrosoft graphに意識して変えた時はテストもするので良いのですが、別のSDKに包まれてるとこんなところの変更気付かないですよね…
おわりに
今回の件はgithub上でもissueが上がり色々と議論が行われており、かなり多くの人がハマっていたようでした。情報収集も大事ですね。
cloud shell上のモジュールも最新化されてましたので、もうハマる人はいないんじゃないか?と思いつつ…他に居るかは分かりませんが、運悪くたどり着いた方のためにも、備忘として残します。
Discussion