Skip to content

1. API Backendリソースの削除

デプロイした API Backend リソースの削除手順について解説します。

1-1. QVS Configの編集

  1. QVS Config に記述したリソース宣言をコメントアウトします。

Qmonus Value Stream では、リポジトリに登録されている QVS Config の内容を編集して AssemblyLine を再実行することで、リソースを削除できます。今回は、本チュートリアルで作成した以下の QVS Config を編集します。

  • /path/to/repository/.valuestream/azure-api-backend.yaml
  • /path/to/repository/.valuestream/azure-shared-infra.yaml

削除するリソースは、QVS Config の designPatterns フィールドに記載された Cloud Native Adapter の内容をコメントアウトすることで指定できます。 ここでは、本チュートリアルで作成したリソースを削除するため、以下のように QVS Config を編集します。

yaml
params:
  - name: appName
    type: string
  - name: azureSubscriptionId
    type: string
  - name: azureResourceGroupName
    type: string
  - name: azureDnsZoneResourceGroupName
    type: string
  - name: azureDnsZoneName
    type: string
  - name: azureDnsARecordName
    type: string
  - name: azureStaticIpAddress
    type: string
  - name: mysqlCreateDbName
    type: string
  - name: azureKeyVaultKeyContainerName
    type: string
  - name: clusterIssuerName
    type: string
  - name: k8sNamespace
    type: string
  - name: imageName
    type: string
  - name: port
    type: string
  - name: dbHost
    type: string
  - name: redisHost
    type: string
  - name: redisPasswordSecretName
    type: string
  - name: host
    type: string
modules:
  - name: qmonus.net/adapter/official
    revision: v0.26.0
designPatterns:
-  - pattern: qmonus.net/adapter/official/adapters/azure/container/kubernetes/apiBackend
-    params:
-      appName: $(params.appName)
-      imageName: $(params.imageName)
-      azureDnsZoneResourceGroupName: $(params.azureDnsZoneResourceGroupName)
-      azureKeyVaultKeyContainerName: $(params.azureKeyVaultKeyContainerName)
-      redisPasswordSecretName: $(params.redisPasswordSecretName)
-      k8sNamespace: $(params.k8sNamespace)
-      azureSubscriptionId: $(params.azureSubscriptionId)
-      host: $(params.host)
-      port: $(params.port)
-      azureDnsARecordName: $(params.azureDnsARecordName)
-      azureDnsZoneName: $(params.azureDnsZoneName)
-      dbHost: $(params.dbHost)
-      mysqlCreateDbName: $(params.mysqlCreateDbName)
-      clusterIssuerName: $(params.clusterIssuerName)
-      azureStaticIpAddress: $(params.azureStaticIpAddress)
-      azureResourceGroupName: $(params.azureResourceGroupName)
-      redisHost: $(params.redisHost)
+ #  - pattern: qmonus.net/adapter/official/adapters/azure/container/kubernetes/apiBackend
+ #    params:
+ #      appName: $(params.appName)
+ #      imageName: $(params.imageName)
+ #      azureDnsZoneResourceGroupName: $(params.azureDnsZoneResourceGroupName)
+ #      azureKeyVaultKeyContainerName: $(params.azureKeyVaultKeyContainerName)
+ #      redisPasswordSecretName: $(params.redisPasswordSecretName)
+ #      k8sNamespace: $(params.k8sNamespace)
+ #      azureSubscriptionId: $(params.azureSubscriptionId)
+ #      host: $(params.host)
+ #      port: $(params.port)
+ #      azureDnsARecordName: $(params.azureDnsARecordName)
+ #      azureDnsZoneName: $(params.azureDnsZoneName)
+ #      dbHost: $(params.dbHost)
+ #      mysqlCreateDbName: $(params.mysqlCreateDbName)
+ #      clusterIssuerName: $(params.clusterIssuerName)
+ #      azureStaticIpAddress: $(params.azureStaticIpAddress)
+ #      azureResourceGroupName: $(params.azureResourceGroupName)
+ #      redisHost: $(params.redisHost)
  - pattern: qmonus.net/adapter/official/pipeline/utils/pulumi:refer
    pipelineParams:
      jqQueries:
        - query:
            selector: '.type == "azure-native:containerregistry:Registry"'
            path: .outputs.loginServer
          name: ContainerRegistry
        - query:
            selector: '.type == "azure-native:containerregistry:Registry"'
            path: .outputs.loginServer
          name: ImageRegistryPath
        - query:
            selector: '.type == "kubernetes:cert-manager.io/v1:ClusterIssuer"'
            path: .outputs.spec.acme.solvers[0].dns01.azureDNS.subscriptionID
          name: AzureSubscriptionId
        - query:
            selector: '.type == "azure-native:resources:ResourceGroup"'
            path: .outputs.name
          name: AzureResourceGroupName
        - query:
            selector: '.type == "azure-native:network:PublicIPAddress"'
            path: .outputs.ipAddress
          name: AzureStaticIpAddress
        - query:
            selector: '.type == "azure-native:keyvault:Vault" and (.urn | (type == "string" and endswith("azure-native:keyvault:Vault::keyVault")))'
            path: .outputs.name
          name: AzureKeyVaultKeyContainerName
        - query:
            selector: '.type == "kubernetes:cert-manager.io/v1:ClusterIssuer"'
            path: .outputs.metadata.name
          name: ClusterIssuerName
        - query:
            selector: '.type == "azure:mysql/flexibleServer:FlexibleServer"'
            path: .outputs.fqdn
          name: DbHost
        - query:
            selector: '.type == "azure:redis/cache:Cache"'
            path: .outputs.hostname
          name: RedisHost
        - query:
            selector: '.type == "azure-native:keyvault:Secret" and (.urn | (type == "string" and endswith("azure-native:keyvault:Secret::redisPrimaryKeySecret")))'
            path: .outputs.name
          name: RedisPasswordSecretName
  - pattern: qmonus.net/adapter/official/pipeline/scan:trivyAzure
