TerraformでAutonomous Data Warehouse (ADW)を作ってみる
今回はTerraform(クラウドに事前に定義した内容の構成・リソースを生成・操作してくれるツール)で Oracle CloudのAutonomous Data Warehouse(ADW)を作ってみました。
Terraformのセットアップ方法はこちら
事前準備
事前に下記の情報を確認してメモ
- プロバイダの設定に必要
- リージョン
- テナントの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" }
各値の説明はこちら
プランの作成
プランの作成は $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でも確認してみると・・・
Tips
変数への値の指定方法について
上記の例は、対話式で入力する形でしたが、値の指定方法としては
- 実行時に対話式で入力 <-上記のファイルだけの場合
- コマンドの引数で指定
- 環境変数で指定
- 設定ファイルで指定 の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での作成方法は???という方は ↓↓こちら↓↓