Terraform 및 OCI Resource Manager를 사용하여 Oracle NoSQL 테이블 배포

Terraform 및 Resource Manager 스택을 사용하여 OCI(Oracle Cloud Infrastructure)에서 NDCS 테이블을 쉽게 배포할 수 있습니다. OCI Resource Manager CLI를 사용하여 Oracle Cloud에 NDCS 테이블을 배치하려고 합니다. 이 문서를 진행하기 전에 NoSQL Cloud Service를 알고 있으며 Terraform과 함께 기본 사항을 알고 있다고 가정합니다.

Terraform은 공급자를 사용하여 Terraform 엔진과 지원되는 클라우드 플랫폼 간에 인터페이스합니다. OCI(Oracle Cloud Infrastructure) Terraform 제공자는 Terraform을 관리하려는 OCI 서비스에 연결하는 구성 요소입니다. Terraform Cloud 및 OCI Resource Manager를 비롯한 OCI Terraform 제공업체를 사용할 수 있습니다.

OCI 리소스 관리자는 Terraform을 기반으로 하는 Oracle 관리형 서비스로, Terraform 구성 파일을 사용하여 OCI Terraform 제공업체가 지원하는 OCI 리소스에 대한 배포 및 운영을 자동화합니다. 리소스 관리자를 사용하면 여러 팀 및 플랫폼에서 인프라 구성 및 상태 파일을 공유하고 관리할 수 있습니다.

Terraform을 사용하여 NoSQL 데이터베이스 테이블 배포

참고: OCI(Oracle Cloud Infrastructure) 리소스 관리자 CLI(명령행 인터페이스)로 작업하고 콘솔을 사용하여 Cloud Shell에서 이러한 명령을 실행할 예정입니다. 즉, 클라우드 테넌시 및 기타 항목(예: 공용 또는 전용 키 쌍)에 대한 정보가 편리해야 합니다. 로컬 시스템에서 OCI CLI를 구성하려면 이 설명서를 참조하십시오.

이 문서에는 다음 항목이 포함되어 있습니다.

필수 조건

단계 1: NDCS 테이블 또는 인덱스에 대한 Terraform 구성 파일 생성

OCI Terraform 제공자 구성 생성 중

하위 단계 1.1: OCI Terraform 제공자 구성 생성

OCI Terraform 제공자 정의 및 연관된 변수 정의가 포함된 "provider.tf"라는 새 파일을 생성합니다. OCI Terraform 제공자에는 region 인수만 필요합니다.

그러나 인증 방법을 기반으로 OCI 계정에 대한 인증 인증서를 사용하여 추가 인수를 구성해야 할 수도 있습니다. OCI Terraform 제공자는 다음 세 가지 인증 방법을 지원합니다.

region 인수는 제공자 리소스가 생성되는 지리적 영역을 지정합니다. 단일 구성에서 여러 영역을 대상으로 지정하려면 다음 예와 같이 각 영역에 대한 제공자 정의를 생성한 다음 제공자 별칭을 사용하여 구분하면 됩니다. "oci"이라는 하나의 제공자만 정의되지만, OCI 제공자 정의는 us-phoenix-1 영역(별칭 "phx")에 대해 한 번, 그리고 us-ashburn-1 영역(별칭 "iad")에 대해 한 번 두 번 입력됩니다.

provider "oci" {
region = "us-phoenix-1"
   alias = "phx"
}
provider "oci" {
region = "us-ashburn-1"
alias = "iad"
}

아래 예제에서는 OCI Terraform 제공자에 대해 region 인수가 필요합니다. API 키 인증에는 tenancy_ocid, user_ocid, private_key_pathfingerprint 인수가 필요합니다. region 및 API 키 인증 키(tenancy_ocid, user_ocid, private_key_pathfingerprint)에 대한 값을 환경 변수로 제공하거나 Terraform 구성 변수(하위 단계 1.3: 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
}

인스턴스 주체 권한 부여를 통해 제공자는 제공자 정의에서 tenancy_ocid, user_ocid, private_key_pathfingerprint 속성을 필요로 하지 않고도 OCI 컴퓨트 인스턴스에서 API 호출을 수행할 수 있습니다.

주: 인스턴스 주체 권한 부여는 Oracle Cloud Infrastructure에서 실행 중인 인스턴스에만 적용됩니다.

아래 예제에서는 OCI Terraform 제공자에 대해 region 인수가 필요하며 인스턴스 주체 권한 부여에 대해 auth 인수가 필요합니다. region 인수에 대한 값을 환경 변수로 제공하거나 Terraform 구성 변수 내에서 제공할 수 있습니다(하위 단계 1.3: Terraform 구성 변수 로드 참조).

variable "region" {
}
provider "oci" {
   auth = "InstancePrincipal"
   region = var.region
}

보안 토큰 인증을 사용하면 CLI에 대한 토큰 기반 인증으로 생성된 토큰을 사용하여 Terraform을 실행할 수 있습니다.

