minamin's Blog

ゆるーく好きなモノ・興味あるコトについて書きます。技術系ネタは主にOracle DatabaseやCloudまわり。

TerraformでAutonomous Data Warehouse (ADW)を作ってみる

今回はTerraform(クラウドに事前に定義した内容の構成・リソースを生成・操作してくれるツール)で Oracle CloudのAutonomous Data Warehouse(ADW)を作ってみました。

Terraformのセットアップ方法はこちら

community.oracle.com

事前準備

事前に下記の情報を確認してメモ

  • プロバイダの設定に必要
    • リージョン
    • テナントのOCID
    • ユーザーのOCID
    • APIアクセス用のキーペア
  • リソース作成に必要
    • コンパートメントのOCID

※以降、上記の情報でマスクが必要なものはxxxに置き換えて記述するので、実際の情報に書き換えてください


定義ファイルの用意

変数定義

・variable.tf

### 環境の変数
variable "tenancy_ocid" {}
variable "user_ocid" {}
variable "fingerprint" {}
variable "private_key_path" {}
variable "region" {}
variable "compartment_ocid" {}

### ADWのサービス関連の変数
variable "autonomous_data_warehouse_db_name" {}
variable "autonomous_data_warehouse_display_name" {}
variable  "autonomous_data_warehouse_admin_password" {}
variable "autonomous_data_warehouse_wallet" {}

###デフォルト定義
variable "autonomous_data_warehouse_cpu_core_count" {
    default = 1 // OCPU単位
}

variable "autonomous_data_warehouse_data_storage_size_in_tbs" {
    default = 1 // TB単位
}

variable "autonomous_data_warehouse_license_model" {
    default = "LICENSE_INCLUDED"
}

variable "autonomous_data_warehouse_state" {
    default = "AVAILABLE"
}

variable "autonomous_data_warehouse_backup_display_name" {
    default = "Monthly Backup"
}

variable "autonomous_data_warehouse_backup_state" {
    default = "AVAILABLE"
}

プロバイダ定義

・provider.tf

provider "oci" {
    tenancy_ocid = "${var.tenancy_ocid}"
    user_ocid = "${var.user_ocid}"
    fingerprint = "${var.fingerprint}"
    private_key_path = "${var.private_key_path}"
    region = "${var.region}"
}

作成するADWインスタンスの設定

・adw.tf

resource "oci_database_autonomous_data_warehouse" "autonomous_data_warehouse" {
#Required
    compartment_id = "${var.compartment_ocid}"
    cpu_core_count = "${var.autonomous_data_warehouse_cpu_core_count}"
    data_storage_size_in_tbs = "${var.autonomous_data_warehouse_data_storage_size_in_tbs}"
    db_name = "${var.autonomous_data_warehouse_db_name}"
    admin_password = "${var.autonomous_data_warehouse_admin_password}"

#Optional
#    defined_tags = "${var.defined_tags}"
#    freeform_tags = "${var.freeform_tags}"
    display_name = "${var.autonomous_data_warehouse_display_name}"
    license_model = "${var.autonomous_data_warehouse_license_model}"
}

data "oci_database_autonomous_data_warehouses" "autonomous_data_warehouses" {
#Required
    compartment_id = "${var.compartment_ocid}"
#Optional
    display_name = "${oci_database_autonomous_data_warehouse.autonomous_data_warehouse.display_name}"
    #state = "${var.autonomous_data_warehouse_state}"
}


output "autonomous_data_warehouses" {
    value = "${data.oci_database_autonomous_data_warehouses.autonomous_data_warehouses.autonomous_data_warehouses}"
}

