Despliegue de tablas NoSQL de Oracle mediante Terraform y OCI Resource Manager

Es fácil desplegar tablas de NDCS en OCI (Oracle Cloud Infrastructure) mediante Terraform y la pila de Resource Manager. Vamos a utilizar la CLI de OCI Resource Manager para desplegar tablas de NDCS en Oracle Cloud. Antes de continuar con este artículo, se asume que conoce NoSQL Cloud Service y conoce sus conceptos básicos, junto con Terraform.

Terraform utiliza proveedores para interactuar entre el motor de Terraform y la plataforma en la nube soportada. El proveedor de Terraform de Oracle Cloud Infrastructure (OCI) es un componente que conecta Terraform a los servicios de OCI que desea gestionar. Puede utilizar el proveedor de Terraform de OCI, incluidos Terraform Cloud y OCI Resource Manager.

El gestor de recursos de OCI es un servicio gestionado por Oracle basado en Terraform que utiliza archivos de configuración de Terraform para automatizar el despliegue y las operaciones de los recursos de OCI soportados por el proveedor de Terraform de OCI. El gestor de recursos permite compartir y gestionar configuraciones de infraestructura y archivos de estado en varios equipos y plataformas.


Despliegue de tablas de base de datos NoSQL con Terraform

  • Para crear recursos en OCI, necesitamos configurar terraform. Cree los archivos de configuración de terraform básicos para la definición del proveedor de terraform, las definiciones de recursos NoSQL, la autenticación y las variables de entrada.
  • Decida dónde almacenar los archivos de configuración de terraform. Puede almacenar estos archivos en diferentes orígenes, como la carpeta o el zip locales, el cubo de Object Storage y los sistemas de control de origen, como GitHub o GitLab.
  • Ejecute los comandos de la CLI de Resource Manager para realizar las siguientes tareas:
    • Crear una pila.
    • Genere y revise el plan de ejecución.
    • Ejecute el trabajo Aplicar para aprovisionar recursos NoSQL.
    • Revise los archivos log según sea necesario.

Note:

Vamos a trabajar con la interfaz de línea de comandos (CLI) de Oracle Cloud Infrastructure (OCI) Resource Manager y ejecutar estos comandos en Cloud Shell mediante la consola. Esto significa que necesitará tener a mano información sobre su arrendamiento en la nube y otros elementos, como pares de claves públicas o privadas. Si desea configurar la CLI de OCI en la máquina local, consulte esta documentación.

En este artículo se incluyen los siguientes temas:

Requisitos

  • Conocimientos básicos de Terraform. Lea la breve introducción aquí.
  • Una cuenta de Oracle Cloud y una suscripción a Oracle NoSQL Database Cloud Service. Si aún no tiene una cuenta de Oracle Cloud, puede empezar aquí.
  • Proveedor de Terraform de OCI instalado y configurado.

Paso 1: Crear archivos de configuración de Terraform para tabla o índice de NDCS


Creación de la configuración del proveedor de Terraform de OCI

Subpaso 1.1: Crear configuración de proveedor de Terraform de OCI

Cree un nuevo archivo denominado "provider.tf" que contenga la definición del proveedor de Terraform de OCI y también las definiciones de variables asociadas. El proveedor de Terraform de OCI SOLO necesita el argumento region.

Sin embargo, puede que tenga que configurar argumentos adicionales con credenciales de autenticación para una cuenta de OCI según el método de autenticación. El proveedor de Terraform de OCI soporta tres métodos de autenticación:
  • Identificación de clave de API
  • Autorización de principal instancia
  • autenticación de token de seguridad
El argumento region especifica la región geográfica en la que se crean sus recursos de proveedor. Para dirigirse a varias regiones en una única configuración, solo tiene que crear una definición de proveedor para cada región y, a continuación, diferenciarlas mediante un alias de proveedor, como se muestra en el siguiente ejemplo. Tenga en cuenta que solo hay un proveedor, denominado "oci", y que la definición del proveedor de oci se ha introducido dos veces, una vez para la región us-phoenix-1 (con el alias "phx"), y otra vez para la región us-ashburn-1 (con el alias "iad").
provider "oci" {
region = "us-phoenix-1"
   alias = "phx"
}
provider "oci" {
region = "us-ashburn-1"
alias = "iad"
}
En el siguiente ejemplo, se necesita un argumento region para el proveedor de Terraform de OCI. Los argumentos tenancy_ocid, user_ocid, private_key_path y fingerprint son necesarios para la autenticación de clave de API. Puede proporcionar el valor para region y las claves de autenticación de clave de API (tenancy_ocid, user_ocid, private_key_path y fingerprint) como variables de entorno o dentro de las variables de configuración de Terraform (como se menciona en Substep 1.3: Loading Terraform Configuration Variables).
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
}
La autorización de principal de instancia permite al proveedor realizar llamadas de API desde una instancia informática de OCI sin necesitar los atributos tenancy_ocid, user_ocid, private_key_path y fingerprint en la definición del proveedor.

