Distribuzione di Oracle NoSQL Table mediante Terraform e OCI Resource Manager

È facile distribuire tabelle NDCS su OCI (Oracle Cloud Infrastructure) utilizzando Terraform e lo stack di Resource Manager. Verrà utilizzata l'interfaccia CLI di OCI Resource Manager per distribuire le tabelle NDCS in Oracle Cloud. Prima di procedere con questo articolo, si presume di essere a conoscenza di NoSQL Cloud Service e di conoscerne le nozioni di base, insieme a Terraform.

Terraform utilizza i provider per interfacciarsi tra il motore Terraform e la piattaforma cloud supportata. Il provider Terraform di Oracle Cloud Infrastructure (OCI) è un componente che connette Terraform ai servizi OCI che si desidera gestire. È possibile utilizzare il provider Terraform OCI, inclusi Terraform Cloud e Resource Manager OCI.

OCI Resource Manager è un servizio gestito da Oracle basato su Terraform che utilizza i file di configurazione Terraform per automatizzare la distribuzione e le operazioni per le risorse OCI supportate dal provider Terraform OCI. Resource Manager consente di condividere e gestire le configurazioni dell'infrastruttura e i file di stato tra più team e piattaforme.


Distribuzione delle tabelle di database NoSQL mediante Terraform

  • Per creare risorse in OCI, dobbiamo configurare terraform. Creare i file di configurazione terraform di base per la definizione del provider terraform, le definizioni delle risorse NoSQL, l'autenticazione e le variabili di input.
  • Decidere dove memorizzare i file di configurazione del terreno. È possibile memorizzare questi file in origini diverse, ad esempio cartelle locali o zip, bucket di storage degli oggetti e sistemi di controllo del codice sorgente, ad esempio GitHub o GitLab.
  • Eseguire i comandi CLI di Resource Manager per eseguire i task indicati di seguito.
    • Creare uno stack.
    • Genera ed esamina il piano di esecuzione.
    • Eseguire il job Apply per eseguire il provisioning delle risorse NoSQL.
    • Esaminare i file di log in base alle esigenze.

Nota

Stiamo lavorando con l'interfaccia della riga di comando (CLI) di Oracle Cloud Infrastructure (OCI) Resource Manager ed eseguiamo questi comandi in Cloud Shell utilizzando la console. Ciò significa che avrai bisogno di alcune informazioni sulla tua tenancy cloud e altri elementi, come coppie di chiavi pubbliche o private. Se vuoi configurare l'interfaccia CLI OCI sul tuo computer locale, consulta questa documentazione.

Questo articolo contiene i seguenti argomenti:

Prerequisiti

  • Conoscenza di base di Terraform. Leggi la breve introduzione qui.
  • Un account Oracle Cloud e una sottoscrizione a Oracle NoSQL Database Cloud Service. Se non disponi già di un account Oracle Cloud, puoi iniziare qui.
  • Provider Terraform OCI installato e configurato.

Passo 1: creare i file di configurazione Terraform per la tabella o l'indice NDCS


Creazione della configurazione del provider Terraform OCI

Passo secondario 1.1: creare la configurazione del provider Terraform OCI

Creare un nuovo file denominato "provider.tf" che contenga la definizione del provider Terraform OCI e le definizioni delle variabili associate. Il provider Terraform OCI richiede SOLO l'argomento region.

Tuttavia, potrebbe essere necessario configurare argomenti aggiuntivi con le credenziali di autenticazione per un account OCI in base al metodo di autenticazione. Il provider Terraform OCI supporta tre metodi di autenticazione:
  • Autenticazione chiave API
  • Autorizzazione principal istanza
  • Autenticazione token di sicurezza
