Atualizando o Oracle NoSQL Table com o Terraform e com o OCI Resource Manager

Neste artigo, veremos as etapas para atualizar um esquema de Tabela do NDCS existente ou unidades de armazenamento (leitura ou gravação) usando o Terraform. Usaremos a CLI do OCI Resource Manager para atualizar as Tabelas NDCS. Antes de prosseguir com este artigo, presume-se que você conheça o NoSQL Cloud Service e conheça seus conceitos básicos, juntamente com o Terraform.

O primeiro passo é criar o arquivo de substituição com as alterações de configuração necessárias. Em seguida, execute os comandos da CLI do Resource Manager para executar as seguintes tarefas:

Este artigo tem os seguintes tópicos:

Pré-requisitos

Etapa 1: Criar arquivos de Substituição do Terraform para a Tabela do Banco de Dados NoSQL

Crie um novo arquivo chamado "nosql_override.tf" ou "override.tf" e forneça a parte específica do objeto de tabela do Banco de Dados NoSQL que você deseja substituir. Por exemplo, talvez você queira adicionar ou eliminar uma coluna da tabela, alterar o tipo de dados de uma coluna existente ou alterar os limites da tabela (unidades de leitura/gravação e armazenamento).

No exemplo abaixo, vamos modificar a tabela demo para eliminar uma coluna existente, chamada fullName, e modificar a tabela demoKeyVal para adicionar uma nova coluna no final, chamada shortName.

Por exemplo:

Se você tiver uma configuração nosql.tf do Terraform com o seguinte conteúdo:

variable "compartment_ocid" {
}
resource "oci_nosql_table" "nosql_demo" {
    compartment_id = var.compartment_ocid
    ddl_statement = "CREATE TABLE if not exists demo (ticketNo INTEGER, fullName STRING, contactPhone STRING, confNo STRING, gender STRING, bagInfo JSON, PRIMARY KEY (ticketNo))"
    name = "demo"
    table_limits {
        max_read_units = var.table_table_limits_max_read_units
        max_storage_in_gbs = var.table_table_limits_max_storage_in_gbs
        max_write_units = var.table_table_limits_max_write_units
    }
}
resource "oci_nosql_table" "nosql_demoKeyVal" {
    compartment_id = var.compartment_ocid
    ddl_statement = "CREATE TABLE if not exists demoKeyVal (key INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1 NO CYCLE), value JSON, PRIMARY KEY (key))"
    name = "demoKeyVal"
    table_limits {
       max_read_units = var.table_table_limits_max_read_units
        max_storage_in_gbs = var.table_table_limits_max_storage_in_gbs
        max_write_units = var.table_table_limits_max_write_units
    }
}

Agora você deseja modificar a tabela demo e eliminar uma coluna existente, chamada fullName, e modificar a tabela demoKeyVal para adicionar uma nova coluna no final, chamada shortName. Em seguida, crie um arquivo nosql_override.tf ou override.tf contendo o seguinte conteúdo:

variable "compartment_ocid" {
}
resource "oci_nosql_table" "nosql_demo" {
    compartment_id = var.compartment_ocid
    ddl_statement = "CREATE TABLE if not exists demo (ticketNo INTEGER, contactPhone STRING,
    confNo STRING, gender STRING, bagInfo JSON, PRIMARY KEY (ticketNo))"
    name = "demo"
}
resource "oci_nosql_table" "nosql_demoKeyVal" {
    compartment_id = var.compartment_ocid
    ddl_statement = "CREATE TABLE if not exists demoKeyVal (key INTEGER GENERATED ALWAYS AS IDENTITY
    (START WITH 1 INCREMENT BY 1 NO CYCLE), value JSON, shortName STRING, PRIMARY KEY (key))"
    name = "demoKeyVal"
}

Observação: ao adicionar colunas a uma tabela existente, você só pode anexar colunas no final da tabela. Não é possível inserir uma nova coluna antes de qualquer coluna existente ou alterar a ordem das colunas existentes. Por exemplo, você não pode adicionar a coluna shortName antes da coluna value ou trocar as colunas key e value na tabela demoKeyVal. Isso resultaria em um erro.

