Implantação da Tabela NoSQL da Oracle Usando o Terraform e o OCI Resource Manager

É fácil implantar tabelas NDCS no OCI (Oracle Cloud Infrastructure) usando o Terraform e a Pilha do Resource Manager. Usaremos a CLI do OCI Resource Manager para implantar Tabelas NDCS no Oracle Cloud. Antes de prosseguirmos com este artigo, presume-se que você esteja ciente do NoSQL Cloud Service e saiba seus conceitos básicos, juntamente com o Terraform.

O Terraform usa provedores para estabelecer interface entre o mecanismo do Terraform e a plataforma de nuvem suportada. O provedor Terraform do OCI (Oracle Cloud Infrastructure) é um componente que conecta o Terraform aos serviços do OCI que você deseja gerenciar. Você pode usar o provedor Terraform do OCI, incluindo Terraform Cloud e o Resource Manager do OCI.

O OCI Resource Manager é um serviço gerenciado pela Oracle com base no Terraform que usa arquivos de configuração do Terraform para automatizar a implantação e as operações dos recursos do OCI suportados pelo provedor Terraform do OCI. O Gerenciador de Recursos permite que você compartilhar e gerenciar configurações de infraestrutura e arquivos de estado em várias equipes e plataformas.


Implantando Tabelas de Banco de Dados NoSQL com o Terraform

  • Para criar recursos no OCI, precisamos configurar o terraform. Crie os arquivos de configuração terraform básicos para definição do provedor terraform, definições de recursos NoSQL, autenticação e variáveis de entrada.
  • Decida onde armazenar os arquivos de configuração terraform. Você pode armazenar esses arquivos em diferentes origens, como pasta local ou zip, bucket do Object Storage e sistemas de controle de origem, como GitHub ou GitLab.
  • Execute os comandos da CLI do Resource Manager para executar as seguintes tarefas:
    • Criar uma pilha.
    • Gere e revise o plano de execução.
    • Execute o job Aplicar para provisionar recursos NoSQL.
    • Verifique os arquivos de log, conforme necessário.

Observação:

Vamos trabalhar com a CLI (Interface de Linha de Comando) do Oracle Cloud Infrastructure (OCI) Resource Manager e executar esses comandos no Cloud Shell usando a Console. Isso significa que você precisará de algumas informações sobre sua locação na nuvem e outros itens, como pares de chaves públicas ou privadas, úteis. Se você quiser configurar a CLI do OCI em sua máquina local, consulte esta documentação.

Este artigo tem os seguintes tópicos:

Pré-requisitos

  • Compreensão básica do Terraform. Leia a breve introdução aqui.
  • Uma conta do Oracle Cloud e uma assinatura do Oracle NoSQL Database Cloud Service. Se você ainda não tem uma conta do Oracle Cloud, pode começar aqui.
  • Provedor Terraform do OCI instalado e configurado.

Etapa 1: Criar arquivos de configuração do Terraform para Tabela ou Índice NDCS


Criando a configuração do provedor Terraform do OCI

Subetapa 1.1: Criar configuração do provedor Terraform do OCI

Crie um novo arquivo chamado "provider.tf" que contenha a definição do provedor Terraform do OCI e também as definições de variáveis associadas. O provedor Terraform do OCI requer SOMENTE o argumento region.

No entanto, talvez você precise configurar argumentos adicionais com credenciais de autenticação para uma conta do OCI com base no método de autenticação. O provedor Terraform do OCI suporta três métodos de autenticação:
  • Autenticação de Chave de API
  • Autorização do Controlador de Instâncias
  • Autenticação de Token de Segurança