주: 이 토큰은 1시간 후에 만료됩니다. 리소스 프로비전이 1시간 이상 걸릴 경우 이 인증 방법을 사용하지 마십시오. 자세한 내용은 토큰 새로고침을 참조하십시오.

아래 예제에서 region는 OCI Terraform 제공자에 대한 인수가 필요합니다. 보안 토큰 인증에는 authconfig_file_profile 인수가 필요합니다.

variable "region" {
}
variable "config_file_profile" {
}
provider "oci" {
auth = "SecurityToken"
  config_file_profile = var.config_file_profile
   region = var.region
}

하위 단계 1.2: NoSQL Terraform 구성 생성

NoSQL Database Cloud Service 테이블 또는 인덱스를 생성하기 위한 NoSQL Terraform 구성 리소스를 포함하는 "nosql.tf"이라는 새 파일을 생성합니다. NoSQL 데이터베이스 리소스 및 데이터 소스에 대한 자세한 내용은 oci_nosql_table을 참조하십시오.

아래 예제에서는 두 개의 NoSQL 테이블을 생성합니다. NoSQL 데이터베이스 리소스(예: 테이블 및 인덱스)에는 compartment_ocid 인수가 필요합니다. compartment_ocid에 대한 값을 환경 변수로 제공하거나 Terraform 구성 변수 내에서 제공할 수 있습니다(하위 단계 1.3: 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
    }
}

하위 단계 1.3: Terraform 구성 변수 로드

다음 단계는 "terraform.tfvars"이라는 파일을 생성하고 인증 방법에 따라 필요한 OCI Terraform 제공자 인수에 대한 값을 제공하는 것입니다.

귀하의 IAM 액세스 및 비밀 키(tenancy_ocid, user_ocid, private_key_pathfingerprint), regioncompartment_ocid 인수에 대한 값을 제공합니다. NoSQL Database Cloud Service에 대한 충분한 권한이 있는 보안 및 액세스 키가 있는 OCI IAM 사용자가 이미 있어야 합니다. 해당 키를 가져와서 파일에 저장합니다.

예:

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"

regioncompartment_ocid 인수에 대한 값을 제공합니다.

예:

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

region, compartment_ocidconfig_file_profile 인수에 대한 값을 제공합니다.

예:

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

1.4단계: 입력 변수 선언

마지막 단계는 "variables.tf"을 생성하고 여기에 있는 입력 변수에 값을 지정하는 것입니다. Terraform 설명서를 참조하여 NoSQL Database에 사용할 수 있는 유효한 인수 또는 속성을 확인하려면 여기를 클릭하십시오. 예제에서는 NoSQL 테이블에 대한 읽기, 쓰기 및 저장 영역 단위의 기본값이 각각 10, 101로 설정됩니다.

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
}

콘솔에서 Cloud Shell을 사용하여 제공자 정의, NoSQL 데이터베이스 리소스, 인증 값 및 입력 변수에 필요한 모든 Terraform 구성 파일을 생성했습니다.

Cloud Shell에서 Terraform 구성 파일 생성

2단계: Terraform 구성 저장 위치

Terraform 구성 파일 저장 위치

Resource Manager로 스택을 생성할 때 다음 소스에서 Terraform 구성을 선택할 수 있습니다.

하위 단계 2.1: 원격 Terraform 구성에 대한 구성 소스 제공자 생성

소스 제어 시스템(예: GitHub 및 GitLab)에서 호스트되는 원격 Terraform 구성을 사용하려는 경우 소스 구성 제공자를 생성해야 합니다.

원격 Terraform 구성에 대한 구성 소스 제공자를 생성하는 방법에 대한 자세한 내용은 구성 소스 제공자 관리를 참조하십시오.

3단계: 파일에서 스택 생성

파일에서 스택 생성

파일 위치와 관련된 명령을 사용합니다. 리소스 관리자에서 지원되는 Terraform 구성 소스는 Terraform 구성을 저장할 위치를 참조하십시오.

이 자습서에서는 로컬 Terraform 구성 zip 파일 terraform.zip에서 Instance Principal 인증 방법을 사용하여 스택을 생성하려고 합니다. terraform.zip 파일에는 다음 파일이 포함됩니다.

주: 이 자습서에서는 OCI Resource Manager CLI 명령을 사용하여 스택을 생성하는 중입니다. OCI Resource Manager Console을 사용하여 동일한 작업을 수행할 수 있습니다.