yaml
params:
  - name: appName
    type: string
  - name: azureSubscriptionId
    type: string
  - name: azureResourceGroupName
    type: string
  - name: azureDnsZoneResourceGroupName
    type: string
  - name: azureDnsZoneName
    type: string
  - name: azureDnsARecordName
    type: string
  - name: azureStaticIpAddress
    type: string
  - name: mysqlCreateDbName
    type: string
  - name: azureKeyVaultKeyContainerName
    type: string
  - name: clusterIssuerName
    type: string
  - name: k8sNamespace
    type: string
  - name: imageName
    type: string
  - name: port
    type: string
  - name: dbHost
    type: string
  - name: redisHost
    type: string
  - name: redisPasswordSecretName
    type: string
  - name: host
    type: string
modules:
  - name: qmonus.net/adapter/official
    revision: v0.26.0
designPatterns:
#  - pattern: qmonus.net/adapter/official/adapters/azure/container/kubernetes/apiBackend
#    params:
#      appName: $(params.appName)
#      imageName: $(params.imageName)
#      azureDnsZoneResourceGroupName: $(params.azureDnsZoneResourceGroupName)
#      azureKeyVaultKeyContainerName: $(params.azureKeyVaultKeyContainerName)
#      redisPasswordSecretName: $(params.redisPasswordSecretName)
#      k8sNamespace: $(params.k8sNamespace)
#      azureSubscriptionId: $(params.azureSubscriptionId)
#      host: $(params.host)
#      port: $(params.port)
#      azureDnsARecordName: $(params.azureDnsARecordName)
#      azureDnsZoneName: $(params.azureDnsZoneName)
#      dbHost: $(params.dbHost)
#      mysqlCreateDbName: $(params.mysqlCreateDbName)
#      clusterIssuerName: $(params.clusterIssuerName)
#      azureStaticIpAddress: $(params.azureStaticIpAddress)
#      azureResourceGroupName: $(params.azureResourceGroupName)
#      redisHost: $(params.redisHost)
  - pattern: qmonus.net/adapter/official/pipeline/utils/pulumi:refer
    pipelineParams:
      jqQueries:
        - query:
            selector: '.type == "azure-native:containerregistry:Registry"'
            path: .outputs.loginServer
          name: ContainerRegistry
        - query:
            selector: '.type == "azure-native:containerregistry:Registry"'
            path: .outputs.loginServer
          name: ImageRegistryPath
        - query:
            selector: '.type == "kubernetes:cert-manager.io/v1:ClusterIssuer"'
            path: .outputs.spec.acme.solvers[0].dns01.azureDNS.subscriptionID
          name: AzureSubscriptionId
        - query:
            selector: '.type == "azure-native:resources:ResourceGroup"'
            path: .outputs.name
          name: AzureResourceGroupName
        - query:
            selector: '.type == "azure-native:network:PublicIPAddress"'
            path: .outputs.ipAddress
          name: AzureStaticIpAddress
        - query:
            selector: '.type == "azure-native:keyvault:Vault" and (.urn | (type == "string" and endswith("azure-native:keyvault:Vault::keyVault")))'
            path: .outputs.name
          name: AzureKeyVaultKeyContainerName
        - query:
            selector: '.type == "kubernetes:cert-manager.io/v1:ClusterIssuer"'
            path: .outputs.metadata.name
          name: ClusterIssuerName
        - query:
            selector: '.type == "azure:mysql/flexibleServer:FlexibleServer"'
            path: .outputs.fqdn
          name: DbHost
        - query:
            selector: '.type == "azure:redis/cache:Cache"'
            path: .outputs.hostname
          name: RedisHost
        - query:
            selector: '.type == "azure-native:keyvault:Secret" and (.urn | (type == "string" and endswith("azure-native:keyvault:Secret::redisPrimaryKeySecret")))'
            path: .outputs.name
          name: RedisPasswordSecretName
  - pattern: qmonus.net/adapter/official/pipeline/scan:trivyAzure