O argumento region especifica a região geográfica na qual os recursos do provedor são criados. Para atingir várias regiões em uma única configuração, você simplesmente cria uma definição de provedor para cada região e as diferencia usando um alias de provedor, conforme mostrado no exemplo a seguir. Observe que somente um provedor, chamado "oci", é definido, e também a definição do provedor oci é informada duas vezes, uma para a região us-phoenix-1 (com o alias "phx"), e outra para a região us-ashburn-1 (com o alias "iad").
provider "oci" {
region = "us-phoenix-1"
   alias = "phx"
}
provider "oci" {
region = "us-ashburn-1"
alias = "iad"
}
No exemplo abaixo, é necessário um argumento region para o provedor Terraform do OCI. Os argumentos tenancy_ocid, user_ocid, private_key_path e fingerprint são necessários para autenticação de Chave de API. Você pode fornecer o valor para region e chaves de Autenticação de Chave de API (tenancy_ocid, user_ocid, private_key_path e fingerprint) como Variáveis de Ambiente ou nas variáveis de configuração do Terraform (conforme mencionado na Subetapa 1.3: Carregando Variáveis de Configuração do Terraform).
variable "tenancy_ocid" {
}
variable "user_ocid" {
}
variable "fingerprint" {
}
variable "private_key_path" {
}
variable "region" {
}

provider "oci" {
   region = var.region
   tenancy_ocid = var.tenancy_ocid
   user_ocid = var.user_ocid
   fingerprint = var.fingerprint
   private_key_path = var.private_key_path
}
A autorização do controlador de instâncias permite que seu provedor faça chamadas de API em uma instância de computação do OCI sem precisar dos atributos tenancy_ocid, user_ocid, private_key_path e fingerprint na definição do provedor.

Observação:

A autorização do controlador de instâncias se aplica apenas às instâncias que estão sendo executadas no Oracle Cloud Infrastructure.
No exemplo abaixo, um argumento region é necessário para o provedor Terraform do OCI e um argumento auth é necessário para a Autorização do Controlador de Instâncias. Você pode fornecer o valor do argumento region como Variáveis de Ambiente ou nas variáveis de configuração do Terraform (conforme mencionado na Subetapa 1.3: Carregando Variáveis de Configuração do Terraform).
variable "region" {
}
provider "oci" {
   auth = "InstancePrincipal"
   region = var.region
}
A autenticação de Token de Segurança permite executar o Terraform usando um token gerado com Autenticação baseada em Token para a CLI.

Observação:

Este token expira após uma hora. Evite usar esse método de autenticação quando o provisionamento de recursos demorar mais de uma hora. Consulte Atualizando um Token para obter mais informações.
No exemplo abaixo, region é necessário um argumento para o provedor Terraform do OCI. Os argumentos auth e config_file_profile são necessários para a autenticação do Token de Segurança.
variable "region" {
}
variable "config_file_profile" {
}
provider "oci" {
auth = "SecurityToken"
  config_file_profile = var.config_file_profile
   region = var.region
}

Subetapa 1.2: Criar configuração do Terraform NoSQL

Crie um novo arquivo chamado "nosql.tf" que contenha os recursos de configuração terraform NoSQL para criar tabelas ou índices do NoSQL Database Cloud Service. Para obter mais informações sobre os recursos de Banco de Dados NoSQL e origens de dados, consulte oci_nosql_table.

No exemplo abaixo, estamos criando 2 tabelas NoSQL. O argumento compartment_ocid é necessário para recursos do Banco de Dados NoSQL, como tabelas e índices. Você pode fornecer o valor para compartment_ocid como Variáveis de Ambiente ou nas variáveis de configuração do Terraform (conforme mencionado na Subetapa 1.3: Carregando Variáveis de Configuração do Terraform).
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
    }
}

Subetapa 1.3: Carregando Variáveis de Configuração do Terraform

A próxima etapa é criar um arquivo chamado "terraform.tfvars" e fornecer valores para os argumentos necessários do provedor Terraform do OCI com base no método de autenticação.

Forneça valores para seus argumentos de acesso e chaves secretas do IAM (tenancy_ocid, user_ocid, private_key_path e fingerprint), region e compartment_ocid. Você já deve ter um usuário do OCI IAM com chaves de segredo e acesso com permissões suficientes no NoSQL Database Cloud Service. Obtenha essas chaves e armazene-as no arquivo.

Por exemplo:
tenancy_ocid = "ocid1.tenancy.oc1..aaaaaaaaqljdu37xcfoqvyj47pf5dqutpxu4twoqc7hukwgpbavpdwkqxc6q"
user_ocid = "ocid1.user.oc1..aaaaaaaafxz473ypsc6oqiespihan6yi6obse3o4e4t5zmpm6rdln6fnkurq"
fingerprint = "2c:9b:ed:12:81:8d:e6:18:fe:1f:0d:c7:66:cc:03:3c"
private_key_path = "~/NoSQLLabPrivateKey.pem"
compartment_ocid = "ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya"
region = "us-phoenix-1"