output "parallel_connection_string" {
    value = ["${lookup(oci_database_autonomous_data_warehouse.autonomous_data_warehouse.connection_strings.0.all_connection_strings, "PARALLEL", "Unavailable")}"]

(オプション)クライアントの資格証明(ウォレット)の設定とダウンロード

これは環境作成時には必須ではないですが、ダウンロードも一緒にしてくれるのでいれておくと便利

・adwwallet.tf

data "oci_database_autonomous_data_warehouse_wallet" "autonomous_data_warehouse_wallet" {
#Required
    autonomous_data_warehouse_id = "${oci_database_autonomous_data_warehouse.autonomous_data_warehouse.id}"
    password = "${var.autonomous_data_warehouse_wallet}"
}

resource "local_file" "autonomous_data_warehouse_wallet_file" {
    content = "${data.oci_database_autonomous_data_warehouse_wallet.autonomous_data_warehouse_wallet.content}"
    filename = "${path.module}/autonomous_data_warehouse_wallet.zip"
}

各値の説明はこちら

www.terraform.io

プランの作成

プランの作成は $terraform plan で行います。 -out=<プラン名> でプランのファイル出力が可能です。

実行ログ

$ terraform plan -out=adw1
var.autonomous_data_warehouse_admin_password
  Enter a value: <password>

var.autonomous_data_warehouse_db_name
  Enter a value: adwdb1

var.autonomous_data_warehouse_display_name
  Enter a value: adw1

var.compartment_ocid
  Enter a value: ocid1.compartment.oc1..<xxxx>

var.fingerprint
  Enter a value: <xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx>

var.private_key_path
  Enter a value: /mnt/c/Users/eminamin/.oci/oci_api_key.pem

var.region
  Enter a value: us-phoenix-1

var.tenancy_ocid
  Enter a value: ocid1.tenancy.oc1..<xxxx>

var.user_ocid
  Enter a value: ocid1.user.oc1.<xxxx>

var.autonomous_data_warehouse_wallet
  Enter a value: <password>

Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

random_string.wallet_password: Refreshing state... (ID: none)
data.oci_database_autonomous_data_warehouses.autonomous_data_warehouses: Refreshing state...

------------------------------------------------------------------------

  + create
 <= read (data resources)

Terraform will perform the following actions:

 <= data.oci_database_autonomous_data_warehouse_wallet.autonomous_data_warehouse_wallet
      id:                           <computed>
      autonomous_data_warehouse_id: "${oci_database_autonomous_data_warehouse.autonomous_data_warehouse.id}"
      content:                      <computed>
      password:                     <sensitive>

 <= data.oci_database_autonomous_data_warehouses.autonomous_data_warehouses
      id:                           <computed>
      autonomous_data_warehouses.#: <computed>
      compartment_id:               "ocid1.compartment.oc1..<XXXXX>"
      display_name:                 "adw1"

  + local_file.autonomous_data_warehouse_wallet_file
      id:                           <computed>
      content:                      "${data.oci_database_autonomous_data_warehouse_wallet.autonomous_data_warehouse_wallet.content}"
      filename:                     "C:\\Users\\eminamin\\tflab\\adw/autonomous_data_warehouse_wallet.zip"

  + oci_database_autonomous_data_warehouse.autonomous_data_warehouse
      id:                           <computed>
      admin_password:               <sensitive>
      compartment_id:               "ocid1.compartment.oc1.<XXXXX>"
      connection_strings.#:         <computed>
      cpu_core_count:               "1"
      data_storage_size_in_tbs:     "1"
      db_name:                      "adwdb1"
      db_version:                   <computed>
      display_name:                 "adw1"
      freeform_tags.%:              <computed>
      license_model:                "LICENSE_INCLUDED"
      lifecycle_details:            <computed>
      service_console_url:          <computed>
      state:                        <computed>
      time_created:                 <computed>


Plan: 2 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

This plan was saved to: adw1

To perform exactly these actions, run the following command to apply:
    terraform apply "adw1"

実行

実行は$terraform applyコマンドで出来ます。

実行ログ

$ terraform apply adw1
oci_database_autonomous_data_warehouse.autonomous_data_warehouse: Creating...
  admin_password:           "<sensitive>" => "<sensitive>"
  compartment_id:           "" => "ocid1.compartment.oc1.<xxxx>"
  connection_strings.#:     "" => "<computed>"
  cpu_core_count:           "" => "1"
  data_storage_size_in_tbs: "" => "1"
  db_name:                  "" => "adwdb1"
  db_version:               "" => "<computed>"
  display_name:             "" => "adw1"
  freeform_tags.%:          "" => "<computed>"
  license_model:            "" => "LICENSE_INCLUDED"
  lifecycle_details:        "" => "<computed>"
  service_console_url:      "" => "<computed>"
  state:                    "" => "<computed>"
  time_created:             "" => "<computed>"
oci_database_autonomous_data_warehouse.autonomous_data_warehouse: Still creating... (10s elapsed)
oci_database_autonomous_data_warehouse.autonomous_data_warehouse: Still creating... (20s elapsed)
oci_database_autonomous_data_warehouse.autonomous_data_warehouse: Still creating... (30s elapsed)
oci_database_autonomous_data_warehouse.autonomous_data_warehouse: Still creating... (40s elapsed)
(略)

  filename: "" => "C:\\Users\\eminamin\\tflab\\adw/autonomous_data_warehouse_wallet.zip"
local_file.autonomous_data_warehouse_wallet_file: Creation complete after 0s (ID: <xxxxx>)

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Outputs:

autonomous_data_warehouses = [
    {
        admin_password = ,
        compartment_id = ocid1.compartment.oc1..<xxxxx>,
        connection_strings = [map[all_connection_strings:map[] high:adb.us-phoenix-1.oraclecloud.com:1522/ar8grq08m8d79by_adwdb1_high.adwc.oraclecloud.com medium:adb.us-phoenix-1.oraclecloud.com:1522/ar8grq08m8d79by_adwdb1_medium.adwc.oraclecloud.com low:adb.us-phoenix-1.oraclecloud.com:1522/ar8grq08m8d79by_adwdb1_low.adwc.oraclecloud.com]],
        cpu_core_count = 1,
        data_storage_size_in_tbs = 1,
        db_name = adwdb1,
        db_version = 18.4.0.0,
        defined_tags = map[],
        display_name = adw1,
        freeform_tags = map[],
        id = ocid1.autonomousdwdatabase.oc1.phx.<xxxxx>,
        license_model = LICENSE_INCLUDED,
        lifecycle_details = ,
        service_console_url = https://adb.us-phoenix-1.oraclecloud.com/console/index.html?tenant_name=OCID1.TENANCY.OC1..<xxxxx>A&database_name=ADWDB1&service_type=ADW,
        state = AVAILABLE,
        time_created = 2019-01-27 13:25:56.61 +0000 UTC
    }
]

出来上がり。 一応UIでも確認してみると・・・

f:id:minamin96:20190127223427p:plain
ADW作成完了


Tips

変数への値の指定方法について

上記の例は、対話式で入力する形でしたが、値の指定方法としては

  1. 実行時に対話式で入力 <-上記のファイルだけの場合
  2. コマンドの引数で指定
  3. 環境変数で指定
  4. 設定ファイルで指定 の4種類があります。

環境変数で指定する場合

TF_VAR_ を変数名の先頭につけます

・env-vars

### Substitute USERNAME to correct the path
### Substitute the OCIDs, fingerprints and keys with the correct ones for your environment
### File for Linux and OS X Users in shell environment
### Authentication details
export TF_VAR_tenancy_ocid=<テナントのOCID>
export TF_VAR_user_ocid=<ユーザーのOCID>
export TF_VAR_fingerprint=<API Keyフィンガープリント>
export TF_VAR_private_key_path=<API Keyのpemフォーマットの秘密鍵のパス>

### Compartment
export TF_VAR_compartment_ocid=<コンパートメントのOCID>

### Region
export TF_VAR_region=<リージョン> --) us-phoenix-1