Note:

La autorización de principales de instancia solo se aplica a instancias que se ejecutan en Oracle Cloud Infrastructure.
En el siguiente ejemplo, se necesita un argumento region para el proveedor de Terraform de OCI y un argumento auth para la autorización de principal de instancia. Puede proporcionar el valor para el argumento region como variables de entorno o dentro de variables de configuración de Terraform (como se menciona en el paso 1.3: carga de variables de configuración de Terraform).
variable "region" {
}
provider "oci" {
   auth = "InstancePrincipal"
   region = var.region
}
La autenticación de token de seguridad le permite ejecutar Terraform mediante un token generado con la autenticación basada en token para CLI.

Note:

Este token caducará después de una hora. Evite utilizar este método de autenticación cuando el provisionamiento de recursos tarde más de una hora. Para obtener más información, consulte Refrescamiento de un token.
En el siguiente ejemplo, region se necesita un argumento para el proveedor de Terraform de OCI. Los argumentos auth y config_file_profile son necesarios para la autenticación del token de seguridad.
variable "region" {
}
variable "config_file_profile" {
}
provider "oci" {
auth = "SecurityToken"
  config_file_profile = var.config_file_profile
   region = var.region
}

Subpaso 1.2: Crear configuración de Terraform NoSQL

Cree un nuevo archivo denominado "nosql.tf" que contenga los recursos de configuración de terraform NoSQL para crear tablas o índices de NoSQL Database Cloud Service. Para obtener más información sobre los recursos y orígenes de datos de la base de datos NoSQL, consulte oci_nosql_table.

En el siguiente ejemplo, estamos creando 2 tablas NoSQL. El argumento compartment_ocid es necesario para los recursos de base de datos NoSQL, como tablas e índices. Puede proporcionar el valor para compartment_ocid como variables de entorno o dentro de variables de configuración de Terraform (como se menciona en el paso 1.3: carga de variables de configuración de 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
    }
}

Subpaso 1.3: Carga de variables de configuración de Terraform

El siguiente paso consiste en crear un archivo denominado "terraform.tfvars" y proporcionar valores para los argumentos del proveedor de Terraform de OCI necesarios basados en el método de autenticación.

Proporcione valores para los argumentos tenancy_ocid, user_ocid, private_key_path y fingerprint, region y compartment_ocid de acceso y claves secretas de IAM. Ya debe tener un usuario de OCI IAM con claves secretas y de acceso con permisos suficientes en NoSQL Database Cloud Service. Obtenga esas claves y almacénelas en el archivo.

Por ejemplo:
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"

Proporcione valores para los argumentos region y compartment_ocid.

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

Proporcione valores para los argumentos region, compartment_ocid y config_file_profile.

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

Subpaso 1.4: Declaración de variables de entrada

El último paso es crear "variables.tf" y asignar valores a variables de entrada en él. Haga clic aquí para consultar la documentación de Terraform para comprobar si hay argumentos o propiedades válidos disponibles para la base de datos NoSQL. En el ejemplo, el valor por defecto de las unidades de lectura, escritura y almacenamiento para la tabla NoSQL se define en 10, 10 y 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
}

Con Cloud Shell desde la consola, hemos creado todos los archivos de configuración de terraform necesarios para la definición del proveedor, los recursos de base de datos NoSQL, los valores de autenticación y las variables de entrada.

Creación de archivos de configuración de Terraform en Cloud Shell

Paso 2: Dónde almacenar las configuraciones de Terraform


Dónde almacenar los archivos de configuración de terraform

Al crear una pila con Resource Manager, puede seleccionar la configuración de Terraform de los siguientes orígenes.

Subpaso 2.1: Creación de proveedores de origen de configuración para configuraciones de Terraform remotas