Forneça valores para os argumentos region e compartment_ocid.

Por exemplo:
region = "us-phoenix-1"
compartment_ocid = "ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya"

Forneça valores para os argumentos region, compartment_ocid e config_file_profile.

Por exemplo:
region = "us-phoenix-1"
compartment_ocid = "ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya"
config_file_profile = "PROFILE"

Subetapa 1.4: Declarando Variáveis de Entrada

A última etapa é criar "variables.tf" e designar valores a variáveis de entrada nele. Clique aqui para consultar a documentação do Terraform para verificar os argumentos ou propriedades válidas disponíveis para o Banco de Dados NoSQL. No exemplo, o valor padrão das unidades de leitura, gravação e armazenamento da tabela NoSQL é definido como 10, 10 e 1, respectivamente.
variable "table_table_limits_max_read_units" {
default = 10
}
variable "table_table_limits_max_write_units" {
default = 10
}
variable "table_table_limits_max_storage_in_gbs" {
default = 1
}

Usando o Cloud Shell da Console, criamos todos os arquivos de configuração terraform necessários para definição do provedor, recursos de banco de dados NoSQL, valores de autenticação e variáveis de entrada.

Criando Arquivos de Configuração do Terraform no Cloud Shell

Etapa 2: Onde Armazenar Suas Configurações do Terraform


Onde armazenar seus arquivos de configuração terraform

Ao criar uma pilha com o Resource Manager, você pode selecionar sua configuração do Terraform nas origens a seguir.

Subetapa 2.1: Criar Provedores de Origem de Configuração para Configurações Remotas do Terraform

Você precisa criar um provedor de configuração de origem caso queira usar as configurações remotas do terraform hospedadas em um sistema de controle de origem, como GitHub e GitLab.

Para obter mais informações sobre como criar provedores de origem de configuração para configurações remotas do Terraform, consulte Gerenciando Provedores de Origem de Configuração.

Etapa 3: Criar uma Pilha com Base em um Arquivo


Criando uma Pilha com Base em um Arquivo

Use o comando relacionado à localização do arquivo. Para origens de configuração do Terraform suportadas com o Resource Manager, consulte Onde Armazenar Suas Configurações do Terraform.

Para este tutorial, vamos criar uma pilha usando o método de autenticação Controlador de Instâncias de um arquivo zip de configuração local do terraform, terraform.zip. O arquivo terraform.zip contém os seguintes arquivos:
  • provider.tf
  • nosql.tf
  • terraform.tfvars
  • variables.tf

Observação:

Neste tutorial, estamos usando comandos da CLI do OCI Resource Manager para criar uma pilha. Você pode executar a mesma tarefa usando a Console do OCI Resource Manager.
Para criar uma pilha com base em um arquivo hospedado em um sistema de controle de código-fonte, como GitHub e GitLab.
oci resource-manager stack create-from-git-provider 
--compartment-id ocid1.tenancy.oc1..uniqueid 
--config-source-configuration-source-provider-id ocid.ormconfigsourceprovider.oc1..uniqueid 
--config-source-repository-url https://github.com/user/repo.git
--config-source-branch-name mybranch 
--display-name "My Stack from Git" 
--description "Create NoSQL Table" 
--variables file://variables.json
--working-directory ""
Para criar uma pilha com base em uma configuração do Terraform em um bucket do Object Storage.
oci resource-manager stack create-from-object-storage 
--compartment-id ocid1.tenancy.oc1..uniqueid 
--config-source-namespace MyNamespace
--config-source-bucket-name MyBucket
--config-source-region PHX
--display-name "My Stack from Object Storage" 
--description "Create NoSQL Table" 
--variables file://variables.json
Para criar uma pilha com base em um arquivo de configuração carregado (.zip)
oci resource-manager stack create 
--compartment-id ocid1.tenancy.oc1..uniqueid 
--config-source vcn.zip 
--variables file://variables.json
--display-name "My Example Stack" 
--description "Create NoSQL Table" 
--working-directory ""
Onde,
  • --compartment-id é o OCID do compartimento no qual você deseja criar a pilha.
  • --config-source é o nome de um arquivo .zip que contém um ou mais arquivos de configuração do Terraform.
  • (Opcional) --variables é o caminho para o arquivo que especifica variáveis de entrada de dados para seus recursos.

    O provedor Terraform do Oracle Cloud Infrastructure requer parâmetros adicionais ao executar o Terraform localmente (exceto se você estiver usando principais da instância). Para obter mais informações sobre como usar variáveis no Terraform, consulte Variáveis de Entrada de Dados. Consulte também Configuração da variável de entrada de dados.

  • (Opcional) --display-name é o nome amigável da nova pilha.
  • (Opcional) --description é a descrição da nova pilha.
  • (Opcional) --working-directory é o arquivo de configuração raiz no diretório. Se não for especificado, ou se for nulo como nesse exemplo, o serviço assumirá que o arquivo de nível superior no diretório é o arquivo de configuração raiz.
