【Azure】Application Gateway と Key Vault を連携してSSL証明書を設定する（Azure CLI）

## はじめに
Application Gateway v2 SKU では、サーバー証明書用の Key Vault との統合をサポートしている。Application Gateway の SSL証明書設定に Key Vault を利用すること、証明書更新時のリスク低減などのメリットがある。詳細は公式ドキュメントを参照されたい。
https://docs.microsoft.com/ja-jp/azure/application-gateway/key-vault-certs

本記事では、Azure CLIを使って Application Gateway と Key Vault を連携し、SSL証明書を登録する手順を解説する。

## 手順
![連携イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395457/fe2939ee-18ce-1d86-4f2d-f5aaf6153b83.png)

### 手順概要
以下に手順概要を示す。なお、Application Gateway とSSL証明書はあらかじめ用意してあり、操作端末には Azure CLI がインストールされているものとする。

1. 初期設定
    1. Key Vault コンテナーを作成する
    1. マネージド ID を作成する
    1. 作成したマネージドIDを Application Gateway にアサインする
    1. Key Vault のアクセスポリシーにマネージド ID を追加する
1. SSL証明書の登録
    1. SSL証明書を Key Vault にインポートし、証明書の *sid*（バージョン情報除外） を変数に格納する
    1. Key Vault に格納された証明書を Application Gateway に登録する

### 手順説明

```shell
# Configure your resources
appgwName=""
appgwResgp=""
keyvaultResgp=""
vaultName=""
location=""
sslCertName=""  # SSL証明書の Azure Portal での表示名になる

# Azure にログイン
az login
az account set -s "{SUBSCRIPTION_ID}"

#### 1. 初期設定 ####
# One time operation, create Azure key vault and certificate (can done through portal as well)
az keyvault create -n $vaultName -g $keyvaultResgp --enable-soft-delete -l $location

# One time operation, create user-assigned managed identity
az identity create -n appgw-id -g $appgwResgp -l $location
identityID=$(az identity show -n appgw-id -g $appgwResgp -o tsv --query "id")
identityPrincipal=$(az identity show -n appgw-id -g $appgwResgp -o tsv --query "principalId")

# One time operation, assign the identity to Application Gateway
az network application-gateway identity assign \
  --gateway-name $appgwName \
  --resource-group $appgwResgp \
  --identity $identityID

# One time operation, assign the identity GET secret access to Azure Key Vault
az keyvault set-policy \
-n $vaultName \
-g $keyvaultResgp \
--object-id $identityPrincipal \
--secret-permissions get


#### 2. SSL証明書の登録 ####
# For each new certificate, create a cert on keyvault and add unversioned secret id to Application Gateway
az keyvault certificate import  \
--file {ssl sertification file}  \
--password {ssl sertification password} \
--name $sslCertName  \
--vault-name $vaultName

versionedSecretId=$(az keyvault certificate show -n $sslCertName --vault-name $vaultName --query "sid" -o tsv)

unversionedSecretId=$(echo $versionedSecretId | cut -d'/' -f-5) # remove the version from the url

# For each new certificate, Add the certificate to AppGw
az network application-gateway ssl-cert create \
-n $sslCertName \
--gateway-name $appgwName \
--resource-group $appgwResgp \
--key-vault-secret-id $unversionedSecretId # ssl certificate with name "$sslCertName" will be configured on AppGw


#### 参考：証明書確認コマンド ####
az keyvault certificate list --vault-name $vaultName
az network application-gateway ssl-cert list -g $appgwResgp --gateway-name $appgwName
```
上記の手順で Application Gateway にSSL証明書が登録される。

AKSでAGIC連携している場合は、デプロイマニフェストに ```appgw.ingress.kubernetes.io/appgw-ssl-certificate: {SSL証明書の登録名}``` を追加することで、SSL証明書を利用できる。  詳細は [【Azure】AGICでSSL証明書を利用する【AKS】](https://qiita.com/yukit7s/items/606c23a05b247c005d77#2-ingress-%E3%81%AE%E3%83%9E%E3%83%8B%E3%83%95%E3%82%A7%E3%82%B9%E3%83%88-yaml-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BF%AE%E6%AD%A3%E3%81%97%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B) を参照頂きたい。

### ポイント
1. **az network application-gateway ssl-cert create** の **--key-vault-secret-id** に指定するパラメータは、**certificates id** ではなく、**secret id（のバージョン情報を削除した値）** である。
    ×：```https://example-key.vault.azure.net/certificates/test-com```
    ○：```https://example-key.vault.azure.net/secrets/test-com```

1. [参考*2](https://azure.github.io/application-gateway-kubernetes-ingress/features/appgw-ssl-certificate/) には、AKSのAGICで利用するサービスプリンシパルにマネージドIDの　**"Managed Identity Operator"** 権限を付与する手順が記載されている。必要性がわからなかったため本記事ではスキップしている。


## 参考
1. Key Vault 証明書を使用した TLS 終端
  https://docs.microsoft.com/ja-jp/azure/application-gateway/key-vault-certs

1. Configure certificate from Key Vault to AppGw
  https://azure.github.io/application-gateway-kubernetes-ingress/features/appgw-ssl-certificate/

1. Application Gateway v2 の Key Vault 連携を試してみた
  https://blog.shibayan.jp/entry/20190428/1556442190