L'argomento region specifica l'area geografica in cui vengono create le risorse del provider. Per indirizzare più aree in una singola configurazione, è sufficiente creare una definizione di provider per ogni area e quindi effettuare la differenziazione utilizzando un alias di provider, come mostrato nell'esempio riportato di seguito. Si noti che è definito un solo provider, denominato "oci", ma la definizione del provider OCI viene immessa due volte, una per l'area us-phoenix-1 (con l'alias "phx") e una per l'area us-ashburn-1 (con l'alias "iad").
provider "oci" {
region = "us-phoenix-1"
   alias = "phx"
}
provider "oci" {
region = "us-ashburn-1"
alias = "iad"
}
Nell'esempio riportato di seguito è necessario un argomento region per il provider Terraform OCI. Per l'autenticazione della chiave API sono richiesti gli argomenti tenancy_ocid, user_ocid, private_key_path e fingerprint. È possibile fornire il valore per le chiavi di autenticazione chiave region e API (tenancy_ocid, user_ocid, private_key_path e fingerprint) come variabili di ambiente o all'interno delle variabili di configurazione Terraform (come indicato nel Passo secondario 1.3: Caricamento delle variabili di configurazione 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
}
L'autorizzazione principal dell'istanza consente al provider di effettuare chiamate API da un'istanza di computazione OCI senza richiedere gli attributi tenancy_ocid, user_ocid, private_key_path e fingerprint nella definizione del provider.

Nota

L'autorizzazione del principal dell'istanza si applica solo alle istanze in esecuzione in Oracle Cloud Infrastructure.
Nell'esempio riportato di seguito è necessario un argomento region per il provider Terraform OCI e un argomento auth per l'autorizzazione principal dell'istanza. È possibile fornire il valore per l'argomento region come variabili di ambiente o all'interno delle variabili di configurazione Terraform (come indicato nel Passo secondario 1.3: Caricamento delle variabili di configurazione Terraform).
variable "region" {
}
provider "oci" {
   auth = "InstancePrincipal"
   region = var.region
}
L'autenticazione del token di sicurezza consente di eseguire Terraform utilizzando un token generato con l'autenticazione basata su token per l'interfaccia CLI.

Nota

Questo token scade dopo un'ora. Evitare di utilizzare questo metodo di autenticazione quando il provisioning delle risorse richiede più di un'ora. Per ulteriori informazioni, vedere Aggiornamento di un token.
Nell'esempio riportato di seguito, region è necessario un argomento per il provider Terraform OCI. Gli argomenti auth e config_file_profile sono necessari per l'autenticazione del token di sicurezza.
variable "region" {
}
variable "config_file_profile" {
}
provider "oci" {
auth = "SecurityToken"
  config_file_profile = var.config_file_profile
   region = var.region
}

Passo secondario 1.2: creare la configurazione Terraform NoSQL

Creare un nuovo file denominato "nosql.tf" contenente le risorse di configurazione del tipo terraform NoSQL per la creazione di tabelle o indici di NoSQL Database Cloud Service. Per ulteriori informazioni sulle risorse e sulle origini dati del database NoSQL, vedere oci_nosql_table.

Nell'esempio seguente vengono create 2 tabelle NoSQL. L'argomento compartment_ocid è obbligatorio per le risorse del database NoSQL, ad esempio tabelle e indici. È possibile fornire il valore per compartment_ocid come variabili di ambiente o all'interno delle variabili di configurazione Terraform (come indicato nel Passo secondario 1.3: Caricamento delle variabili di configurazione 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
    }
}

Passo secondario 1.3: caricamento delle variabili di configurazione Terraform

Il passo successivo consiste nel creare un file denominato "terraform.tfvars" e fornire i valori per gli argomenti del provider Terraform OCI necessari in base al metodo di autenticazione.

Fornire i valori per le chiavi di accesso e segrete IAM (tenancy_ocid, user_ocid, private_key_path e fingerprint), region e compartment_ocid. Dovresti già disporre di un utente IAM OCI con chiavi segrete e di accesso con autorizzazioni sufficienti su NoSQL Database Cloud Service. Prendi quelle chiavi e memorizzale nel file.

Ad esempio:
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"

Fornire i valori per gli argomenti region e compartment_ocid.

Ad esempio:
region = "us-phoenix-1"
compartment_ocid = "ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya"

Fornire i valori per gli argomenti region, compartment_ocid e config_file_profile.

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

Passo secondario 1.4: dichiarazione delle variabili di input

L'ultimo passo consiste nel creare "variables.tf" e assegnare valori alle variabili di input in esso contenute. Fare clic qui per consultare la documentazione di Terraform e verificare la presenza di argomenti o proprietà validi disponibili per il database NoSQL. Nell'esempio, il valore predefinito delle unità di lettura, scrittura e memorizzazione per la tabella NoSQL è impostato rispettivamente su 10, 10 e 1.
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
}

Utilizzando Cloud Shell dalla console, abbiamo creato tutti i file di configurazione terraform necessari per la definizione del provider, le risorse del database NoSQL, i valori di autenticazione e le variabili di input.

Creazione dei file di configurazione Terraform in Cloud Shell

Passo 2: Dove memorizzare le configurazioni Terraform


