前置き
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が更新されるんじゃないか?とやってみたらうまくいった ↩