Quando o Terraform processa esse arquivo (nosql_override.tf), ele analisa internamente a instrução DDL (instrução CREATE TABLE) e a compara com a definição de tabela existente e gera uma instrução ALTER TABLE equivalente e a aplica.

Etapa 2: Atualizar o Plano de Execução

Observação: Essas instruções não se aplicam a configurações armazenadas em sistemas e controles de código-fonte. Se você estiver usando sistemas de controle de código-fonte, como GitHub e Gitlab, para manter arquivos de configuração do terraform, poderá ignorar esta etapa e passar diretamente para a Etapa 3. A versão mais recente da sua configuração é usada automaticamente por qualquer job em execução na pilha associada.

Para este tutorial, vamos atualizar o plano de execução com o arquivo zip de configuração do terraform atualizado, terraform.zip. O arquivo terraform.zip atualizado contém os seguintes arquivos:

Por exemplo:

oci resource-manager stack update
--stack-id ocid1.ormstack.oc1.phx.aaaaaaaa7jrci2s5iav5tdxpl6ucwo2dwazzrdkfhs6bxiohgcpkscmr57bq
--config-source terraform.zip

Exemplo de resposta:

{
  "data": {
    "compartment-id": "ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya",
    "config-source": {
      "config-source-type": "ZIP_UPLOAD",
      "working-directory": null
    },
    "defined-tags": {},
    "description": null,
    "display-name": "ormstack20220117104810",
    "freeform-tags": {},
    "id": "ocid1.ormstack.oc1.phx.aaaaaaaa7jrci2s5iav5tdxpl6ucwo2dwazzrdkfhs6bxiohgcpkscmr57bq",
    "lifecycle-state": "ACTIVE",
    "stack-drift-status": "NOT_CHECKED",
    "terraform-version": "1.0.x",
    "time-created": "2022-01-17T10:48:10.878000+00:00",
    "time-drift-last-checked": null,
    "variables": {}
  },
  "etag": "068e7b962aa43c7b3e7bf5c24b2d7f937db0901a784a9dce8715d76d78ad30f3"
}

Atualizamos uma pilha existente com o novo arquivo zip atualizado contendo arquivos de configuração terraform de substituição.

Etapa 3: Gerar um Plano de Execução

Para gerar um plano e execução, execute o seguinte comando:

oci resource-manager job create-plan-job
--stack-id <stack_OCID>
--display-name "<friendly_name>"

Por exemplo:

oci resource-manager job create-plan-job
--stack-id ocid1.ormstack.oc1.phx.aaaaaaaa7jrci2s5iav5tdxpl6ucwo2dwazzrdkfhs6bxiohgcpkscmr57bq

Exemplo de resposta:

{
  "data": {
    "apply-job-plan-resolution": null,
    "cancellation-details": {
      "is-forced": false
    },
    "compartment-id": "ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya",
    "config-source": {
      "config-source-record-type": "ZIP_UPLOAD"
    },
    "defined-tags": {},
    "display-name": "ormjob20220124122310",
    "failure-details": null,
    "freeform-tags": {},
    "id": "ocid1.ormjob.oc1.phx.aaaaaaaagke5ajwwchvxkql2c56qoohhvc2dxu5fnqswnpw4hsombrfijnia",
    "job-operation-details": {
      "operation": "PLAN",
      "terraform-advanced-options": {
        "detailed-log-level": null,
        "is-refresh-required": true,
        "parallelism": 10
      }
    },
    "lifecycle-state": "ACCEPTED",
    "operation": "PLAN",
    "resolved-plan-job-id": null,
    "stack-id": "ocid1.ormstack.oc1.phx.aaaaaaaa7jrci2s5iav5tdxpl6ucwo2dwazzrdkfhs6bxiohgcpkscmr57bq",
    "time-created": "2022-01-24T12:23:10.366000+00:00",
    "time-finished": null,
    "variables": {},
    "working-directory": null
  },
  "etag": "b77d497287af3dd2d166871457d880ffee9952ee2c9a44e8f9dfa3e02b974c95"
}

