こんにちは、コンテナソリューショングループの髙井です。
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ライフを~、お疲れさまでした。