設定ファイルで指定する場合

・<ファイル名>.tfvars (今回はbasic.tfvars)

tenancy_ocid="<テナントのOCID>"
user_ocid="<ユーザーのOCID>"
fingerprint="<API Keyフィンガープリント>"
private_key_path="<API Keyのpemフォーマットの秘密鍵のパス>"
compartment_ocid="<コンパートメントのOCID>"
region="<リージョン>"
autonomous_data_warehouse_admin_password="<DB管理者パスワード>"
autonomous_data_warehouse_db_name="<DB名>"
autonomous_data_warehouse_display_name="<サービス表示名>"
autonomous_data_warehouse_cpu_core_count=<OCPU数>
autonomous_data_warehouse_data_storage_size_in_tbs=<ストレージサイズ(TB)>

この設定ファイルを使ってプランを作成するのは $ terraform plan -var-file=./basic.tfvars -out=adw

環境変数のケースでも、設定ファイルを指定するケースでも 下記の通り実行時に値を聞かれることなく実行できます。

パスワードの自動生成

パスワードは今回は実行時入力する形(対話式)で書いていますが、 ランダムに生成したいという時には、下記を使ってみてください。 outputを入れているので、apply実行時に自動生成されたパスワードが表示されます

resource "random_string" "autonomous_data_warehouse_admin_password" {
    length = 16
    special = true
}

output "autonomous_data_warehouse_admin_password" {
    value = "${random_string.autonomous_data_warehouse_admin_password.result}"
}

まとめ

設定する内容や必要とする他のサービスなどが少ないので、 ADW単体であればTerraformじゃなくていいかなぁというかんじですが、 ひとつのサービス単体で使うケースではなくいくつかのサービスやインフラ設定を含めて、 環境全体を簡単に作成するのに使えるので、その際の参考にしてもらえればと。

そもそもWebUIでの作成方法は???という方は ↓↓こちら↓↓

speakerdeck.com

www.youtube.com