yaml
params:
  - name: appName
    type: string
  - name: azureTenantId
    type: string
  - name: azureSubscriptionId
    type: string
  - name: azureResourceGroupName
    type: string
  - name: azureDnsZoneResourceGroupName
    type: string
  - name: dnsZoneName
    type: string
  - name: keyVaultAccessAllowedObjectIds
    type: array
  - name: applicationGatewayNsgAllowedSourceIps
    type: array
modules:
  - name: qmonus.net/adapter/official
    revision: v0.26.0
designPatterns:
-   - pattern: qmonus.net/adapter/official/adapters/azure/container/kubernetes/apiBackend/sharedInfrastructure
-     params:
-       keyVaultAccessAllowedObjectIds:
-         - $(params.keyVaultAccessAllowedObjectIds[*])
-       appName: $(params.appName)
-       azureDnsZoneResourceGroupName: $(params.azureDnsZoneResourceGroupName)
-       azureTenantId: $(params.azureTenantId)
-       dnsZoneName: $(params.dnsZoneName)
-       azureSubscriptionId: $(params.azureSubscriptionId)
-       azureResourceGroupName: $(params.azureResourceGroupName)
-       applicationGatewayNsgAllowedSourceIps:
-         - $(params.applicationGatewayNsgAllowedSourceIps[*])
+ #  - pattern: qmonus.net/adapter/official/adapters/azure/container/kubernetes/apiBackend/sharedInfrastructure
+ #    params:
+ #      keyVaultAccessAllowedObjectIds:
+ #        - $(params.keyVaultAccessAllowedObjectIds[*])
+ #      appName: $(params.appName)
+ #      azureDnsZoneResourceGroupName: $(params.azureDnsZoneResourceGroupName)
+ #      azureTenantId: $(params.azureTenantId)
+ #      dnsZoneName: $(params.dnsZoneName)
+ #      azureSubscriptionId: $(params.azureSubscriptionId)
+ #      azureResourceGroupName: $(params.azureResourceGroupName)
+ #      applicationGatewayNsgAllowedSourceIps:
+ #        - $(params.applicationGatewayNsgAllowedSourceIps[*])
yaml
params:
  - name: appName
    type: string
  - name: azureTenantId
    type: string
  - name: azureSubscriptionId
    type: string
  - name: azureResourceGroupName
    type: string
  - name: azureDnsZoneResourceGroupName
    type: string
  - name: dnsZoneName
    type: string
  - name: keyVaultAccessAllowedObjectIds
    type: array
  - name: applicationGatewayNsgAllowedSourceIps
    type: array
