APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

AGICからKey Vault証明書を利用するときはManaged Identity Operatorロールを付与しよう

f:id:thanaism:20210609112801p:plain

こんにちは、コンテナソリューショングループの髙井です。
AzureのApplication Gateway Ingress Controller、いわゆるAGICを利用する際に気を付けたいポイントについて説明します。

具体的には、Key Vaultに登録したSSL証明書を、AKSのAGICから指定して利用するパターンについてお話します。

Application GatewayへのSSL証明書の登録

docs.microsoft.com

Application Gatewayを使うからにはSSL終端するという利用ケースは少なくないでしょう。

AzureのApplication Gaetwayへの証明書登録には大きく2通りの方法があります。

  • Application Gatewayに直接SSL証明書を登録する
  • Key Vaultに登録された証明書をAppliaction Gatewayから参照して登録する

詳細は割愛しますが、特に運用環境においてはKey Vaultに証明書を登録すると有効期限管理などいろいろ便利なので、Key Vault経由で使いたいパターンが多くなりそうです。

AGICのインストール種別

docs.microsoft.com

現状、AKSでAGICを利用するパターンには、以下の2通りがあります。

  • Helm経由でのインストール
  • アドオンでのインストール

今回お話しする内容は、特にアドオンを利用するパターンでハマりやすいかもしれません。

Key VaultのSSL証明書を利用する際に必要な事前作業

まず、Key Vaultに登録した証明書をApplication Gatewayから利用するには、以下の事前作業が必要です。

  • ユーザー定義のManaged Identityを作成しApplication Gatewayに紐づける
  • 紐づけたManaged IdentityにKey Vaultのシークレットget権限を付与する

そもそもApplication GatewayがKey Vault情報を読み取ることができなければ証明書が利用できません。これは当然そうですね。

また、この際に必要なのはシークレット取得のみです。キー証明書に関する権限は実は不要だったりします。

Azure PortalからAGICアドオンを有効にしてもManaged Identity Operatorロールは自動で付与されない

問題はここからです。

Azure Portal上からAGICを有効にした状態でKey Vaultから登録したSSL証明書を利用しようとすると、AGICのPodがエラーを吐きます。

長いエラー文ですが、重要部分のみ抜き出すと以下です。

it does not have permission to perform action 'Microsoft.ManagedIdentity/userAssignedIdentities/assign/action'

実は、先ほどApplication Gatewayに紐づけたユーザー定義のManaged Identityに対してAGICが参照・割り当てする権限を追加で付与しなければなりません。

それが、Managed Identity Operatorのロールです。

ロールのscopeはリソースグループやサブスクリプション全体にする必要はなく、Application Gatewayに紐づけたユーザー定義のManaged Identityの範囲のみで大丈夫です。

詳しくは、以下のGitHubにあるIssueを読むとよいでしょう。

github.com

Managed Identity Operatorロールの割り当て

下記のAzure CLIのコマンドを実行すると、割り当てが可能です。

AKS_NAME=your-aks-name  # AKSのリソース名称
AGW_ID_NAME=managed-identity-name  # Application Gatewayに紐づけたユーザー定義のManaged Identityの名称
az role assignment create \
  --role "Managed Identity Operator" \
  --assignee $(az identity list -o tsv --query "[?@.name == \`ingressapplicationgateway-${AKS_NAME}\`].principalId") \
  --scope $(az identity show -n ${AGW_ID_NAME} -g $RESOURCE_GROUP -o tsv --query "id")

おわりに

最後に、アドオン版AGICのPodはAKSのkube-systemというnamespaceにデプロイされているはずです。

AGICでなにかうまくいかなくなったら、

kubectl -n kube-system describe po ingress

と入力して最後にタブ補完させれば、エラーを吐いていないか簡単にチェックすることができます。

それではよいAzureライフを~、お疲れさまでした。