【Azure】AGICでSSL証明書を利用する【AKS】

## はじめに
Azure Kubernetes Service (AKS) は Microsoft Azure の Kubernetes サービスである。
AKS で利用するイングレスコントローラーは主に以下の2つのいずれかになる。

* NGINX イングレス コントローラー
* Application Gateway イングレス コントローラー

Application Gateway とは、Azure の L7 ロードバランサーであり、SSL終端やWAF機能（オプション）等を利用することができる。
本記事では、Application Gateway イングレス コントローラー (AGIC) を利用したときの HTTPS 設定方法を解説する。

## AGICのデプロイ
AGICのデプロイ方法は、大きく分けて以下の2つの方法がある。

* AGIC アドオンによるデプロイ
* Helm によるデプロイ

2020年12月現在、AGIC アドオンによるデプロイはプレビュー機能である。
現時点では、AGIC アドオンでは ```shared``` が適用されない（＝AKSによる振り分けと手動振り分け設定が共存できない）ことから、Helmデプロイをお勧めする。（※ちょっと大変です。）

具体的なデプロイ手順については、以下のドキュメントを参照されたい。

* Application Gateway イングレス コントローラーとは
https://azure.github.io/application-gateway-kubernetes-ingress/features/appgw-ssl-certificate/

* 既存の Application Gateway を使用して Application Gateway イングレス コントローラー (AGIC) をインストールする
https://docs.microsoft.com/ja-jp/azure/application-gateway/ingress-controller-install-existing


## AGICを利用してHTTPSでWebアプリを公開する

手順の概要は、以下である。

1. SSL証明書を作成し、AppGwに証明書を構成する

1. Ingress のマニフェスト yaml ファイルを修正し、デプロイする

例として https://test.com というURLのサイトを公開する手順を示す。

### 1. SSL証明書を作成し、AppGwに証明書を構成する

Linux 端末にて下記のコマンドを実行する。概要は次の通り。

1. OpenSSL で test.com の自己署名証明書を作成する。
1. Application Gateway にアップロードするため、SSL証明書を PKCS #12 形式に変換する。
1. Azure CLI を使用して、Application Gateway にSSL証明書をアップロードする。

```azcli:
appgwName="<Application Gateway 名>"
resgp="<Application Gatway のリソースグループ>"

# generate certificate for testing
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -out test-cert.crt \
  -keyout test-cert.key \
  -subj "/CN=test"

openssl pkcs12 -export \
  -in test-cert.crt \
  -inkey test-cert.key \
  -passout pass:test \
  -out test.pfx

# configure certificate to app gateway
az network application-gateway ssl-cert create \
  --resource-group $resgp \
  --gateway-name $appgwName \
  -n mysslcert \
  --cert-file test.pfx \
  --cert-password "test"

```

上記コマンド例では Application Gateway に直接SSL証明書をアップロードしているが、KeyVault を経由して Application Gateway にSSL証明書を構成することも可能。
[参考：【Azure】Application Gateway と Key Vault を連携してSSL証明書を設定する（Azure CLI）](https://qiita.com/yukit7s/items/39c5c4ac7a32253be3f7)

### 2. Ingress のマニフェスト yaml ファイルを修正し、デプロイする


手順1 を実施したことで Application Gateay に **mysslcert** という名前で証明書が構成されている。
Ingress のマニフェストファイルに新しいアノテーション ```appgw.ingress.kubernetes.io/appgw-ssl-certificate: mysslcert``` を追加することで、HTTPS設定を有効にすることができる。  
一例として **test-com-app.yml** を作成し、以下の内容とする。

```yaml:test-com-app.yml
apiVersion: v1
kind: Pod
metadata:
  name: aspnetapp
  labels:
    app: aspnetapp
spec:
  containers:
  - image: "mcr.microsoft.com/dotnet/core/samples:aspnetapp"
    name: aspnetapp-image
    ports:
    - containerPort: 80
      protocol: TCP

---

apiVersion: v1
kind: Service
metadata:
  name: aspnetapp
spec:
  selector:
    app: aspnetapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

---

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: aspnetapp
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/appgw-ssl-certificate: mysslcert
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: aspnetapp
          servicePort: 80
```

作成したマニフェストデでデプロイする。

```
kubectl apply -f test-com-app.yml
```

Ingress を確認し、 ADDRESS に Application Gateway のIPアドレスが反映されていることを確認する。Application Gateway の更新に5分ほど時間がかかる場合がある。

```
kubectl get ingress
```

ブラウザにて、 https://test.com にアクセスし、HTTPS通信になっていることを確認する。
※ アクセス元端末の hosts に test.com --> Applciation Gateway のIPアドレス を追加すること。

また、Azure Portal で Application Gateway を確認すると、AKSによって構成されたHTTPSのリスナーが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395457/d457f0aa-be5e-d43c-a23e-cb4103b1c43e.png)


## 参考
* Ingressコントローラー
https://kubernetes.io/ja/docs/concepts/services-networking/ingress-controllers/ 

* Application Gateway イングレス コントローラーとは
https://docs.microsoft.com/ja-jp/azure/application-gateway/ingress-controller-overview

* Appgw ssl certificate
https://azure.github.io/application-gateway-kubernetes-ingress/features/appgw-ssl-certificate/

* Azure Command-Line Interface (CLI) documentation
https://docs.microsoft.com/ja-jp/cli/azure/