---
title: Tanzu Application Platform 1.2 (Full Profile) をAKSにインストールしAzure ADと連携するメモ - Self Signed編
tags: ["Kubernetes", "Cartographer", "AKS", "Tanzu", "TAP", "Knative", "Azure", "Backstage"]
categories: ["Dev", "CaaS", "Kubernetes", "TAP"]
date: 2022-07-19T18:04:53Z
updated: 2022-08-14T16:59:53Z
---

> ℹ️ 2022-08-14 1.2.1版にアップデートしました。

[Tanzu Application Platform 1.2](https://docs.vmware.com/en/Tanzu-Application-Platform/1.2/tap//GUID-overview.html) をAKSにインストールします。

本記事ではTAPをInstallし、"Hello World"なアプリケーションをソースコードからデプロイする機能("Source to URL")を試します。<br>
コンテナレジストリにはACRを使用し、RBACをAzure ADと連携します。<br>
また、Self Signedな証明書でHTTPSを有効にします。


**目次**
<!-- toc -->

### 必要なCLI

以下のCLIは事前にインストール済みとします。

* [kubectl](https://kubernetes.io/docs/tasks/tools/)
* [az](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli)


### リソースグループ作成

```
az group create --name tap-rg --location japaneast
```

### ACRインスタンスの作成

今回はACRのadminアカウントを使用します。

```
ACR_NAME=tap${RANDOM}
az acr create --resource-group tap-rg \
  --location japaneast \
  --name ${ACR_NAME} --sku standard \
  --admin-enabled true
```

```
ACR_SERVER=${ACR_NAME}.azurecr.io
ACR_USERNAME=${ACR_NAME}
ACR_PASSWORD=$(az acr credential show --name ${ACR_NAME} --resource-group tap-rg --query 'passwords[0].value' --output tsv)

docker login ${ACR_SERVER} -u ${ACR_USERNAME} -p ${ACR_PASSWORD}
```

### AKSクラスタの作成

AKSクラスタにはstandard_f4s_v2 (4 vCPU, 8GB Memory)のWorker Nodeを使用し、cluster-autoscalerを有効にしておきます。またAzure ADとの連携を有効にします。

```
az aks create \
  --resource-group tap-rg \
  --location japaneast \
  --name tap-sandbox \
  --node-count 2 \
  --enable-cluster-autoscaler \
  --min-count 1 \
  --max-count 10 \
  --node-vm-size standard_f4s_v2 \
  --load-balancer-sku standard \
  --zones 1 2 3 \
  --generate-ssh-keys \
  --attach-acr ${ACR_NAME} \
  --enable-aad
```

TAPのインストールはadminアカウントで行います。

```
az aks get-credentials --resource-group tap-rg --name tap-sandbox --admin --overwrite-existing
```


後にContourのEnvoyへのIPを静的に設定するための、権限をAKSクラスタに与ます。以下のドキュメントを参考にしました。<br>
https://docs.microsoft.com/en-us/azure/aks/static-ip#create-a-service-using-the-static-ip-address

```
RG_ID=$(az group show --name tap-rg -o tsv --query id )
SP_APP_ID=$(az aks show --name tap-sandbox --resource-group tap-rg --query "identity.principalId" -o tsv)
az role assignment create --assignee-object-id ${SP_APP_ID} --assignee-principal-type "ServicePrincipal" --role "Network Contributor" --scope ${RG_ID}
```

### Pivnet CLIのインストール

ここでは [`pivnet`](https://github.com/pivotal-cf/pivnet-cli) CLIを使用して必要なソフトウェアをダウンロードします。
`pivnet` CLIはbrewでインストールできます。

```
brew install pivotal/tap/pivnet-cli
```

[VMware Tanzu Network](https://network.tanzu.vmware.com/) のAPI Tokenを取得して、`pivnet` CLIでログインします。

```
pivnet login --api-token=<API Token>
```

### EULAの承諾

初めてインストールする場合は、以下のコンポーネントのEULAをAcceptしてください。

* [Tanzu Application Platform](https://network.tanzu.vmware.com/products/tanzu-application-platform/)
* [Cluster Essentials for VMware Tanzu](https://network.tanzu.vmware.com/products/tanzu-cluster-essentials/)

> ⚠️ EULAで定められている使用期間は30日間です。とは言え、特にソフトウェア的に制限がかけられているわけではありません。


### Tanzu CLIのインストール

```
# For Mac
pivnet download-product-files --product-slug='tanzu-application-platform' --release-version='1.2.1' --glob='tanzu-framework-darwin-amd64.tar'
# For Linux
pivnet download-product-files --product-slug='tanzu-application-platform' --release-version='1.2.1' --glob='tanzu-framework-linux-amd64.tar'
# For Windows
pivnet download-product-files --product-slug='tanzu-application-platform' --release-version='1.2.1' --glob='tanzu-framework-windows-amd64.zip'
```

```
tar xvf tanzu-framework-*-amd64.tar
install cli/core/v0.11.6/tanzu-core-*_amd64 /usr/local/bin/tanzu
export TANZU_CLI_NO_INIT=true
```

```
$ tanzu version
version: v0.11.6
buildDate: 2022-05-20
sha: 90440e2b
```

プラグインのインストール

```
tanzu plugin install --local cli all
```

### Cluster Essentials for VMware Tanzuのインストール

TAPのインストールに必要なKapp ControllerとSecretgen Controllerをデプロイするために [Cluster Essentials for VMware Tanzu](https://network.tanzu.vmware.com/products/tanzu-cluster-essentials/#/releases/1130414) をインストールします。

```
# Mac
pivnet download-product-files --product-slug='tanzu-cluster-essentials' --release-version='1.2.0' --glob='tanzu-cluster-essentials-darwin-amd64-*'
# Linux
pivnet download-product-files --product-slug='tanzu-cluster-essentials' --release-version='1.2.0' --glob='tanzu-cluster-essentials-linux-amd64-*'
```

```yaml
TANZUNET_USERNAME=...
TANZUNET_PASSWORD=...

mkdir tanzu-cluster-essentials
tar xzvf tanzu-cluster-essentials-*-amd64-*.tgz -C tanzu-cluster-essentials

export INSTALL_BUNDLE=registry.tanzu.vmware.com/tanzu-cluster-essentials/cluster-essentials-bundle:1.2.0
export INSTALL_REGISTRY_HOSTNAME=registry.tanzu.vmware.com
export INSTALL_REGISTRY_USERNAME=${TANZUNET_USERNAME}
export INSTALL_REGISTRY_PASSWORD=${TANZUNET_PASSWORD}
cd tanzu-cluster-essentials
./install.sh --yes
cd ..
```

### Tanzu Application Platformのインストール


#### TAP用Package Repositoryの登録

```
TANZUNET_USERNAME=...
TANZUNET_PASSWORD=...

kubectl create ns tap-install

tanzu secret registry add tap-registry \
  --username "${TANZUNET_USERNAME}" \
  --password "${TANZUNET_PASSWORD}" \
  --server registry.tanzu.vmware.com \
  --export-to-all-namespaces \
  --yes \
  --namespace tap-install

tanzu package repository add tanzu-tap-repository \
  --url registry.tanzu.vmware.com/tanzu-application-platform/tap-packages:1.2.1 \
  --namespace tap-install
```

#### Envoy用のPublic IPを作成

```
az network public-ip create --resource-group tap-rg --location japaneast --name envoy-ip --sku Standard --allocation-method static
```

```
ENVOY_IP=$(az network public-ip show --resource-group tap-rg --name envoy-ip --query ipAddress --output tsv)
```

#### Full Profileのインストール

TAPをインストールするための`tap-values.yml`を作成します。
`cnrs.domain_name`には仮のドメインを指定します。あとでenvoyのExternal IPが設定されてから変更します。

Learning Centerは使用しないため、またgrypeは個別にインストールした方良いため([こちらの記事](https://ik.am/entries/698)参照)、 これらのパッケージは`excluded_packages`除外します。
また、Cloud Native RuntimesはKnative Servingしか使わないので、それ以外のリソースを削除するoverlayを設定します。

```yaml
DOMAIN_NAME=$(echo ${ENVOY_IP} | sed 's/\./-/g').sslip.io

cat <<EOF > tap-values.yml
profile: full

ceip_policy_disclosed: true

cnrs:
  domain_name: ${DOMAIN_NAME}  
  domain_template: "{{.Name}}-{{.Namespace}}.{{.Domain}}"
  default_tls_secret: tanzu-system-ingress/cnrs-default-tls

buildservice:
  kp_default_repository: ${ACR_SERVER}/build-service
  kp_default_repository_username: ${ACR_USERNAME}
  kp_default_repository_password: ${ACR_PASSWORD}

supply_chain: basic

ootb_supply_chain_basic:
  registry:
    server: ${ACR_SERVER}
    repository: supply-chain
  gitops:
    ssh_secret: git-ssh

contour:
  infrastructure_provider: azure
  envoy:
    service:
      type: LoadBalancer
      externalTrafficPolicy: Local
      annotations:
        service.beta.kubernetes.io/azure-load-balancer-resource-group: tap-rg

tap_gui:
  ingressEnabled: true
  ingressDomain: ${DOMAIN_NAME} 
  service_type: ClusterIP
  tls:
    secretName: cnrs-default-tls
    namespace: tanzu-system-ingress
  app_config:
    app:
      baseUrl: https://tap-gui.${DOMAIN_NAME}
    backend:
      baseUrl: https://tap-gui.${DOMAIN_NAME}
      cors:
        origin: https://tap-gui.${DOMAIN_NAME}
    catalog:
      locations:
      - type: url
        target: https://github.com/sample-accelerators/tanzu-java-web-app/blob/main/catalog/catalog-info.yaml
      - type: url
        target: https://github.com/sample-accelerators/spring-petclinic/blob/accelerator/catalog/catalog-info.yaml
      - type: url
        target: https://github.com/tanzu-japan/spring-music/blob/tanzu/catalog/catalog-info.yaml

accelerator:
  domain: ${DOMAIN_NAME}  
  ingress:
    include: true
    enable_tls: true
  tls:
    secret_name: cnrs-default-tls
    namespace: tanzu-system-ingress
  server:
    service_type: ClusterIP

metadata_store:
  app_service_type: ClusterIP
  ingress_enabled: "true"
  ingress_domain: ${DOMAIN_NAME}

scanning:
  metadataStore:
    url: "" # Disable embedded integration since it's deprecated

package_overlays:
- name: contour
  secrets:
  - name: contour-loadbalancer-ip
- name: cnrs
  secrets:
  - name: cnrs-default-tls
  - name: cnrs-slim
- name: metadata-store
  secrets:
  - name: metadata-store-ingress-tls

excluded_packages:
- grype.scanning.apps.tanzu.vmware.com
- learningcenter.tanzu.vmware.com
- workshops.learningcenter.tanzu.vmware.com
EOF
```

> ℹ️ LoadBalacerに関する[annotations](https://docs.microsoft.com/en-us/azure/aks/load-balancer-standard#additional-customizations-via-kubernetes-annotations)は`contour.envoy.service.annotations`に指定可能です。

ContourのEnvoyに対するLoad BalancerのIPを固定するための次の定義をoverlayで作成します。以下のドキュメントを参考にしました。

* https://docs.microsoft.com/en-us/azure/aks/static-ip#create-a-service-using-the-static-ip-address

```yaml
cat <<EOF > contour-loadbalancer-ip.yml
#@ load("@ytt:overlay", "overlay")
#@overlay/match by=overlay.subset({"kind": "Service", "metadata": {"name": "envoy"}})
---
spec:
  #@overlay/match missing_ok=True
  loadBalancerIP: ${ENVOY_IP}
EOF
```

Cloud Native Runtimesで使用するデフォルトのTLS証明書を用意するための次の定義をoverlayで作成します。以下のドキュメントを参考にしました。

* https://docs.vmware.com/en/Cloud-Native-Runtimes-for-VMware-Tanzu/1.3/tanzu-cloud-native-runtimes/GUID-knative-default-tls.html
* https://knative.dev/docs/serving/using-a-tls-cert/#manually-adding-a-tls-certificate

```yaml
cat <<EOF > cnrs-default-tls.yml
#@ load("@ytt:data", "data")
#@ load("@ytt:overlay", "overlay")
#@ namespace = data.values.ingress.external.namespace
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: cnrs-selfsigned-issuer
  namespace: #@ namespace
spec:
  selfSigned: { }
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: cnrs-ca
  namespace: #@ namespace
spec:
  commonName: cnrs-ca
  isCA: true
  issuerRef:
    kind: Issuer
    name: cnrs-selfsigned-issuer
  secretName: cnrs-ca
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: cnrs-ca-issuer
  namespace: #@ namespace
spec:
  ca:
    secretName: cnrs-ca
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: cnrs-default-tls
  namespace: #@ namespace
spec:
  dnsNames:
  - #@ "*.{}".format(data.values.domain_name)
  issuerRef:
    kind: Issuer
    name: cnrs-ca-issuer
  secretName: cnrs-default-tls
---
apiVersion: projectcontour.io/v1
kind: TLSCertificateDelegation
metadata:
  name: contour-delegation
  namespace: #@ namespace
spec:
  delegations:
  - secretName: cnrs-default-tls
    targetNamespaces:
    - "*"
#@overlay/match by=overlay.subset({"metadata":{"name":"config-network"}, "kind": "ConfigMap"})
---
data:
  #@overlay/match missing_ok=True
  default-external-scheme: https
EOF
```

Cloud Native RuntimesからKnative Serving以外のリソースを削除するoverlayを作成します。

```yaml
cat <<EOF > cnrs-slim.yml
#@ load("@ytt:overlay", "overlay")
#@overlay/match by=overlay.subset({"metadata":{"namespace":"knative-eventing"}}), expects="1+"
#@overlay/remove
---
#@overlay/match by=overlay.subset({"metadata":{"namespace":"knative-sources"}}), expects="1+"
#@overlay/remove
---
#@overlay/match by=overlay.subset({"metadata":{"namespace":"triggermesh"}}), expects="1+"
#@overlay/remove
---
#@overlay/match by=overlay.subset({"metadata":{"namespace":"vmware-sources"}}), expects="1+"
#@overlay/remove
---
EOF
```

Metadata StoreにCloud Native RuntimesのデフォルトのTLS証明書を使うoverlayを作成します。

```yaml
cat <<EOF > metadata-store-ingress-tls.yml
#@ load("@ytt:overlay", "overlay")
#@overlay/match by=overlay.subset({"metadata":{"name":"metadata-store-ingress"}, "kind": "HTTPProxy"})
---
spec:
  virtualhost:
    tls:
      secretName: tanzu-system-ingress/cnrs-default-tls
#@overlay/match by=overlay.subset({"metadata":{"name":"ingress-cert"}, "kind": "Certificate"})
#@overlay/remove
---
EOF
```

overlayファイルをSecretとして作成します。

```
kubectl -n tap-install create secret generic contour-loadbalancer-ip \
  -o yaml \
  --dry-run=client \
  --from-file=contour-loadbalancer-ip.yml \
  | kubectl apply -f-

kubectl -n tap-install create secret generic cnrs-default-tls \
  -o yaml \
  --dry-run=client \
  --from-file=cnrs-default-tls.yml \
  | kubectl apply -f-

kubectl -n tap-install create secret generic cnrs-slim \
  -o yaml \
  --dry-run=client \
  --from-file=cnrs-slim.yml \
  | kubectl apply -f-

kubectl -n tap-install create secret generic metadata-store-ingress-tls \
  -o yaml \
  --dry-run=client \
  --from-file=metadata-store-ingress-tls.yml \
  | kubectl apply -f-
```

TAPをインストールします。

```
tanzu package install tap -p tap.tanzu.vmware.com -v 1.2.1 --values-file tap-values.yml -n tap-install --wait=false
```

インストールの進捗は次のコマンドで確認します。

```
watch kubectl get node,app,pod -A -owide
```

途中で`Reconcile failed`と出力されても、再度Reconcileすることで`Reconcile failed`になることがあります。


全てのappが `Reconcile succeeded` になるまで待ちます。10分くらいかかります。次のコマンドでwaitできます。

```
kubectl wait app -n tap-install tap --for=jsonpath='{.status.friendlyDescription}'="Reconcile succeeded" --timeout=30m
```

完了すれば次のログが出力されます。
```
app.kappctrl.k14s.io/tap condition met
```

インストール完了後のapp一覧は次のとおりです。

```
$ kubectl get app -n tap-install 
NAME                       DESCRIPTION           SINCE-DEPLOY   AGE
accelerator                Reconcile succeeded   7m58s          8m5s
api-portal                 Reconcile succeeded   99s            12m
appliveview                Reconcile succeeded   7m25s          8m4s
appliveview-connector      Reconcile succeeded   97s            12m
appliveview-conventions    Reconcile succeeded   8m25s          8m32s
appsso                     Reconcile succeeded   9m37s          9m44s
buildservice               Reconcile succeeded   12m            12m
cartographer               Reconcile succeeded   8m58s          9m43s
cert-manager               Reconcile succeeded   12m            12m
cnrs                       Reconcile succeeded   7m9s           8m4s
contour                    Reconcile succeeded   9m37s          9m44s
conventions-controller     Reconcile succeeded   9m38s          9m45s
developer-conventions      Reconcile succeeded   8m26s          8m32s
fluxcd-source-controller   Reconcile succeeded   66s            12m
image-policy-webhook       Reconcile succeeded   9m38s          9m44s
metadata-store             Reconcile succeeded   6m56s          8m3s
ootb-delivery-basic        Reconcile succeeded   6m36s          6m43s
ootb-supply-chain-basic    Reconcile succeeded   6m36s          6m43s
ootb-templates             Reconcile succeeded   6m48s          8m2s
policy-controller          Reconcile succeeded   9m36s          9m44s
scanning                   Reconcile succeeded   12m            12m
service-bindings           Reconcile succeeded   2m10s          12m
services-toolkit           Reconcile succeeded   12m            12m
source-controller          Reconcile succeeded   9m38s          9m45s
spring-boot-conventions    Reconcile succeeded   8m25s          8m32s
tap                        Reconcile succeeded   8m6s           13m
tap-auth                   Reconcile succeeded   2m44s          12m
tap-gui                    Reconcile succeeded   6m54s          8m3s
tap-telemetry              Reconcile succeeded   2m30s          12m
tekton-pipelines           Reconcile succeeded   99s            12m
```

インストールされたパッケージは次の通りです。

```
$ kubectl get packageinstall -n tap-install 
NAME                       PACKAGE NAME                                         PACKAGE VERSION   DESCRIPTION           AGE
accelerator                accelerator.apps.tanzu.vmware.com                    1.2.2             Reconcile succeeded   8m30s
api-portal                 api-portal.tanzu.vmware.com                          1.0.24            Reconcile succeeded   13m
appliveview                backend.appliveview.tanzu.vmware.com                 1.2.1             Reconcile succeeded   8m30s
appliveview-connector      connector.appliveview.tanzu.vmware.com               1.2.1             Reconcile succeeded   13m
appliveview-conventions    conventions.appliveview.tanzu.vmware.com             1.2.1             Reconcile succeeded   8m57s
appsso                     sso.apps.tanzu.vmware.com                            1.0.0             Reconcile succeeded   10m
buildservice               buildservice.tanzu.vmware.com                        1.6.1             Reconcile succeeded   13m
cartographer               cartographer.tanzu.vmware.com                        0.4.3             Reconcile succeeded   10m
cert-manager               cert-manager.tanzu.vmware.com                        1.5.3+tap.2       Reconcile succeeded   13m
cnrs                       cnrs.tanzu.vmware.com                                1.3.0             Reconcile succeeded   8m30s
contour                    contour.tanzu.vmware.com                             1.18.2+tap.2      Reconcile succeeded   10m
conventions-controller     controller.conventions.apps.tanzu.vmware.com         0.7.0             Reconcile succeeded   10m
developer-conventions      developer-conventions.tanzu.vmware.com               0.7.0             Reconcile succeeded   8m57s
fluxcd-source-controller   fluxcd.source.controller.tanzu.vmware.com            0.16.4            Reconcile succeeded   13m
image-policy-webhook       image-policy-webhook.signing.apps.tanzu.vmware.com   1.1.4             Reconcile succeeded   10m
metadata-store             metadata-store.apps.tanzu.vmware.com                 1.2.2             Reconcile succeeded   8m30s
ootb-delivery-basic        ootb-delivery-basic.tanzu.vmware.com                 0.8.1             Reconcile succeeded   7m9s
ootb-supply-chain-basic    ootb-supply-chain-basic.tanzu.vmware.com             0.8.1             Reconcile succeeded   7m9s
ootb-templates             ootb-templates.tanzu.vmware.com                      0.8.1             Reconcile succeeded   8m30s
policy-controller          policy.apps.tanzu.vmware.com                         1.0.1             Reconcile succeeded   10m
scanning                   scanning.apps.tanzu.vmware.com                       1.2.2             Reconcile succeeded   13m
service-bindings           service-bindings.labs.vmware.com                     0.7.2             Reconcile succeeded   13m
services-toolkit           services-toolkit.tanzu.vmware.com                    0.7.1             Reconcile succeeded   13m
source-controller          controller.source.apps.tanzu.vmware.com              0.4.1             Reconcile succeeded   10m
spring-boot-conventions    spring-boot-conventions.tanzu.vmware.com             0.4.1             Reconcile succeeded   8m57s
tap                        tap.tanzu.vmware.com                                 1.2.1             Reconcile succeeded   13m
tap-auth                   tap-auth.tanzu.vmware.com                            1.0.1             Reconcile succeeded   13m
tap-gui                    tap-gui.tanzu.vmware.com                             1.2.4             Reconcile succeeded   8m30s
tap-telemetry              tap-telemetry.tanzu.vmware.com                       0.2.1             Reconcile succeeded   13m
tekton-pipelines           tekton.tanzu.vmware.com                              0.33.5            Reconcile succeeded   13m
```

デプロイされたPodは次の通りです。

```
$ kubectl get pod -A
NAMESPACE                   NAME                                                          READY   STATUS    RESTARTS        AGE
accelerator-system          acc-engine-7b96d498f6-b87l9                                   1/1     Running   0               8m43s
accelerator-system          acc-server-7c758b6cb9-mflbr                                   1/1     Running   0               8m43s
accelerator-system          accelerator-controller-manager-79484f6977-mw2pw               1/1     Running   0               8m44s
api-portal                  api-portal-server-586f76979-6l2s8                             1/1     Running   0               13m
app-live-view-connector     application-live-view-connector-l86xt                         1/1     Running   0               13m
app-live-view-connector     application-live-view-connector-t8vll                         1/1     Running   0               6m13s
app-live-view-conventions   appliveview-webhook-856c959857-lrzft                          1/1     Running   0               9m13s
app-live-view               application-live-view-server-5f6f764699-bjh4t                 1/1     Running   0               8m13s
appsso                      operator-db468688d-fv9v8                                      1/1     Running   0               10m
build-service               build-pod-image-fetcher-7dftf                                 5/5     Running   0               13m
build-service               build-pod-image-fetcher-rpdhw                                 5/5     Running   0               6m13s
build-service               dependency-updater-controller-7d7c9677b-rs2s6                 1/1     Running   0               13m
build-service               secret-syncer-controller-bbc6ffd5f-frfhb                      1/1     Running   0               13m
build-service               smart-warmer-image-fetcher-4cxxc                              2/2     Running   0               6m13s
build-service               smart-warmer-image-fetcher-dgk6j                              0/2     Pending   0               6m55s
build-service               warmer-controller-74dd99c57b-gqxl8                            1/1     Running   0               13m
cartographer-system         cartographer-controller-7666cc78d5-rzwvm                      1/1     Running   0               9m40s
cartographer-system         cartographer-conventions-controller-manager-d4c7979b4-msv6q   1/1     Running   0               9m40s
cert-injection-webhook      cert-injection-webhook-bd7bbb8cb-6p7wt                        1/1     Running   0               13m
cert-manager                cert-manager-cainjector-969787b54-gcchx                       1/1     Running   0               13m
cert-manager                cert-manager-fcd5cb59d-z77pw                                  1/1     Running   0               13m
cert-manager                cert-manager-webhook-7574849877-h58dg                         1/1     Running   0               13m
conventions-system          conventions-controller-manager-76d746d877-gcznt               1/1     Running   0               10m
cosign-system               policy-webhook-fcc48cbbb-9kn8s                                1/1     Running   0               10m
cosign-system               webhook-59b45c5b79-pdm7k                                      1/1     Running   0               10m
developer-conventions       webhook-cbd9cf9c4-tb92z                                       1/1     Running   0               9m15s
flux-system                 source-controller-cbdcf5f6f-77db9                             1/1     Running   0               13m
image-policy-system         image-policy-controller-manager-689f59cbdf-ksnvn              2/2     Running   0               10m
kapp-controller             kapp-controller-64668dd9c7-t5vh9                              2/2     Running   0               17m
knative-serving             activator-66b9b5454f-64469                                    1/1     Running   0               7m31s
knative-serving             activator-66b9b5454f-9phh6                                    1/1     Running   0               7m31s
knative-serving             activator-66b9b5454f-gltwj                                    1/1     Running   0               7m45s
knative-serving             autoscaler-5bdf74df9b-n29jp                                   1/1     Running   0               7m44s
knative-serving             autoscaler-hpa-549ccbcddd-br9bh                               1/1     Running   0               7m45s
knative-serving             controller-6f8888dc9f-vfvv8                                   1/1     Running   0               7m44s
knative-serving             domain-mapping-687fd6c4c4-dcc65                               1/1     Running   0               7m44s
knative-serving             domainmapping-webhook-b797d6986-6r9x4                         1/1     Running   0               7m44s
knative-serving             net-certmanager-controller-84c78bd9d6-jvjxn                   1/1     Running   0               7m45s
knative-serving             net-certmanager-webhook-68955f5454-9pvwd                      1/1     Running   0               7m44s
knative-serving             net-contour-controller-c77b5894d-kvs5k                        1/1     Running   0               7m45s
knative-serving             webhook-97cd4c9c6-p79gn                                       1/1     Running   0               7m45s
knative-serving             webhook-97cd4c9c6-wn68h                                       1/1     Running   0               7m28s
kpack                       kpack-controller-7f64d78f8b-4jp8k                             1/1     Running   0               13m
kpack                       kpack-webhook-5fcb786696-p29ql                                1/1     Running   0               13m
kube-system                 azure-ip-masq-agent-7kt6c                                     1/1     Running   0               19m
kube-system                 azure-ip-masq-agent-kvdl9                                     1/1     Running   0               7m7s
kube-system                 cloud-node-manager-l7lpv                                      1/1     Running   0               19m
kube-system                 cloud-node-manager-mrdcb                                      1/1     Running   0               7m7s
kube-system                 coredns-autoscaler-7d56cd888-4ggnc                            1/1     Running   0               20m
kube-system                 coredns-dc97c5f55-t4h44                                       1/1     Running   0               18m
kube-system                 coredns-dc97c5f55-w8n8w                                       1/1     Running   0               20m
kube-system                 csi-azuredisk-node-45lzs                                      3/3     Running   0               7m7s
kube-system                 csi-azuredisk-node-7dqhz                                      3/3     Running   0               19m
kube-system                 csi-azurefile-node-78pxj                                      3/3     Running   0               19m
kube-system                 csi-azurefile-node-p4lvw                                      3/3     Running   0               7m7s
kube-system                 konnectivity-agent-6b6985fc46-4vk66                           1/1     Running   0               9m7s
kube-system                 konnectivity-agent-6b6985fc46-tq8gn                           1/1     Running   0               14m
kube-system                 kube-proxy-h95xs                                              1/1     Running   0               19m
kube-system                 kube-proxy-z5dtj                                              1/1     Running   0               7m7s
kube-system                 metrics-server-64b66fbbc8-qkcgc                               1/1     Running   0               20m
metadata-store              metadata-store-app-7c6fffd957-cbsc5                           2/2     Running   1 (2m42s ago)   7m42s
metadata-store              metadata-store-db-0                                           1/1     Running   0               7m42s
scan-link-system            scan-link-controller-manager-77458f487f-6xxxw                 2/2     Running   0               13m
secretgen-controller        secretgen-controller-6b9f68cf88-rt7gv                         1/1     Running   0               16m
service-bindings            manager-5ddb7fccf9-27wzc                                      1/1     Running   0               13m
services-toolkit            resource-claims-apiserver-79bb6955b7-7nb8m                    1/1     Running   0               13m
services-toolkit            services-toolkit-controller-manager-66d8568756-7lp77          1/1     Running   0               13m
source-system               source-controller-manager-7cdb8d487-bpx6g                     1/1     Running   0               10m
spring-boot-convention      spring-boot-webhook-7b6856848f-qk677                          1/1     Running   0               9m14s
stacks-operator-system      controller-manager-7c7d6b956f-2fcd8                           1/1     Running   0               13m
tanzu-system-ingress        contour-6c9c987f9f-5jjt5                                      1/1     Running   0               9m8s
tanzu-system-ingress        contour-6c9c987f9f-h2sf4                                      1/1     Running   0               10m
tanzu-system-ingress        envoy-bkh2j                                                   2/2     Running   0               10m
tanzu-system-ingress        envoy-x85m9                                                   2/2     Running   0               6m13s
tap-gui                     server-f557887d9-mwstv                                        1/1     Running   0               7m40s
tap-telemetry               tap-telemetry-informer-679589c4b5-5kqz4                       1/1     Running   4 (7m34s ago)   13m
tekton-pipelines            tekton-pipelines-controller-6c4f7cffdb-zv2b9                  1/1     Running   0               13m
tekton-pipelines            tekton-pipelines-webhook-596d648db5-mrtks                     1/1     Running   0               13m
```

Build Serviceで使用されるClusterBuilderがACRに作成されていることを確認します。

```
$ kubectl get clusterbuilder
NAME      LATESTIMAGE                                                                                                                        READY
base      tap28868.azurecr.io/build-service:clusterbuilder-base@sha256:5c4c3eef1a24a456264873b9bd4e85d8f4b7faf4fec114f0d3de4b686d6a4fa6      True
default   tap28868.azurecr.io/build-service:clusterbuilder-default@sha256:5c4c3eef1a24a456264873b9bd4e85d8f4b7faf4fec114f0d3de4b686d6a4fa6   True
```

次のコマンドを実行し、EnvoyのIPを取得して、`${ENVOY_IP}`と同じ値になっていることを確認してください。

```
kubectl get -n tanzu-system-ingress svc envoy -ojsonpath='{.status.loadBalancer.ingress[0].ip}'
```


Ingress (Contour)経由でアクセスできるコンポーネントは次の通りです。

```
$ kubectl get httpproxy -A
NAMESPACE            NAME                     FQDN                                    TLS SECRET                              STATUS   STATUS DESCRIPTION
accelerator-system   accelerator              accelerator.20-89-141-216.sslip.io      tanzu-system-ingress/cnrs-default-tls   valid    Valid HTTPProxy
metadata-store       metadata-store-ingress   metadata-store.20-89-141-216.sslip.io   tanzu-system-ingress/cnrs-default-tls   valid    Valid HTTPProxy
tap-gui              tap-gui                  tap-gui.20-89-141-216.sslip.io          tanzu-system-ingress/cnrs-default-tls   valid    Valid HTTPProxy
```


### TAP GUIへのアクセス

TAP GUIへのホスト名は次のコマンドで確認できます。

```
$ kubectl get httpproxy -n tap-gui tap-gui -ojsonpath='{.spec.virtualhost.fqdn}'
tap-gui.20-89-141-216.sslip.io
```

このホスト名へHTTPSでアクセスします。

> ⚠️ `cnrs.domain_name`の設定変更後TAP-GUIのPodが再作成されるので、再作成後にアクセスしてください。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/178155402-034c3928-1dce-4257-8e0c-a5e979e366e1.png">

自己署名証明書を使用しているので"THIS IS UNSAFE"を入力してください。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/178155454-d6515909-27d8-4da0-8caf-20b7f2a5dc91.png">

TAP GUIの認証設定を行っていないので、Guest Userでログインします。後ほどAzure ADでログインできるようにします。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/178155490-cb805f53-667c-481d-97e6-abec3e04adbc.png">

"YOUR ORGANIZATION"の"All"をクリックします。

インストール時に設定したCatalogが登録されています。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/178155533-3c2937f6-b76a-431d-801d-ce46295f77ff.png">

サイドバーの➕アイコンをクリックすると"Accelerators"一覧が表示されます。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/179791560-9d143ac3-a697-4df9-82fa-9a60e27bff43.png">

### ADグループの作成とメンバー追加

TAP Developer用のADグループを作成します。

```
GROUP_ID=$(az ad group create --display-name tap-demo-developer --mail-nickname tap-demo-developer --query id -o tsv)
```

自分のアカウント(ここでは`tmaki@pivotalazure.vmware.com`)をこのグループに追加します。

```
az ad group member add --group tap-demo-developer --member-id $(az ad user show --id tmaki@pivotalazure.vmware.com --query id -o tsv)
```

groupに追加されていることを確認します。

```
$ az ad group member list --group tap-demo-developer 
[
  {
    "@odata.type": "#microsoft.graph.user",
    "businessPhones": [],
    "displayName": "Toshiaki Maki",
    "givenName": "Toshiaki",
    "id": "********",
    "jobTitle": null,
    "mail": null,
    "mobilePhone": null,
    "officeLocation": null,
    "preferredLanguage": null,
    "surname": "Maki",
    "userPrincipalName": "tmaki@pivotalazure.vmware.com"
  }
]
```

`GROUP_ID`は次のコマンドでも取得できます。

```
GROUP_ID=$(az ad group list --filter "displayname eq 'tap-demo-developer'" --query '[0].id' -o tsv )
```

### Workloadのデプロイ

#### Workloadを作成するための事前準備

ここは引き続き、adminとして作業します。

```
az aks get-credentials --resource-group tap-rg --name tap-sandbox --admin --overwrite-existing
```

https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.2/tap/GUID-set-up-namespaces.html
(一部変更しています)

`demo` namespaceを作成します。

```
kubectl create ns demo
```

`demo` namespaceにおいた、先に作成したADグループに対して、[`app-editor`](https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.1/tap/GUID-authn-authz-role-descriptions.html#appeditor-0) ClusterRoleをバインドします。

```
kubectl create rolebinding app-editor -n demo --clusterrole app-editor --group ${GROUP_ID}
kubectl create clusterrolebinding app-editor-${GROUP_ID} -n demo --clusterrole app-editor-cluster-access --group ${GROUP_ID}
```

ACRにアクセスするSecretを作成します。ここではadminアカウント使用しますが、[Service Principal](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli#service-principal)の方がいいかもしれません。

```
tanzu secret registry add registry-credentials --server ${ACR_SERVER} --username ${ACR_USERNAME} --password ${ACR_PASSWORD} --namespace demo
```

Service Accountの設定を行います。

```yaml
cat <<EOF | kubectl -n demo apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: tap-registry
  annotations:
    secretgen.carvel.dev/image-pull-secret: ""
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: e30K
---
apiVersion: v1
kind: Secret
metadata:
  name: git-ssh
  annotations:
    tekton.dev/git-0: github.com
type: kubernetes.io/ssh-auth
data:
  ssh-privatekey: 8J+UkQ==
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: default
secrets:
- name: registry-credentials
- name: git-ssh
imagePullSecrets:
- name: registry-credentials
- name: tap-registry
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: default-permit-deliverable
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: deliverable
subjects:
- kind: ServiceAccount
  name: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: default-permit-workload
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: workload
subjects:
- kind: ServiceAccount
  name: default
EOF
```

#### Developerとしてログイン

ここでDeveloperとしてk8sにログインします。

```
az aks get-credentials --resource-group tap-rg --name tap-sandbox --overwrite-existing
```

K8sクラスタへ初回アクセスのタイミングでAzureへのログインを求められます。<br>
`default` namespaceに対するPodのRead権限はないので、`kubectl get pod`はForbiddenになります。

```
$ kubectl get pod
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AJ9MVQ438 to authenticate.
Error from server (Forbidden): pods is forbidden: User "tmaki@pivotalazure.vmware.com" cannot list resource "pods" in API group "" in the namespace "default"
```


`demo` namespaceはPod一覧を取得できます。
```
$ kubectl get pod -n demo
No resources found in demo namespace.
```

#### Javaアプリのデプロイ

```
tanzu apps workload apply spring-music \
  --app spring-music \
  --git-repo https://github.com/tanzu-japan/spring-music \
  --git-branch tanzu \
  --type web \
  --annotation autoscaling.knative.dev/minScale=1 \
  -n demo \
  -y
tanzu apps workload tail spring-music -n demo   
```

作成されるリソースを確認したければ次のコマンドをwatchしてください。

```
watch kubectl get workload,pod,gitrepo,imgs,build,podintent,taskrun,imagerepository,deliverable,app,ksvc -n demo -owide
```

```
$ kubectl get workload,pod,gitrepo,imgs,build,podintent,taskrun,imagerepository,deliverable,app,ksvc -n demo -owide 

NAME                              SOURCE                                        SUPPLYCHAIN     READY   REASON   AGE
workload.carto.run/spring-music   https://github.com/tanzu-japan/spring-music   source-to-url   True    Ready    7m20s

NAME                                                READY   STATUS      RESTARTS   AGE     IP            NODE                                NOMINATED NODE   READINESS GATES
pod/spring-music-00001-deployment-6c5775689-hf752   2/2     Running     0          2m8s    10.244.2.22   aks-nodepool1-87250474-vmss000002   <none>           <none>
pod/spring-music-build-1-build-pod                  0/1     Completed   0          7m12s   10.244.2.20   aks-nodepool1-87250474-vmss000002   <none>           <none>
pod/spring-music-config-writer-wfqf2-pod            0/1     Completed   0          3m45s   10.244.2.21   aks-nodepool1-87250474-vmss000002   <none>           <none>

NAME                                                  URL                                           READY   STATUS                                                             AGE
gitrepository.source.toolkit.fluxcd.io/spring-music   https://github.com/tanzu-japan/spring-music   True    Fetched revision: tanzu/297dad0750cbbb963819ba9bfaafeaf58402b06f   7m17s

NAME                          LATESTIMAGE                                                                                                                  READY
image.kpack.io/spring-music   tap28868.azurecr.io/supply-chain/spring-music-demo@sha256:9e39def446c09e1852842b8ec861c11ae8fa8c71ecb5406e8b9ed32158df6163   True

NAME                                  IMAGE                                                                                                                        SUCCEEDED
build.kpack.io/spring-music-build-1   tap28868.azurecr.io/supply-chain/spring-music-demo@sha256:9e39def446c09e1852842b8ec861c11ae8fa8c71ecb5406e8b9ed32158df6163   True

NAME                                                       READY   REASON               AGE
podintent.conventions.apps.tanzu.vmware.com/spring-music   True    ConventionsApplied   3m51s

NAME                                                  SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
taskrun.tekton.dev/spring-music-config-writer-wfqf2   True        Succeeded   3m45s       3m5s

NAME                                                                 IMAGE                                                                                            URL                                                                                                                                                                                                     READY   REASON   AGE
imagerepository.source.apps.tanzu.vmware.com/spring-music-delivery   tap28868.azurecr.io/supply-chain/spring-music-demo-bundle:f5a83ac0-a9b0-411f-85f9-e8ba622789f1   http://source-controller-manager-artifact-service.source-system.svc.cluster.local./imagerepository/demo/spring-music-delivery/28aee887f8b0e8d7d09c5f5559aeb155c8eb094db08da9c94844de43576b456d.tar.gz   True    Ready    7m14s

NAME                                 SOURCE                                                                                           DELIVERY         READY   REASON   AGE
deliverable.carto.run/spring-music   tap28868.azurecr.io/supply-chain/spring-music-demo-bundle:f5a83ac0-a9b0-411f-85f9-e8ba622789f1   delivery-basic   True    Ready    7m17s

NAME                                DESCRIPTION           SINCE-DEPLOY   AGE
app.kappctrl.k14s.io/spring-music   Reconcile succeeded   2m9s           2m9s

NAME                                       URL                                                LATESTCREATED        LATESTREADY          READY   REASON
service.serving.knative.dev/spring-music   https://spring-music-demo.20-89-141-216.sslip.io   spring-music-00001   spring-music-00001   True    
```

```
$ tanzu apps workload get -n demo spring-music
---
# spring-music: Ready
---
Source
type:     git
url:      https://github.com/scottfrederick/spring-music
branch:   tanzu

Supply Chain
name:          source-to-url
last update:   95s
ready:         True

RESOURCE          READY   TIME
source-provider   True    5m7s
deliverable       True    5m10s
image-builder     True    113s
config-provider   True    110s
app-config        True    110s
config-writer     True    95s

Issues
No issues reported.

Pods
NAME                                             STATUS      RESTARTS   AGE
spring-music-00001-deployment-6fd554c768-vwlnm   Running     0          62s
spring-music-build-1-build-pod                   Succeeded   0          5m6s
spring-music-config-writer-4g7cs-pod             Succeeded   0          107s

Knative Services
NAME           READY   URL
spring-music   Ready   https://spring-music-demo.20-194-146-185.sslip.io

To see logs: "tanzu apps workload tail spring-music --namespace demo"
```

[kubectl treeプラグイン](https://github.com/ahmetb/kubectl-tree)を使用すると次のようにリソースを階層的に見れてわかりやすいです。

```
$ kubectl tree workload -n demo spring-music
NAMESPACE  NAME                                            READY  REASON               AGE  
demo       Workload/spring-music                           True   Ready                8m9s 
demo       ├─ConfigMap/spring-music                        -                           4m37s
demo       ├─Deliverable/spring-music                      True   Ready                8m6s 
demo       │ ├─App/spring-music                            -                           2m58s
demo       │ └─ImageRepository/spring-music-delivery       True   Ready                8m3s 
demo       ├─GitRepository/spring-music                    True   GitOperationSucceed  8m6s 
demo       ├─Image/spring-music                            True                        8m2s 
demo       │ ├─Build/spring-music-build-1                  -                           8m2s 
demo       │ │ └─Pod/spring-music-build-1-build-pod        False  PodCompleted         8m1s 
demo       │ ├─PersistentVolumeClaim/spring-music-cache    -                           8m2s 
demo       │ └─SourceResolver/spring-music-source          True                        8m2s 
demo       ├─PodIntent/spring-music                        True   ConventionsApplied   4m40s
demo       │ └─PodIntent/spring-music                      True   ConventionsApplied   4m40s
demo       └─Runnable/spring-music-config-writer           True   Ready                4m37s
demo         └─TaskRun/spring-music-config-writer-wfqf2    -                           4m34s
demo           └─Pod/spring-music-config-writer-wfqf2-pod  False  PodCompleted         4m34s
```

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/178102885-9611f1fa-d763-4293-886c-a229035a2bb8.png">

"THIS IS UNSAFE"を入力

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/178102908-a0e13915-8636-4885-bd64-3c3244f05450.png">

TAP GUIでSpring Musicの情報を見ることができます。

TAP GUIのCatalogからSpring Musicを選択。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/184543702-506f257f-136e-4d85-8fae-a56baaecb9f4.png">

Podを選択。Live Viewが見られます。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/179815701-fcebe435-ffdb-415b-95ca-eab13d4b03ef.png">

Spring Boot Actuatorのエンドポイントを選択できます。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/178221958-f56263a9-e74c-46bb-bd7c-b7b11c3fd559.png">

Memoryを選んだ場合、

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/179816084-febc36d7-add8-4f5f-9708-255c0ccb36c8.png">

> ⚠️ AdBlockをインストールしている場合は、TAP GUIでは無効化してください。

TAP 1.2からはPod Logsも見れるようになりました。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/179816217-101d4e20-5e85-4e31-9023-37ea38ae6155.png">

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/179816377-4fcc96c1-2990-4143-a65b-e7e7d92abdf6.png">

ActuatorによるLog Levelの変更もここから行えます。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/179816450-21e8068e-267e-4590-aea7-55853a886bdd.png">


次に、サイドバーから"Workloads"を選択します。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/179816790-e928930c-cc62-4915-8031-2ccac27469cc.png">

Spring Musicを選択すると、Supply Chainの状態を確認することができます。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/179817093-681ac630-7323-45bf-8d89-17585caecfb9.png">

Image Buildのログが見れるようになる等、TAP 1.2で様々な改善が行われています。詳細は[リリースノート](https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.2/tap/GUID-release-notes.html#new-features-1)を確認してください。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/179817166-cab9e77c-4196-4c0c-98b7-18b76f3b1b4d.png">

確認が終わればWorkloadを削除します。

```
tanzu apps workload delete -n demo spring-music -y
```

### Azure ADでTAP GUIにログインする

TAP GUIの認証にAzure ADを使用するには、[Backstageのドキュメント](https://backstage.io/docs/auth/microsoft/provider)の手順通り、
App Registrationを作成します。次の通りです。

> 1. Log in to the [Azure Portal](https://portal.azure.com/)
> 2. Create an [Active Directory Tenant](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/Overview), if one does not yet exist
> 3. Navigate to [Azure Active Directory > App Registrations](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps)
> 4. Register an application 
>    * Name: TAP GUI
>    * Redirect URI: Web > https://tap-gui.20-194-146-185.sslip.io/api/auth/microsoft/handler/frame
> 5. Navigate to Certificates & secrets > New client secret to create a secret


clientSecretはSecret生成直後にコピーできます。

<img width="738" alt="image" src="https://user-images.githubusercontent.com/106908/178233132-706169fa-40c0-442e-b9f9-54d669cf0faa.png">

clientId、tenantIdはOverviewから確認できます。

<img width="988" alt="image" src="https://user-images.githubusercontent.com/106908/178233226-a90f8395-8e80-4ec0-9d61-3fbe46b9cc8d.png">

`tap-values.yml`にclientId、clientSecret、tenantIdを設定します。

```yaml
tap_gui:
  # ...
  app_config:
    # ...
    auth:
      environment: development
      providers:
        microsoft:
          development:
            clientId: ${AUTH_MICROSOFT_CLIENT_ID}
            clientSecret: ${AUTH_MICROSOFT_CLIENT_SECRET}
            tenantId: ${AUTH_MICROSOFT_TENANT_ID}
```

adminとして作業します。

```
az aks get-credentials --resource-group tap-rg --name tap-sandbox --admin --overwrite-existing
```

TAPを更新します。

```
tanzu package installed update tap -n tap-install -v 1.1.2 -f tap-values.yml 
```

TAP GUIが再作成されるまで次のコマンドで確認して待ってください。
```
watch kubectl get pod -n tap-gui
```

再起動後、TAP GUIにアクセスすれば、"Sign in with Azure OAuth"と表示されます。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/179818494-332d26ce-655f-4081-a73d-67b2da89d535.png">

DeveloperのアカウントでAzureにログインします。

<img width="562" alt="image" src="https://user-images.githubusercontent.com/106908/178231534-38640932-4f48-4676-ba29-af914f1b860a.png">

承諾します。

<img width="562" alt="image" src="https://user-images.githubusercontent.com/106908/178232397-203c4d0e-4650-438d-9c48-a5f8cd3de5a4.png">

ログインに成功し、サイドバーから"Settings"を確認すると、ログインユーザー名とメールアドレスが表示されることを確認できます。

<img width="1024" alt="image" src="https://user-images.githubusercontent.com/106908/178233669-2185131c-1106-4e86-bad9-add8c69f445e.png">

### [Optional] Source Test Scan to URLを試す

[次の記事](/entries/709)に書きました。

### [Optional] ADユーザーの追加

[TAP 1.1版](/entries/704#%5BOptional%5D%20ADユーザーの追加)と同じです。

### TAPのアンインストール

```
kubectl delete workload -A --all
```

```
tanzu package installed delete tap -n tap-install -y
```

### AKSクラスタの削除

```
az aks delete \
  --resource-group tap-rg \
  --name tap-sandbox
```

### ACRインスタンスの削除

```
az acr delete --resource-group tap-rg --name ${ACR_NAME}
```

### リソースグループ削除

```
az group delete --name tap-rg
```