modules:
  - name: qmonus.net/adapter/official
    revision: v0.26.0
designPatterns:
#  - pattern: qmonus.net/adapter/official/adapters/azure/container/kubernetes/apiBackend/sharedInfrastructure
#    params:
#      keyVaultAccessAllowedObjectIds:
#        - $(params.keyVaultAccessAllowedObjectIds[*])
#      appName: $(params.appName)
#      azureDnsZoneResourceGroupName: $(params.azureDnsZoneResourceGroupName)
#      azureTenantId: $(params.azureTenantId)
#      dnsZoneName: $(params.dnsZoneName)
#      azureSubscriptionId: $(params.azureSubscriptionId)
#      azureResourceGroupName: $(params.azureResourceGroupName)
#      applicationGatewayNsgAllowedSourceIps:
#        - $(params.applicationGatewayNsgAllowedSourceIps[*])
  1. 変更をステージに追加します。
git add .valuestream/azure-shared-infra.yaml .valuestream/azure-api-backend.yaml
  1. リポジトリに変更をコミットします。
git commit -m "Delete api backend resources"
  1. リポジトリに変更をプッシュします。
git push
  1. Git コミットのハッシュ値を取得します。
git rev-parse HEAD

1-2. AssemblyLineの実行

本チュートリアルでは、先に azure-shared-infra の AssemblyLine を実行して基盤となるクラウドリソースをデプロイした後、azure-api-backend の AssemblyLine を実行して API Backend をデプロイしました。 このため、リソースの削除においては、先に azure-api-backend の AssemblyLine を実行して API Backend のリソースを削除した後、azure-shared-infra の AssemblyLine を実行して基盤となるクラウドリソースを削除する、という順番で実施します。

  1. 左のメニュー一覧の AssemblyLine をクリックして、AssemblyLine 一覧ページに移動します。

  2. チュートリアルで作成した azure-api-backend の AssemblyLine を選択します。

  3. 画面上部の Input Parameters に以下を入力し、RUN ボタンを押下して AssemblyLine を実行します。

    • gitRevision: 1-1で取得した Git コミットのハッシュ値
  4. AssemblyLine の実行が完了したら、ログを確認します。

    削除に成功すると、deploy Pipeline の deploy Task の step-deploy Step のログから、リソースが削除されたことを確認できます。

    Azure AssemblyLineの実行手順

    ログの以下の箇所から、削除されたリソースの総数を確認できます。

    Resources:
        - 14 deleted
        1 unchanged

    1 unchanged のリソースについては、Qmonus Value Stream の仕様上出力されているもので、デプロイされたユーザのリソースの削除には影響ありません。

  5. AssemblyLine 一覧ページに移動して、azure-shared-infra の AssemblyLine を選択します。

  6. 画面上部の Input Parameters に以下を入力し、RUN ボタンを押下して AssemblyLine を実行します。

    • gitRevision: 1-1で取得した Git コミットのハッシュ値
  7. AssemblyLine の実行が完了したら、ログを確認します。

    削除に成功すると、deploy Pipeline の deploy Task の step-deploy Step のログから、リソースが削除されたことを確認できます。

Azure AssemblyLineの実行手順

```
Resources:
    - 47 deleted
    1 unchanged
```
  1. Azure portalにログインして、本チュートリアルで作成したリソースが削除されていることを確認します。

以上で、API Backend リソースの削除は完了です。