Implantando a Tabela Oracle NoSQL com o Terraform e com o OCI Resource Manager
É fácil implantar tabelas do NDCS na 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 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 Terraform usa provedores para fazer interface entre o mecanismo do Terraform e a plataforma em nuvem suportada. O provedor Terraform do Oracle Cloud Infrastructure (OCI) é um componente que conecta Terraform aos serviços do OCI que você deseja gerenciar. Você pode usar o provedor Terraform do OCI, incluindo o Terraform Cloud e o Resource Manager do OCI.
O OCI Resource Manager é um serviço gerenciado pela Oracle baseado 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 Resource Manager permite que você compartilhe e gerencie configurações e arquivos do estado da infraestrutura em várias equipes e plataformas.

-
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 do terraform. Você pode armazenar esses arquivos em diferentes origens, como pasta ou zip local, 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 analise 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 Resource Manager do OCI (Oracle Cloud Infrastructure) e executar esses comandos no Cloud Shell usando a Console. Isso significa que você precisará de algumas informações sobre sua tenancy na nuvem e outros itens, como pares de chaves públicas ou privadas, úteis. Se 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. Caso ainda não tenha uma conta do Oracle Cloud, você poderá começar aqui.
-
Provedor Terraform do OCI instalado e configurado.
Etapa 1: Criar arquivos de configuração do Terraform para Tabela ou Índice NDCS

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 da 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 segmentar várias regiões em uma única configuração, basta criar uma definição de provedor para cada região e, em seguida, diferenciar usando um alias do provedor, conforme mostrado no exemplo a seguir. Observe que apenas um provedor chamado "oci" está definido, e ainda assim a definição do provedor oci é inserida duas vezes, uma para a região us-phoenix-1 (com o alias "phx") e uma 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, um argumento region é necessário para o provedor Terraform do OCI. Os argumentos tenancy_ocid, user_ocid, private_key_path e fingerprint são necessários para a autenticação da 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 dentro das 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ância permite ao seu provedor fazer chamadas de API a partir de 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 seu provedor.
Observação: A autorização do Instance main só se aplica a instâncias em execução 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 Autorização do Controlador de Instâncias. Você pode fornecer o valor do argumento region como Variáveis de Ambiente ou dentro das 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 do Token de Segurança permite executar o Terraform usando um token gerado com a 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 a configuração do NoSQL Terraform
Crie um novo arquivo chamado "nosql.tf" que contenha os recursos de configuração de terraform NoSQL para criar tabelas ou índices do NoSQL Database Cloud Service. Para obter mais informações sobre os recursos e origens de dados do Banco de Dados NoSQL, 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 dentro das 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 obrigatórios do provedor Terraform do OCI com base no método de autenticação.
Forneça valores para suas chaves de acesso e segredo do IAM (tenancy_ocid, user_ocid, private_key_path e fingerprint), region e argumentos 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. Pegue 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 atribuir valores a variáveis de entrada nele. Clique aqui para consultar a documentação do Terraform para verificar os argumentos ou propriedades válidos disponíveis para o NoSQL Database. No exemplo, o valor padrão das unidades de leitura, gravação e armazenamento para a 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 de provedor, recursos de banco de dados NoSQL, valores de autenticação e variáveis de entrada.

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

Ao criar uma pilha com o Resource Manager, você pode selecionar sua configuração do Terraform nas origens a seguir.
-
Arquivo .zip local
-
Pasta Local
-
Bucket de Armazenamento de Objetos
O conteúdo mais recente do bucket é usado automaticamente por qualquer job em execução na pilha associada.
-
Sistemas de controle de código-fonte, como GitHub e GitLab
A versão mais recente da sua configuração é usada automaticamente por qualquer job em execução na pilha associada.
-
Modelo (configuração pré-criada do Terraform da Oracle ou de um modelo privado)
-
Compartimento existente (Descoberta de Recursos)
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 terraform remotas 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

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 do Controlador de Instâncias de um arquivo zip de configuração de terraform local, 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 os 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 do controle de código-fonte, como GitHub e GitLab.
oci resource-manager stack create-from-git-provider
--compartment-id ocid
1.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 de 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 especificando as variáveis de entrada para seus recursos.O provedor Terraform do Oracle Cloud Infrastructure requer parâmetros adicionais ao executar o Terraform localmente (a menos que você esteja usando controladores de 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 do diretório raiz. 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 com base no(s) arquivo(s) de configuração do 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

Observação: Neste tutorial, estamos usando os 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 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": "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 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.aaaaaaaacrylnpglae4yvwo4q2r2tk5z5x5v6bwjsoxgn26moyg3eqwnt2aq",
"job-operation-details": {
"operation": "PLAN"
...
}
Subetapa 4.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.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 do NoSQL: demo e demoKeyVal.
{
...
"message": "Plan: 2 to add, 0 to change, 0 to destroy.",
...
}
Etapa 5: Executar um Job de Aplicação

-
Para especificar um job do plano ("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 de tabela do NoSQL Database 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 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.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"
}
Você pode verificar o status do seu job de candidatura para verificar se o job é SUCCESSFUL ou FAILED.
{
...
"lifecycle-state": "SUCCEEDED",
...
}
Subetapa 5.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.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 do 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.