Geramos um plano de execução a partir de uma pilha. O Resource Manager cria um job com um id exclusivo correspondente a este plano de execução. Esse id de job de planejamento pode ser usado posteriormente para revisar os detalhes do plano de execução antes de executar a operação de aplicação para implantar os recursos do banco de dados NoSQL na nuvem do OCI.

"id": "ocid1.ormjob.oc1.phx.aaaaaaaagke5ajwwchvxkql2c56qoohhvc2dxu5fnqswnpw4hsombrfijnia",
"job-operation-details": {
      "operation": "PLAN"
      ...
}

Subetapa 3.1: Revisar o Plano de Execução

Para revisar um plano e execução, execute o seguinte comando:

oci resource-manager job get-job-logs
--job-id <plan_job_OCID>

Por exemplo:

oci resource-manager job get-job-logs
--job-id ocid1.ormjob.oc1.phx.aaaaaaaagke5ajwwchvxkql2c56qoohhvc2dxu5fnqswnpw4hsombrfijnia

Exemplo de resposta:

...
    {
      "level": "INFO",
      "message": "  # data.oci_nosql_table.nosql_demo will be read during apply",
      "timestamp": "2022-01-24T12:23:36.445000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": " <= data "oci_nosql_table" "nosql_demo"  {",
      "timestamp": "2022-01-24T12:23:36.445000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      ~ ddl_statement       = "CREATE TABLE IF NOT EXISTS demo(ticketNo INTEGER, contactPhone STRING, confNo STRING, gender STRING, bagInfo JSON, PRIMARY KEY(SHARD(ticketNo)))" -> (known after apply)",
      "timestamp": "2022-01-24T12:23:36.445000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      ~ id                  = "ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyasvdkoclhgryulgzox3nvlxb2bqtlxxsrvrc4zxr6lo4a" -> (known after apply)",
      "timestamp": "2022-01-24T12:23:36.445000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      ~ is_auto_reclaimable = true -> (known after apply)",
      "timestamp": "2022-01-24T12:23:36.445000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "          - "orcl-cloud.free-tier-retained" = "true"",
      "timestamp": "2022-01-24T12:23:36.446000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  # data.oci_nosql_table.nosql_demoKeyVal will be read during apply",
      "timestamp": "2022-01-24T12:23:36.446000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": " <= data "oci_nosql_table" "nosql_demoKeyVal"  {",
      "timestamp": "2022-01-24T12:23:36.446000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      ~ ddl_statement       = "CREATE TABLE IF NOT EXISTS demoKeyVal(key INTEGER, value JSON, shortName STRING, PRIMARY KEY(SHARD(key)))" -> (known after apply)",
      "timestamp": "2022-01-24T12:23:36.446000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      ~ id                  = "ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyaqgpbjucp3s6jjzpnar4lg5yudxhwlqrlbd54l3wdo7hq" -> (known after apply)",
      "timestamp": "2022-01-24T12:23:36.447000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      ~ is_auto_reclaimable = true -> (known after apply)",
      "timestamp": "2022-01-24T12:23:36.447000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  # oci_nosql_table.nosql_demo will be updated in-place",
      "timestamp": "2022-01-24T12:23:36.447000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  ~ resource "oci_nosql_table" "nosql_demo" {",
      "timestamp": "2022-01-24T12:23:36.447000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      ~ ddl_statement       = "CREATE TABLE IF NOT EXISTS demo(ticketNo INTEGER, contactPhone STRING, confNo STRING, gender STRING, bagInfo JSON, fullName STRING, PRIMARY KEY(SHARD(ticketNo)))" -> "ALTER TABLE demo (DROP fullName)"",
      "timestamp": "2022-01-24T12:23:36.447000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  # oci_nosql_table.nosql_demoKeyVal will be updated in-place",
      "timestamp": "2022-01-24T12:23:36.447000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  ~ resource "oci_nosql_table" "nosql_demoKeyVal" {",
      "timestamp": "2022-01-24T12:23:36.447000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      ~ ddl_statement       = "CREATE TABLE IF NOT EXISTS demoKeyVal(key INTEGER, value JSON, PRIMARY KEY(SHARD(key)))" -> "ALTER TABLE demoKeyVal (ADD shortName STRING)"",
      "timestamp": "2022-01-24T12:23:36.448000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  ~ nosql_kv_table_ddl_statement = "CREATE TABLE IF NOT EXISTS demoKeyVal(key INTEGER, value JSON, shortName STRING, PRIMARY KEY(SHARD(key)))" -> (known after apply)",
      "timestamp": "2022-01-24T12:23:36.448000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  ~ nosql_table_ddl_statement    = "CREATE TABLE IF NOT EXISTS demo(ticketNo INTEGER, contactPhone STRING, confNo STRING, gender STRING, bagInfo JSON, PRIMARY KEY(SHARD(ticketNo)))" -> (known after apply)",
      "timestamp": "2022-01-24T12:23:36.448000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
...

Essa etapa é muito importante, pois valida se o código de pilha atualizado contém erros de sintaxe e exatamente quantos recursos do OCI estão sendo adicionados, atualizados ou destruídos. No tutorial, estamos atualizando o esquema de duas tabelas do NoSQL: demo e demoKeyVal adicionando e eliminando colunas.

{
 ...
      "message": "Plan: 0 to add, 2 to change, 0 to destroy.",
 ...
}

Etapa 4: Executar um Job de Aplicação

Por exemplo:

oci resource-manager job create-apply-job
--stack-id ocid1.ormstack.oc1.phx.aaaaaaaa7jrci2s5iav5tdxpl6ucwo2dwazzrdkfhs6bxiohgcpkscmr57bq
--execution-plan-strategy AUTO_APPROVED
--display-name "Update NoSQL Tables Using Terraform"

Exemplo de resposta:

{
  "data": {
    "apply-job-plan-resolution": {
      "is-auto-approved": true,
      "is-use-latest-job-id": null,
      "plan-job-id": null
    },
    "cancellation-details": {
      "is-forced": false
    },
    "compartment-id": "ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya",
    "config-source": {
      "config-source-record-type": "ZIP_UPLOAD"
    },
    "defined-tags": {},
    "display-name": "Update NoSQL Tables Using Terraform",
    "failure-details": null,
    "freeform-tags": {},
    "id": "ocid1.ormjob.oc1.phx.aaaaaaaacmnanu2qd34x7l5uicgpdfpjbsgh5swddmtslb3qmbzg3dmuc3bq",
    "job-operation-details": {
      "execution-plan-job-id": null,
      "execution-plan-strategy": "AUTO_APPROVED",
      "operation": "APPLY",
      "terraform-advanced-options": {
        "detailed-log-level": null,
        "is-refresh-required": true,
        "parallelism": 10
      }
    },
    "lifecycle-state": "ACCEPTED",
    "operation": "APPLY",
    "resolved-plan-job-id": null,
    "stack-id": "ocid1.ormstack.oc1.phx.aaaaaaaa7jrci2s5iav5tdxpl6ucwo2dwazzrdkfhs6bxiohgcpkscmr57bq",
    "time-created": "2022-01-24T12:36:52.911000+00:00",
    "time-finished": null,
    "variables": {},
    "working-directory": null
  },
  "etag": "b2af026af48897c7839c347e06a8c40ec3ce1cac08a3da2f0c6ee74fb07078ab"
}

Subetapa 4.1: Verificar o Status do Job

Para verificar o status de um job, execute o seguinte comando:

oci resource-manager job get
--job-id <job_OCID>

Por exemplo:

oci resource-manager job get
--job-id ocid1.ormjob.oc1.phx.aaaaaaaacmnanu2qd34x7l5uicgpdfpjbsgh5swddmtslb3qmbzg3dmuc3bq

Exemplo de resposta:

{
  "data": {
    "apply-job-plan-resolution": {
      "is-auto-approved": true,
      "is-use-latest-job-id": null,
      "plan-job-id": null
    },
    "cancellation-details": {
      "is-forced": false
    },
    "compartment-id": "ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya",
    "config-source": {
      "config-source-record-type": "ZIP_UPLOAD"
    },
    "defined-tags": {},
    "display-name": "ALTER NoSQL Table Schema",
    "failure-details": null,
    "freeform-tags": {},
    "id": "ocid1.ormjob.oc1.phx.aaaaaaaacmnanu2qd34x7l5uicgpdfpjbsgh5swddmtslb3qmbzg3dmuc3bq",
    "job-operation-details": {
      "execution-plan-job-id": null,
      "execution-plan-strategy": "AUTO_APPROVED",
      "operation": "APPLY",
      "terraform-advanced-options": {
        "detailed-log-level": null,
        "is-refresh-required": true,
        "parallelism": 10
      }
    },
    "lifecycle-state": "SUCCEEDED",
    "operation": "APPLY",
    "resolved-plan-job-id": null,
    "stack-id": "ocid1.ormstack.oc1.phx.aaaaaaaa7jrci2s5iav5tdxpl6ucwo2dwazzrdkfhs6bxiohgcpkscmr57bq",
    "time-created": "2022-01-20T11:14:13.916000+00:00",
    "time-finished": "2022-01-20T11:14:51.921000+00:00",
    "variables": {},
    "working-directory": null
  },
  "etag": "13b1253bd5e6ca78778b4cf6aad38d262b1476aae06e6f36b40b5f914016b899--gzip"
}

Você pode verificar o status do seu job de candidatura para verificar se o job é SUCCESSFUL ou FAILED.

{
...
      "lifecycle-state": "SUCCEEDED",
...
}

Subetapa 4.2: Verificar o Log de um Job

Para exibir o log de um job, execute o seguinte comando:

oci resource-manager job get-job-logs-content
--job-id <job_OCID>

Por exemplo:

oci resource-manager job get-job-logs-content
--job-id ocid1.ormjob.oc1.phx.aaaaaaaacmnanu2qd34x7l5uicgpdfpjbsgh5swddmtslb3qmbzg3dmuc3bq

Exemplo de resposta:

...
    {
      "level": "INFO",
      "message": "oci_nosql_table.nosql_demoKeyVal: Refreshing state... [id=ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyaqgpbjucp3s6jjzpnar4lg5yudxhwlqrlbd54l3wdo7hq]",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "oci_nosql_table.nosql_demo: Refreshing state... [id=ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyasvdkoclhgryulgzox3nvlxb2bqtlxxsrvrc4zxr6lo4a]",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "plan. Resource actions are indicated with the following symbols:",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  ~ update in-place",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "Terraform will perform the following actions:",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  # data.oci_nosql_table.nosql_demo will be read during apply",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": " <= data "oci_nosql_table" "nosql_demo"  {",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + compartment_id      = "ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya"",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + table_name_or_id    = "ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyasvdkoclhgryulgzox3nvlxb2bqtlxxsrvrc4zxr6lo4a"",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": " <= data "oci_nosql_table" "nosql_demoKeyVal"  {",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + compartment_id      = "ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya"",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + table_name_or_id    = "ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyaqgpbjucp3s6jjzpnar4lg5yudxhwlqrlbd54l3wdo7hq"",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  # oci_nosql_table.nosql_demo will be updated in-place",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  ~ resource "oci_nosql_table" "nosql_demo" {",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      ~ ddl_statement       = "CREATE TABLE IF NOT EXISTS demo(ticketNo INTEGER, contactPhone STRING, confNo STRING, gender STRING, bagInfo JSON, fullName STRING, PRIMARY KEY(SHARD(ticketNo)))" -> "ALTER TABLE demo (DROP fullName)"",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "        id                  = "ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyasvdkoclhgryulgzox3nvlxb2bqtlxxsrvrc4zxr6lo4a"",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "        name                = "demo"",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  # oci_nosql_table.nosql_demoKeyVal will be updated in-place",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  ~ resource "oci_nosql_table" "nosql_demoKeyVal" {",
      "timestamp": "2022-01-20T11:14:26.632000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      ~ ddl_statement       = "CREATE TABLE if not exists demoKeyVal (key INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1 NO CYCLE), value JSON, PRIMARY KEY (key))" -> "ALTER TABLE demoKeyVal (ADD shortName STRING)"",
      "timestamp": "2022-01-20T11:14:26.633000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "        id                  = "ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyaqgpbjucp3s6jjzpnar4lg5yudxhwlqrlbd54l3wdo7hq"",
      "timestamp": "2022-01-20T11:14:26.633000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "        name                = "demoKeyVal"",
      "timestamp": "2022-01-20T11:14:26.633000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "Plan: 0 to add, 2 to change, 0 to destroy.",
      "timestamp": "2022-01-20T11:14:26.633000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "oci_nosql_table.nosql_demoKeyVal: Modifying... [id=ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyaqgpbjucp3s6jjzpnar4lg5yudxhwlqrlbd54l3wdo7hq]",
      "timestamp": "2022-01-20T11:14:27.633000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "oci_nosql_table.nosql_demo: Modifying... [id=ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyasvdkoclhgryulgzox3nvlxb2bqtlxxsrvrc4zxr6lo4a]",
      "timestamp": "2022-01-20T11:14:27.633000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "oci_nosql_table.nosql_demo: Modifications complete after 9s [id=ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyasvdkoclhgryulgzox3nvlxb2bqtlxxsrvrc4zxr6lo4a]",
      "timestamp": "2022-01-20T11:14:35.634000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "data.oci_nosql_table.nosql_demo: Reading...",
      "timestamp": "2022-01-20T11:14:35.634000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "data.oci_nosql_table.nosql_demo: Read complete after 0s [id=ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyasvdkoclhgryulgzox3nvlxb2bqtlxxsrvrc4zxr6lo4a]",
      "timestamp": "2022-01-20T11:14:35.634000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "data.oci_nosql_table.nosql_demoKeyVal: Reading...",
      "timestamp": "2022-01-20T11:14:44.636000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "data.oci_nosql_table.nosql_demoKeyVal: Read complete after 0s [id=ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyaqgpbjucp3s6jjzpnar4lg5yudxhwlqrlbd54l3wdo7hq]",
      "timestamp": "2022-01-20T11:14:44.636000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "Apply complete! Resources: 0 added, 2 changed, 0 destroyed.",
      "timestamp": "2022-01-20T11:14:44.636000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "nosql_kv_table_ddl_statement = "CREATE TABLE IF NOT EXISTS demoKeyVal(key INTEGER, value JSON, shortName STRING, PRIMARY KEY(SHARD(key)))"",
      "timestamp": "2022-01-20T11:14:44.636000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "nosql_table_ddl_statement = "CREATE TABLE IF NOT EXISTS demo(ticketNo INTEGER, contactPhone STRING, confNo STRING, gender STRING, bagInfo JSON, PRIMARY KEY(SHARD(ticketNo)))"",
      "timestamp": "2022-01-20T11:14:44.636000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
...

Essa etapa é muito importante, pois confirma exatamente quantos recursos do OCI foram adicionados, atualizados ou destruídos. No tutorial, atualizamos com sucesso o esquema das duas tabelas do NoSQL: demo e demoKeyVal.

{
 ...
      "message": "Apply complete! Resources: 0 added, 2 changed, 0 destroyed.",
 ...
}

Nós cobrimos muitos detalhes neste tutorial. Criamos arquivos de configuração terraform de substituição necessários para atualizar o esquema das tabelas do banco de dados NoSQL na nuvem do OCI e, em seguida, usamos a CLI do OCI Resource Manager para atualizar a pilha existente, gerar um plano de execução e executar o job de aplicação no plano de execução.