소스 코드 제어 시스템(예: GitHub 및 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 ""

오브젝트 스토리지 버킷의 Terraform 구성에서 스택을 생성합니다.

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

업로드된 구성 파일(.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 ""

설명:

  • --compartment-id는 스택을 생성할 컴파트먼트의 OCID입니다.

  • --config-source는 하나 이상의 Terraform 구성 파일을 포함하는 .zip 파일의 이름입니다.

  • (선택 사항) --variables은 리소스에 대한 입력 변수를 지정하는 파일의 경로입니다.

    Oracle Cloud Infrastructure Terraform 제공자는 인스턴스 주체를 사용하지 않는 한 로컬에서 Terraform을 실행할 때 추가 매개변수가 필요합니다. Terraform에서 변수 사용에 대한 자세한 내용은 입력 변수를 참조하십시오. 입력 변수 구성을 참조하십시오.

  • (선택 사항) --display-name는 새 스택의 친숙한 이름입니다.

  • (선택 사항) --description은 새 스택에 대한 설명입니다.

  • (선택 사항) --working-directory는 디렉토리의 루트 구성 파일입니다. 지정되지 않았거나 이 예에서와 같이 널인 경우 서비스는 디렉토리의 최상위 파일이 루트 구성 파일이라고 가정합니다.

예:

oci resource-manager stack create
--compartment-id ocid1.compartment.oc1..aaaaaaaawrmvqjzoegxbsixp5k3b5554vlv2kxukobw3drjho3f7nf5ca3ya
--config-source terraform.zip

응답 예:

{
  "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"
}

Terraform 구성 파일에서 스택을 생성하고 스택 ID를 생성했습니다. 다음 단계에서 이 스택 ID는 NoSQL 테이블 배포를 위한 실행 계획을 생성하는 데 사용됩니다.

"id": "ocid1.ormstack.oc1.phx.aaaaaaaa7jrci2s5iav5tdxpl6ucwo2dwazzrdkfhs6bxiohgcpkscmr57bq"

4단계: 실행 계획 생성

실행 계획 생성 및 검토

주: 이 자습서에서는 OCI Resource Manager CLI 명령을 사용하여 실행 계획을 생성합니다. OCI Resource Manager Console을 사용하여 동일한 작업을 수행할 수 있습니다.

실행 계획을 생성하려면 다음 명령을 실행합니다.

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

예:

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

응답 예:

{
  "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"
}

스택에서 실행 계획을 생성했습니다. Resource Manager는 이 실행 계획에 해당하는 고유 ID를 가진 작업을 생성합니다. 이 계획 작업 ID는 OCI 클라우드에 NoSQL 데이터베이스 리소스를 배치하기 위해 적용 작업을 실행하기 전에 나중에 실행 계획 세부정보를 검토하는 데 사용할 수 있습니다.

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

4.1단계: 실행 계획 검토

실행 계획을 검토하려면 다음 명령을 실행합니다.

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

예:

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

응답 예:

...
    {
      "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"
    },
...

이 단계는 스택 코드에 구문 오류가 포함되어 있는지 여부와 추가, 업데이트 또는 삭제 중인 OCI 리소스 수를 정확히 확인하기 위해 검증되기 때문에 매우 중요합니다. 이 자습서에서는 두 개의 NoSQL 테이블 demodemoKeyVal를 배포합니다.

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

5단계: 적용 작업 실행

리소스 프로비전을 위한 적용 작업을 실행합니다.

예:

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"

응답 예:

{
  "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"
}

스택의 실행 계획에 대해 적용 작업을 실행했습니다. Resource Manager는 적용 작업을 실행하기 위해 고유한 ID를 가진 작업을 생성합니다. 이 적용 작업 ID는 나중에 OCI 클라우드에서 NoSQL 데이터베이스 테이블 배치의 일부로 생성된 로그를 검토하는 데 사용할 수 있습니다.

"id": "ocid1.ormjob.oc1.phx.aaaaaaaaqn4nsnfgi3th4rxolwqn3kftzzdpsw52pnfeyphi5dsxd6fhescq",
"job-operation-details": {
      "operation": "APPLY"
      ...
}

주: 전용 호스트 환경을 사용 중인 경우 작업을 실행하기 전에 환경 변수 CLIENT_HOST_OVERRIDES를 설정하여 사용자 정의 끝점을 지정합니다.

예:

  export CLIENT_HOST_OVERRIDES=<oci_nosql.NosqlClient=https://ndcs.us-ashburn-1.oci.oc-test.com>

5.1단계: 작업 상태 확인

작업 상태를 확인하려면 다음 명령을 실행합니다.

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

예:

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

응답 예:

{
  "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"
}

지원 작업의 상태를 확인하여 작업이 SUCCESSFUL 또는 FAILED인지 확인할 수 있습니다.

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

5.2단계: 작업에 대한 로그 보기

작업에 대한 로그를 보려면 다음 명령을 실행합니다.

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

예:

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

응답 예:

...
    {
      "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"
    },
...

이 단계는 얼마나 많은 OCI 리소스가 추가, 업데이트 또는 삭제되었는지 정확하게 확인하기 때문에 매우 중요합니다. 이 자습서에서는 두 개의 NoSQL 테이블(demodemoKeyVal)을 성공적으로 배포했습니다.

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

우리는이 튜토리얼에서 많은 세부 사항을 다루었습니다. OCI 클라우드에 NoSQL 데이터베이스 테이블을 배포하는 데 필요한 Terraform 구성 파일을 생성한 후 해당 파일의 소스 위치를 구성했습니다. 그런 다음 OCI Resource Manager CLI를 사용하여 스택을 생성하고 실행 계획을 생성하고 실행 계획에서 적용 작업을 실행했습니다.