Por exemplo:
oci resource-manager stack create 
--compartment-id ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya 
--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": "dd62ace0b9e9d825d825c05d4588b73fede061e55b75de6436b84fb2bb794185"
}
Criamos uma pilha a partir dos arquivos de configuração terraform e geramos um id de pilha. Na próxima etapa, esse id de pilha é usado para gerar um plano de execução para a implantação de tabelas NoSQL.
"id": "ocid1.ormstack.oc1.phx.aaaaaaaa7jrci2s5iav5tdxpl6ucwo2dwazzrdkfhs6bxiohgcpkscmr57bq"

Etapa 4: Gerar um Plano de Execução


Gerar e revisar o plano de execução

Observação:

Neste tutorial, estamos usando comandos da CLI do OCI Resource Manager para gerar um plano de execução. Você pode executar a mesma tarefa usando a Console do OCI Resource Manager.
Para gerar um plano de 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": "ormjob20220117104856",
    "failure-details": null,
    "freeform-tags": {},
    "id": "ocid1.ormjob.oc1.phx.aaaaaaaacrylnpglae4yvwo4q2r2tk5z5x5v6bwjsoxgn26moyg3eqwnt2aq",
    "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-17T10:48:56.324000+00:00",
    "time-finished": null,
    "variables": {},
    "working-directory": null
  },
  "etag": "a6f75ec1e205cd9105705fd7c8d65bf262159a7e733b27148049e70ce6fc14fe"
}
Geramos um plano de execução com base em uma pilha. O Resource Manager cria um job com um id exclusivo correspondente a este plano de execução. Esse id de job de plano 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 de banco de dados NoSQL na nuvem do OCI.
"id": "ocid1.ormjob.oc1.phx.aaaaaaaacrylnpglae4yvwo4q2r2tk5z5x5v6bwjsoxgn26moyg3eqwnt2aq",
"job-operation-details": {
      "operation": "PLAN"
      ...
}

Subetapa 4.1: Revisar o Plano de Execução

