
こんにちは、コンテナソリューショングループの髙井です。
AzureのApplication Gateway Ingress Controller、いわゆるAGICを利用する際に気を付けたいポイントについて説明します。
具体的には、Key Vaultに登録したSSL証明書を、AKSのAGICから指定して利用するパターンについてお話します。
Application GatewayへのSSL証明書の登録
Application Gatewayを使うからにはSSL終端するという利用ケースは少なくないでしょう。
AzureのApplication Gaetwayへの証明書登録には大きく2通りの方法があります。
- Application Gatewayに直接SSL証明書を登録する
- Key Vaultに登録された証明書をAppliaction Gatewayから参照して登録する
詳細は割愛しますが、特に運用環境においてはKey Vaultに証明書を登録すると有効期限管理などいろいろ便利なので、Key Vault経由で使いたいパターンが多くなりそうです。
AGICのインストール種別
現状、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を読むとよいでしょう。
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ライフを~、お疲れさまでした。