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[*])
  2. 変更をステージに追加します。

    git add .valuestream/azure-shared-infra.yaml .valuestream/azure-api-backend.yaml
  3. リポジトリに変更をコミットします。

    git commit -m "Delete api backend resources"
  4. リポジトリに変更をプッシュします。

    git push
  5. 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
  8. Azure portalにログインして、本チュートリアルで作成したリソースが削除されていることを確認します。

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