Para revisar um plano de 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.aaaaaaaacrylnpglae4yvwo4q2r2tk5z5x5v6bwjsoxgn26moyg3eqwnt2aq
Exemplo de resposta:
...
    {
      "level": "INFO",
      "message": "Terraform used the selected providers to generate the following execution",
      "timestamp": "2022-01-17T10:49:21.634000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "plan. Resource actions are indicated with the following symbols:",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  + create",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "Terraform will perform the following actions:",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  # oci_nosql_table.nosql_demo will be created",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  + resource \"oci_nosql_table\" \"nosql_demo\" {",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + compartment_id      = \"ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya\"",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + ddl_statement       = \"CREATE TABLE if not exists demo (ticketNo INTEGER, fullName STRING, contactPhone STRING, confNo STRING, gender STRING, bagInfo JSON, PRIMARY KEY (ticketNo))\"",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + is_auto_reclaimable = true",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + name                = \"demo\"",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + table_limits {",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "          + max_read_units     = 10",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "          + max_storage_in_gbs = 1",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "          + max_write_units    = 10",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  # oci_nosql_table.nosql_demoKeyVal will be created",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  + resource \"oci_nosql_table\" \"nosql_demoKeyVal\" {",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + compartment_id      = \"ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya\"",
      "timestamp": "2022-01-17T10:49:21.635000+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))\"",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + is_auto_reclaimable = true",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + name                = \"demoKeyVal\"",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + table_limits {",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "          + max_read_units     = 10",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "          + max_storage_in_gbs = 1",
      "timestamp": "2022-01-17T10:49:21.635000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "          + max_write_units    = 10",
      "timestamp": "2022-01-17T10:49:21.636000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "Plan: 2 to add, 0 to change, 0 to destroy.",
      "timestamp": "2022-01-17T10:49:21.636000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
...
Essa etapa é muito importante, pois valida para ver se o código da pilha contém erros de sintaxe e exatamente quantos recursos do OCI estão sendo adicionados, atualizados ou destruídos. No tutorial, estamos implantando duas tabelas NoSQL: demo e demoKeyVal.
{
 ...
      "message": "Plan: 2 to add, 0 to change, 0 to destroy.",
 ...
}

Etapa 5: Executar um Job de Aplicação


Execute o job Aplicar para provisionar recursos

  • Para especificar um job de planejamento ("aplicar" um plano de execução), use FROM_PLAN_JOB_ID:
    oci resource-manager job create-apply-job 
    --stack-id <stack_OCID> 
    --execution-plan-strategy FROM_PLAN_JOB_ID 
    --execution-plan-job-id <plan_job_OCID> 
    --display-name "Example Apply Job"
  • Para aprovar automaticamente o job de aplicação (nenhum job de planejamento especificado), use AUTO_APPROVED:
    oci resource-manager job create-apply-job 
    --stack-id <stack_OCID> 
    --execution-plan-strategy AUTO_APPROVED 
    --display-name "Example Apply Job"
Por exemplo:
oci resource-manager job create-apply-job 
--stack-id ocid1.ormstack.oc1.phx.aaaaaaaa7jrci2s5iav5tdxpl6ucwo2dwazzrdkfhs6bxiohgcpkscmr57bq 
--execution-plan-strategy AUTO_APPROVED 
--display-name "Create 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": "Create NoSQL Tables Using Terraform",
    "failure-details": null,
    "freeform-tags": {},
    "id": "ocid1.ormjob.oc1.phx.aaaaaaaaqn4nsnfgi3th4rxolwqn3kftzzdpsw52pnfeyphi5dsxd6fhescq",
    "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-17T10:54:46.346000+00:00",
    "time-finished": null,
    "variables": {},
    "working-directory": null
  },
  "etag": "4042a300e8f678dd6da0f49ffeccefed66902b51331ebfbb559da8077a728126"
}
Executamos a operação de aplicação no plano de execução de uma pilha. O Resource Manager cria um job com um id exclusivo para executar a operação de aplicação. Esse id de job de aplicação pode ser usado posteriormente para revisar os logs gerados como parte da implantação da tabela de Banco de Dados NoSQL na nuvem do OCI.
"id": "ocid1.ormjob.oc1.phx.aaaaaaaaqn4nsnfgi3th4rxolwqn3kftzzdpsw52pnfeyphi5dsxd6fhescq",
"job-operation-details": {
      "operation": "APPLY"
      ...
}

Observação:

Se você estiver usando um ambiente de host dedicado, defina a variável de ambiente CLIENT_HOST_OVERRIDES para especificar o ponto final personalizado antes de executar o job. Exemplo:
export CLIENT_HOST_OVERRIDES=<oci_nosql.NosqlClient=https://ndcs.us-ashburn-1.oci.oc-test.com>

