Terraform 및 OCI 리소스 관리자를 사용하여 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 리소스의 배포 및 운영을 자동화합니다. Resource Manager를 사용하면 여러 팀과 플랫폼에서 인프라 구성 및 상태 파일을 공유하고 관리할 수 있습니다.


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

  • OCI에서 리소스를 생성하려면 terraform을 구성해야 합니다. Terraform 제공자 정의, NoSQL 리소스 정의, 인증 및 입력 변수에 대한 기본 Terraform 구성 파일을 생성합니다.
  • Terraform 구성 파일을 저장할 위치를 결정합니다. 로컬 폴더 또는 zip, Object Storage 버킷, 소스 제어 시스템(예: GitHub 또는 GitLab) 등 다양한 소스에 이러한 파일을 저장할 수 있습니다.
  • Resource Manager CLI 명령을 실행하여 다음 작업을 수행합니다.
    • 스택 생성.
    • 실행 계획을 생성하고 검토합니다.
    • 적용 작업을 실행하여 NoSQL 리소스를 프로비전합니다.
    • 필요에 따라 로그 파일을 검토합니다.

주:

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

이 문서에는 다음 항목이 있습니다.

필요 조건

  • Terraform에 대한 기본적인 이해 여기에서 간략한 소개를 읽어보십시오.
  • Oracle Cloud 계정 및 Oracle NoSQL Database Cloud Service 구독. Oracle Cloud 계정이 아직 없는 경우 여기에서 시작할 수 있습니다.
  • OCI Terraform 제공업체가 설치구성되었습니다.

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


OCI Terraform 제공자 구성 생성 중

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

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

그러나 인증 방식에 따라 OCI 계정에 대한 인증 자격 증명을 사용하여 추가 인수를 구성해야 할 수도 있습니다. OCI Terraform 제공자는 다음 세 가지 인증 방법을 지원합니다.
  • API 키 인증
  • 인스턴스 주체 승인
  • 보안 토큰 인증
region 인수는 제공자 리소스가 생성되는 지리적 영역을 지정합니다. 단일 구성에서 여러 영역을 대상으로 지정하려면 다음 예제와 같이 각 영역에 대한 제공자 정의를 생성한 다음 제공자 별칭을 사용하여 구분하면 됩니다. 이름이 "oci"인 제공자가 하나만 정의되어 있지만 us-phoenix-1 영역(별칭 "phx")에 대해 한 번, 영역 us-ashburn-1(별칭 "iad")에 대해 한 번씩 OCI 제공자 정의가 두 번 입력됩니다.
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 인수가 필요합니다. 하위 단계 1.3: Terraform 구성 변수 로드에 설명된 대로 region 인수에 대한 값을 환경 변수 또는 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를 참조하십시오.

아래 예제에서는 2개의 NoSQL 테이블을 생성하고 있습니다. compartment_ocid 인수는 테이블 및 인덱스와 같은 NoSQL 데이터베이스 리소스에 필요합니다. 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 데이터베이스에 사용 가능한 적합한 인수 또는 속성을 확인하십시오. 예제에서는 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 구성 파일 저장 위치

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

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

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

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

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


파일에서 스택 생성

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

이 자습서에서는 로컬 Terraform 구성 zip 파일 terraform.zip에서 인스턴스 주체 인증 방법을 사용하여 스택을 생성합니다. terraform.zip 파일에는 다음 파일이 포함되어 있습니다.
  • provider.tf
  • nosql.tf
  • terraform.tfvars
  • variables.tf

주:

이 자습서에서는 OCI Resource Manager CLI 명령을 사용하여 스택을 생성합니다. OCI Resource Manager 콘솔을 사용하여 동일한 작업을 수행할 수 있습니다.
소스 코드 제어 시스템(예: GitHub 및 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 ""
오브젝트 스토리지 버킷의 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 콘솔을 사용하여 동일한 작업을 수행할 수 있습니다.
실행 계획을 생성하려면 다음 명령을 실행합니다.
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 리소스 수를 정확히 확인하는 것이 검증되기 때문에 매우 중요합니다. 자습서에서는 demodemoKeyVal의 두 NoSQL 테이블을 배포합니다.
{
 ...
      "message": "Plan: 2 to add, 0 to change, 0 to destroy.",
 ...
}

단계 5: 적용 작업 실행


리소스 프로비전을 위해 적용 작업 실행

  • 계획 작업("실행 계획 적용")을 지정하려면 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"
  • 적용 작업을 자동으로 승인하려면(지정된 계획 작업이 없음) AUTO_APPROVED를 사용합니다.
    oci resource-manager job create-apply-job 
    --stack-id <stack_OCID> 
    --execution-plan-strategy AUTO_APPROVED 
    --display-name "Example Apply Job"
예:
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 리소스 수를 정확히 확인하므로 매우 중요합니다. 자습서에서는 demodemoKeyVal의 두 NoSQL 테이블을 성공적으로 배치했습니다.
{
 ...
      "message": "Apply complete! Resources: 2 added, 0 changed, 0 destroyed.",
 ...
}

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