Debe crear un proveedor de configuración de origen en caso de que desee utilizar las configuraciones de terraform remoto alojadas en un sistema de control de origen, como GitHub y GitLab.

Para obtener más información sobre cómo crear proveedores de origen de configuración para configuraciones de Terraform remotas, consulte Gestión de proveedores de origen de configuración.

Paso 3: Crear una pila a partir de un archivo


Creación de una pila a partir de un archivo

Utilice el comando relacionado con la ubicación del archivo. Para conocer los orígenes de configuración de Terraform soportados con Resource Manager, consulte Dónde almacenar las configuraciones de Terraform.

Para este tutorial, vamos a crear una pila mediante el método de autenticación de principal de instancia a partir de un archivo zip de configuración de terraform local, terraform.zip. El archivo terraform.zip contiene los siguientes archivos:
  • provider.tf
  • nosql.tf
  • terraform.tfvars
  • variables.tf

Note:

En este tutorial, estamos utilizando comandos de la CLI de OCI Resource Manager para crear una pila. Puede realizar la misma tarea con la consola de OCI Resource Manager.
Para crear una pila a partir de un archivo alojado en un sistema de control de código fuente, como GitHub y 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 ""
Crear una pila a partir de una configuración de Terraform en un cubo de 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 crear una pila a partir de un archivo de configuración cargado (.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 ""
Donde,
  • --compartment-id es el OCID del compartimento en el que desea crear la pila.
  • --config-source es el nombre de un archivo .zip que contiene uno o más archivos de configuración de Terraform.
  • (Opcional) --variables es la ruta al archivo que especifica las variables de entrada para los recursos.

    El proveedor de Terraform Oracle Cloud Infrastructure requiere parámetros adicionales al ejecutar Terraform de manera local (a menos que esté utilizando principales de instancias). Para obtener más información sobre el uso de variables en Terraform, consulte Variables de entrada. Consulte también Configuración de variables de entrada.

  • (Opcional) --display-name es el nombre fácil de recordar de la nueva pila.
  • (Opcional) --description es la descripción de la nueva pila.
  • (Opcional) --working-directory es el archivo de configuración raíz del directorio. Si no se especifica, o si es nulo, como en este ejemplo, el servicio asume que el archivo de nivel superior del directorio es el archivo de configuración raíz.
Por ejemplo:
oci resource-manager stack create 
--compartment-id ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya 
--config-source terraform.zip
Ejemplo de respuesta:
{
  "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"
}
Hemos creado una pila a partir de los archivos de configuración de terraform y generado un ID de pila. En el siguiente paso, este ID de pila se utiliza para generar un plan de ejecución para el despliegue de tablas NoSQL.
"id": "ocid1.ormstack.oc1.phx.aaaaaaaa7jrci2s5iav5tdxpl6ucwo2dwazzrdkfhs6bxiohgcpkscmr57bq"

Paso 4: Generar un Plan de Ejecución


Generar y revisar el plan de ejecución

Note:

En este tutorial, estamos utilizando comandos de la CLI de OCI Resource Manager para generar un plan de ejecución. Puede realizar la misma tarea con la consola de OCI Resource Manager.
Para generar un plan de ejecución, ejecute el siguiente comando:
oci resource-manager job create-plan-job 
–-stack-id <stack_OCID> 
--display-name "<friendly_name>"
Por ejemplo:
oci resource-manager job create-plan-job 
--stack-id ocid1.ormstack.oc1.phx.aaaaaaaa7jrci2s5iav5tdxpl6ucwo2dwazzrdkfhs6bxiohgcpkscmr57bq
Ejemplo de respuesta:
{
  "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"
}
Hemos generado un plan de ejecución a partir de una pila. El gestor de recursos crea un trabajo con un ID único correspondiente a este plan de ejecución. Este ID de trabajo de plan se puede utilizar más adelante para revisar los detalles del plan de ejecución antes de ejecutar la operación de aplicación para desplegar los recursos de base de datos NoSQL en la nube de OCI.
"id": "ocid1.ormjob.oc1.phx.aaaaaaaacrylnpglae4yvwo4q2r2tk5z5x5v6bwjsoxgn26moyg3eqwnt2aq",
"job-operation-details": {
      "operation": "PLAN"
      ...
}

Subpaso 4.1: Revisión del Plan de Ejecución

Para revisar un plan de ejecución, ejecute el siguiente comando:
oci resource-manager job get-job-logs 
--job-id <plan_job_OCID>
Por ejemplo:
oci resource-manager job get-job-logs 
--job-id ocid1.ormjob.oc1.phx.aaaaaaaacrylnpglae4yvwo4q2r2tk5z5x5v6bwjsoxgn26moyg3eqwnt2aq
Ejemplo de respuesta:
...
    {
      "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"
    },
...
Este paso es muy importante, ya que valida para ver si el código de pila contiene errores de sintaxis y cuántos recursos de OCI se están agregando, actualizando o destruyendo exactamente. En el tutorial, estamos desplegando dos tablas NoSQL: demo y demoKeyVal.
{
 ...
      "message": "Plan: 2 to add, 0 to change, 0 to destroy.",
 ...
}

Paso 5: Ejecución de un Trabajo de Aplicación


Ejecutar el trabajo Aplicar para aprovisionar recursos

  • Para especificar un trabajo de planificación (aplicar) un plan de ejecución, utilice 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 aprobar automáticamente el trabajo de aplicación (no se ha especificado ningún trabajo de planificación), utilice AUTO_APPROVED:
    oci resource-manager job create-apply-job 
    --stack-id <stack_OCID> 
    --execution-plan-strategy AUTO_APPROVED 
    --display-name "Example Apply Job"
Por ejemplo:
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"
Ejemplo de respuesta:
{
  "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"
}
Hemos ejecutado la operación de aplicación en el plan de ejecución desde una pila. El gestor de recursos crea un trabajo con un ID único para ejecutar la operación de aplicación. Este ID de trabajo de aplicación se puede utilizar posteriormente para revisar los logs generados como parte del despliegue de la tabla de base de datos NoSQL en la nube de OCI.
"id": "ocid1.ormjob.oc1.phx.aaaaaaaaqn4nsnfgi3th4rxolwqn3kftzzdpsw52pnfeyphi5dsxd6fhescq",
"job-operation-details": {
      "operation": "APPLY"
      ...
}

Note:

Si utiliza un entorno de host dedicado, defina la variable de entorno CLIENT_HOST_OVERRIDES para especificar el punto final personalizado antes de ejecutar el trabajo. Por ejemplo:
export CLIENT_HOST_OVERRIDES=<oci_nosql.NosqlClient=https://ndcs.us-ashburn-1.oci.oc-test.com>

Subpaso 5.1: Verificar el estado del trabajo

Para verificar el estado de un trabajo, ejecute el siguiente comando:
oci resource-manager job get 
--job-id <job_OCID>
Por ejemplo:
oci resource-manager job get 
--job-id ocid1.ormjob.oc1.phx.aaaaaaaaqn4nsnfgi3th4rxolwqn3kftzzdpsw52pnfeyphi5dsxd6fhescq
Ejemplo de respuesta:
{
  "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"
}
Puede comprobar el estado del trabajo de solicitud para verificar si el trabajo es correcto o incorrecto.
{
...
      "lifecycle-state": "SUCCEEDED",
...
}

Subpaso 5.2: Ver el log de un trabajo

Para ver el log de un trabajo, ejecute el siguiente comando:
oci resource-manager job get-job-logs-content 
--job-id <job_OCID>
Por ejemplo:
oci resource-manager job get-job-logs-content
--job-id ocid1.ormjob.oc1.phx.aaaaaaaaqn4nsnfgi3th4rxolwqn3kftzzdpsw52pnfeyphi5dsxd6fhescq
Ejemplo de respuesta:
...
    {
      "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"
    },
...
Este paso es muy importante, ya que confirma exactamente cuántos recursos de OCI se agregaron, actualizaron o destruyeron. En el tutorial, hemos desplegado correctamente dos tablas NoSQL: demo y demoKeyVal.
{
 ...
      "message": "Apply complete! Resources: 2 added, 0 changed, 0 destroyed.",
 ...
}

Hemos cubierto muchos detalles en este tutorial. Creamos los archivos de configuración de terraform necesarios para el despliegue de tablas de base de datos NoSQL en la nube de OCI y, a continuación, configuramos la ubicación de origen para estos archivos. A continuación, utilizamos la CLI de OCI Resource Manager para crear una pila, generar un plan de ejecución y ejecutar un trabajo de aplicación en el plan de ejecución.