前置き
AzureのRBACをちゃんと理解していれば調べるまでもないことで,Microsoftのドキュメントをちゃんと読んでいれば理解できることではあるのだが,同じことを過去に一度調べた記憶があるので,自分用に記録を残しておくことにする.
経緯
AKSでInternal Load Balancerを使おうと,ここを参考にkubectl applyしたのだが,EXTERNAL-IPが<pending>のままである.
考えてみれば当然で,LBの配備先にAKSの管理下に無いサブネットを指定しているのだから,クラスタのサービスプリンシパルに対象サブネットを操作する権限が必要である.
前述のマニュアルにもバッチリと「Network Contributorロールをクラスタのサービスプリンシパルを当てる必要があるよ」と書かれている.ドキュメントはちゃんと読もう.
問題
さて,意気揚々と実行してみると次のようなエラーが出た.
$ az role assignment create --assignee ********-****-****-****-************ --role "Network Contributor" --scope /subscriptions/********-****-****-****-************/resourceGroups/RG_SAMPLE/providers/Microsoft.Network/virtualNetworks/sample
ERROR: The client 'firstname.sirname@domain.local' with object id '********-****-****-****-************' does not have authorization to perform action 'Microsoft.Authorization/roleAssignments/write' over scope '/subscriptions/********-****-****-****-************/resourceGroups/RG_SAMPLE/providers/Microsoft.Network/virtualNetworks/sample/providers/Microsoft.Authorization/roleAssignments/********-****-****-****-************'.
どうやらお前のアカウント(client)はロールを書き込む権限が無い.と怒られているようだ.
しかし,このアカウントはサブスクリプション上でContributorロールが割り当てられており,展開済みのリソースは全てこのアカウントから展開している.
何の権限が必要なのだろうか.
解決
RBACのアクセス権付与,つまりMicrosoft.Authorization/roleAssignments/writeへのアクセス権限は,組み込みのロールのうち
- Owner
- User Access Administrator
この2つのロールしか持っていないと公式ドキュメントに書いてある.
つまり,Contributorではアクセスできない.
わかってしまえば単純な話で,az role assignment createを実行するユーザにUser Access Administratorロールを割り当て,az logoutとaz loginを実行後1,再度az role assignment createを試すとうまくいった.
-
ログイン・ログアウトが必要だったのかはわからない.時間が経てば問題なかった可能性はあるが,私の環境では
User Access Administratorロールの割当直後az role assignment createが同じエラーで失敗していたので,再ログインすればcredentialが更新されるんじゃないか?とやってみたらうまくいった ↩