Subetapa 5.1: Verificar o Status da Tarefa

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.aaaaaaaaqn4nsnfgi3th4rxolwqn3kftzzdpsw52pnfeyphi5dsxd6fhescq
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": "Create NoSQL Tables Using Terraform",
    "failure-details": null,
    "freeform-tags": {},
    "id": "ocid1.ormjob.oc1.phx.aaaaaaaaqn4nsnfgi3th4rxolwqn3kftzzdpsw52pnfeyphi5dsxd6fhescq",
    "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-17T10:54:46.346000+00:00",
    "time-finished": "2022-01-17T10:55:28.853000+00:00",
    "variables": {},
    "working-directory": null
  },
  "etag": "9e9f524b87e3c47b3f3ea3bbb4c1f956172a48e4c2311a44840c8b96e318bcaf--gzip"
}
É possível verificar o status de sua candidatura para verificar se a vaga foi SUCEDIDA ou FALHA.
{
...
      "lifecycle-state": "SUCCEEDED",
...
}

Subetapa 5.2: Exibir 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.aaaaaaaaqn4nsnfgi3th4rxolwqn3kftzzdpsw52pnfeyphi5dsxd6fhescq
Exemplo de resposta:
...
    {
      "level": "INFO",
      "message": "Terraform will perform the following actions:",
      "timestamp": "2022-01-17T10:55:05.580000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "",
      "timestamp": "2022-01-17T10:55:05.580000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  # oci_nosql_table.nosql_demo will be created",
      "timestamp": "2022-01-17T10:55:05.580000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  + resource \"oci_nosql_table\" \"nosql_demo\" {",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + compartment_id      = \"ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya\"",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + ddl_statement       = \"CREATE TABLE if not exists demo (ticketNo INTEGER, fullName STRING, contactPhone STRING, confNo STRING, gender STRING, bagInfo JSON, PRIMARY KEY (ticketNo))\"",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + is_auto_reclaimable = true",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + name                = \"demo\"",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + table_limits {",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "          + max_read_units     = 10",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "          + max_storage_in_gbs = 1",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "          + max_write_units    = 10",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  # oci_nosql_table.nosql_demoKeyVal will be created",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "  + resource \"oci_nosql_table\" \"nosql_demoKeyVal\" {",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + compartment_id      = \"ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya\"",
      "timestamp": "2022-01-17T10:55:05.581000+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))\"",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + is_auto_reclaimable = true",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + name                = \"demoKeyVal\"",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "      + table_limits {",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "          + max_read_units     = 10",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "          + max_storage_in_gbs = 1",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "          + max_write_units    = 10",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "Plan: 2 to add, 0 to change, 0 to destroy.",
      "timestamp": "2022-01-17T10:55:05.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "oci_nosql_table.nosql_demoKeyVal: Creating...",
      "timestamp": "2022-01-17T10:55:06.581000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "oci_nosql_table.nosql_demo: Creating...",
      "timestamp": "2022-01-17T10:55:06.582000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "oci_nosql_table.nosql_demoKeyVal: Creation complete after 6s [id=ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyaqgpbjucp3s6jjzpnar4lg5yudxhwlqrlbd54l3wdo7hq]",
      "timestamp": "2022-01-17T10:55:12.582000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "oci_nosql_table.nosql_demo: Creation complete after 9s [id=ocid1.nosqltable.oc1.phx.amaaaaaau7x7rfyasvdkoclhgryulgzox3nvlxb2bqtlxxsrvrc4zxr6lo4a]",
      "timestamp": "2022-01-17T10:55:15.583000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
    {
      "level": "INFO",
      "message": "Apply complete! Resources: 2 added, 0 changed, 0 destroyed.",
      "timestamp": "2022-01-17T10:55:15.583000+00:00",
      "type": "TERRAFORM_CONSOLE"
    },
...
Essa etapa é muito importante, pois confirma exatamente quantos recursos do OCI foram adicionados, atualizados ou destruídos. No tutorial, implantamos com sucesso duas tabelas NoSQL: demo e demoKeyVal.
{
 ...
      "message": "Apply complete! Resources: 2 added, 0 changed, 0 destroyed.",
 ...
}

Nós cobrimos muitos detalhes neste tutorial. Criamos arquivos de configuração terraform necessários para a implantação de tabelas de banco de dados NoSQL na nuvem do OCI e, em seguida, configuramos o local de origem desses arquivos. Em seguida, usamos a CLI do OCI Resource Manager para criar uma pilha, gerar um plano de execução e executar o job de aplicação no plano de execução.