Dove memorizzare i file di configurazione di terraform

Quando si crea uno stack con Resource Manager, è possibile selezionare la configurazione Terraform dalle origini riportate di seguito.

Passo secondario 2.1: Creare provider di origine configurazione per le configurazioni Terraform remote

È necessario creare un provider di configurazione di origine se si desidera utilizzare le configurazioni terraform remote ospitate in un sistema di controllo di origine, ad esempio GitHub e GitLab.

Per ulteriori informazioni su come creare i provider di origine configurazione per le configurazioni Terraform remote, vedere Gestione dei provider di origine configurazione.

Passo 3: Creare uno stack da un file


Creazione di uno stack da un file

Utilizzare il comando relativo alla posizione del file. Per le origini di configurazione Terraform supportate con Resource Manager, vedere Dove memorizzare le configurazioni Terraform.

Per questa esercitazione verrà creato uno stack utilizzando il metodo di autenticazione principal dell'istanza da un file zip di configurazione terraform locale, terraform.zip. Il file terraform.zip contiene i seguenti file:
  • provider.tf
  • nosql.tf
  • terraform.tfvars
  • variables.tf

Nota

In questa esercitazione vengono utilizzati i comandi CLI di OCI Resource Manager per creare uno stack. È possibile eseguire lo stesso task utilizzando OCI Resource Manager Console.
Creare uno stack da un file ospitato in un sistema di controllo del codice sorgente, ad esempio 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 ""
Per creare uno stack da una configurazione Terraform in un bucket di storage degli oggetti.
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
Per creare uno stack da un file di configurazione caricato (.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 ""
Dove,
  • --compartment-id è l'OCID del compartimento in cui si desidera creare lo stack.
  • --config-source è il nome di un file .zip contenente uno o più file di configurazione Terraform.
  • (Facoltativo) --variables è il percorso del file che specifica le variabili di input per le risorse.

    Il provider Terraform di Oracle Cloud Infrastructure richiede parametri aggiuntivi durante l'esecuzione locale di Terraform (a meno che non si utilizzino i principal delle istanze). Per ulteriori informazioni sull'utilizzo delle variabili in Terraform, vedere Variabili di input. Vedere anche Configurazione della variabile di input.

  • (Facoltativo) --display-name è il nome descrittivo del nuovo stack.
  • (Facoltativo) --description è la descrizione del nuovo stack.
  • (Opzionale) --working-directory è il file di configurazione root nella directory. Se non viene specificato o se è nullo come in questo esempio, il servizio presuppone che il file di livello superiore nella directory sia il file di configurazione radice.
Ad esempio:
oci resource-manager stack create 
--compartment-id ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya 
--config-source terraform.zip
Risposta di esempio:
{
  "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"
}
Abbiamo creato uno stack dai file di configurazione terraform e generato un ID stack. Nel passo successivo, questo ID stack viene utilizzato per generare un piano di esecuzione per la distribuzione delle tabelle NoSQL.
"id": "ocid1.ormstack.oc1.phx.aaaaaaaa7jrci2s5iav5tdxpl6ucwo2dwazzrdkfhs6bxiohgcpkscmr57bq"

Passo 4: generare un piano di esecuzione


Genera ed esamina il piano di esecuzione

Nota

In questa esercitazione vengono utilizzati i comandi CLI di OCI Resource Manager per generare un piano di esecuzione. È possibile eseguire lo stesso task utilizzando OCI Resource Manager Console.
Per generare un piano di esecuzione, eseguire il comando seguente:
oci resource-manager job create-plan-job 
–-stack-id <stack_OCID> 
--display-name "<friendly_name>"
Ad esempio:
oci resource-manager job create-plan-job 
--stack-id ocid1.ormstack.oc1.phx.aaaaaaaa7jrci2s5iav5tdxpl6ucwo2dwazzrdkfhs6bxiohgcpkscmr57bq
Risposta di esempio:
{
  "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"
}
È stato generato un piano di esecuzione da uno stack. Resource Manager crea un job con un ID univoco corrispondente a questo piano di esecuzione. Questo ID job piano può essere utilizzato in un secondo momento per esaminare i dettagli del piano di esecuzione prima di eseguire l'operazione di applicazione per distribuire le risorse di database NoSQL nel cloud OCI.
"id": "ocid1.ormjob.oc1.phx.aaaaaaaacrylnpglae4yvwo4q2r2tk5z5x5v6bwjsoxgn26moyg3eqwnt2aq",
"job-operation-details": {
      "operation": "PLAN"
      ...
}

Passo secondario 4.1: Revisione del piano di esecuzione

Per rivedere un piano di esecuzione, eseguire il comando seguente:
oci resource-manager job get-job-logs 
--job-id <plan_job_OCID>
Ad esempio:
oci resource-manager job get-job-logs 
--job-id ocid1.ormjob.oc1.phx.aaaaaaaacrylnpglae4yvwo4q2r2tk5z5x5v6bwjsoxgn26moyg3eqwnt2aq
Risposta di esempio:
...
    {
      "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"
    },
...
Questo passo è molto importante in quanto verifica se il codice dello stack contiene errori di sintassi e quante risorse OCI vengono aggiunte, aggiornate o eliminate. Nell'esercitazione vengono distribuite due tabelle NoSQL: demo e demoKeyVal.
{
 ...
      "message": "Plan: 2 to add, 0 to change, 0 to destroy.",
 ...
}

Passo 5: eseguire un job di candidatura


Eseguire il job Applica per eseguire il provisioning delle risorse

  • Per specificare un job di piano ("applica" un piano di esecuzione), utilizzare 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"
  • Per approvare automaticamente il job di applicazione (nessun job piano specificato), utilizzare AUTO_APPROVED:
    oci resource-manager job create-apply-job 
    --stack-id <stack_OCID> 
    --execution-plan-strategy AUTO_APPROVED 
    --display-name "Example Apply Job"
Ad esempio:
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"
Risposta di esempio:
{
  "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"
}
È stata eseguita l'operazione di applicazione sul piano di esecuzione da uno stack. Resource Manager crea un job con un ID univoco per eseguire l'operazione di applicazione. Questo ID job di applicazione può essere utilizzato in seguito per esaminare i log generati nell'ambito della distribuzione della tabella di database NoSQL nel cloud OCI.
"id": "ocid1.ormjob.oc1.phx.aaaaaaaaqn4nsnfgi3th4rxolwqn3kftzzdpsw52pnfeyphi5dsxd6fhescq",
"job-operation-details": {
      "operation": "APPLY"
      ...
}

Nota

Se si utilizza un ambiente host dedicato, impostare la variabile di ambiente CLIENT_HOST_OVERRIDES per specificare l'endpoint personalizzato prima di eseguire il job. Esempio:
export CLIENT_HOST_OVERRIDES=<oci_nosql.NosqlClient=https://ndcs.us-ashburn-1.oci.oc-test.com>

Passo secondario 5.1: verifica dello stato del job

Per verificare lo stato di un job, eseguire il comando seguente:
oci resource-manager job get 
--job-id <job_OCID>
Ad esempio:
oci resource-manager job get 
--job-id ocid1.ormjob.oc1.phx.aaaaaaaaqn4nsnfgi3th4rxolwqn3kftzzdpsw52pnfeyphi5dsxd6fhescq
Risposta di esempio:
{
  "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"
}
È possibile controllare lo stato del job di candidatura per verificare se il job è SUCCESSFUL o FAILED.
{
...
      "lifecycle-state": "SUCCEEDED",
...
}

Passo 5.2: Visualizzare il log di un job

Per visualizzare il log di un job, eseguire il comando seguente:
oci resource-manager job get-job-logs-content 
--job-id <job_OCID>
Ad esempio:
oci resource-manager job get-job-logs-content
--job-id ocid1.ormjob.oc1.phx.aaaaaaaaqn4nsnfgi3th4rxolwqn3kftzzdpsw52pnfeyphi5dsxd6fhescq
Risposta di esempio:
...
    {
      "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"
    },
...
Questo passo è molto importante in quanto conferma esattamente il numero di risorse OCI aggiunte, aggiornate o distrutte. Nell'esercitazione sono state distribuite due tabelle NoSQL: demo e demoKeyVal.
{
 ...
      "message": "Apply complete! Resources: 2 added, 0 changed, 0 destroyed.",
 ...
}

Abbiamo coperto molti dettagli in questo tutorial. Abbiamo creato i file di configurazione terraform necessari per la distribuzione delle tabelle di database NoSQL nel cloud OCI, quindi abbiamo configurato la posizione di origine per questi file. Abbiamo quindi utilizzato l'interfaccia CLI di OCI Resource Manager per creare uno stack, generare un piano di esecuzione ed eseguire un job di applicazione nel piano di esecuzione.