ノート:
- このチュートリアルではOracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructure資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了する場合は、これらの値をクラウド環境に固有の値に置き換えてください。
Terraformを使用したOracle Cloudデータベースのデータベース管理の有効化
イントロダクション
Oracle Cloud Infrastructure (OCI) Database Managementは、Oracleデータベースの監視および管理に役立つ有用なパフォーマンス診断ツールです。データベース・システム内にOracle Cloudデータベースを作成する場合、データベース作成プロセスとは無関係に、補助リソースおよびアクションに基づいているため、データベース管理オプションはデフォルトで有効になりません。
このチュートリアルでは、Terraform自動化の一部として、コード・レベルでデータベース管理を有効または無効にするTerraformコードの作成方法の例を示します。
Oracle Cloudデータベースの「データベース管理」オプションは、「関連付けられたサービス」の「データベース情報」ページで使用でき、UIから有効にすることもできます。このプロセスを成功させ、必要な情報をすべて保持するためのいくつかのステップと前提条件があります。UIを使用してデータベース管理を有効にするステップの詳細は、このチュートリアルの最後にある「関連リンク」セクションのリンクを参照してください。
目的
プライベート・サブネットにOracle Cloudデータベース、単一インスタンスまたはRACを作成するコードがある場合、この段階でデータベースではデータベース管理が有効になっておらず、直接これを行う公開パラメータはありません。追加のリソースを作成し、OCIレベルおよびデータベース・レベルで権限を付与し、データベース管理の有効化に使用する既存のデータベースから情報を取得する必要があります。これはすべて、ハードコードされた値を使用せずに、データベースを作成する同じコードの追加として行う必要があります。次の手順を実行する必要があります。
- DBSNMPユーザーのパスワードおよび権限をデータベースに設定します。
- モニタリング・ユーザー・パスワードをシークレットとしてOCI Vaultに保存します
- データベース管理サービスへのIAM権限の割当て
- OCIユーザーへのIAM権限の割当て
- VCNでのプライベート・エンドポイントの作成
- プライベート・エンドポイントとクラウド・データベース間のネットワーク・トラフィックを許可
- クラウド・データベースのデータベース管理の有効化
前提条件
- TerraformおよびOracle Databaseの知識。
- ポリシー、ボールト、Oracle Cloudデータベースを作成できるユーザー権限。ユーザーにこれらの権限がない場合、テナンシ管理者はこれらのアクションを実行できます。
- マシンにインストールされたTerraform。
タスク1: データベース・ノード(またはRACノードの1つ)のプライベートIPの取得
データベース・ノードのプライベートIPを公開する属性がないため、間接的に検索する必要があります。1つの方法として、次の2つのステップを使用します。
-
属性vnic_idを公開するTerraformデータ・ソースoci_database_db_nodesを使用します。
-
このVNIC OCIDは、複数のプライベートIPを返すデータ・ソースoci_core_private_ipsとともに使用します。VNICのプライマリ・プライベートIPとして、属性is_primary = trueのものを分離する必要があります。たとえば、次のようにローカル変数を作成します。
locals { node_ip = join(",",[for idx in data.oci_core_private_ips.this.private_ips: idx.ip_address if idx.is_primary == true]) }
タスク2: プライベートIPへの接続によるDBSNMP関連スクリプトの実行
-
SSH経由でプライベートIPを使用してデータベースに接続するには、クライアントを使用せずに要塞ホストを使用する必要があります。接続はopcユーザーとして行われます。nullリソースを使用して、SSHで要塞ホストを介した接続を定義できます。接続ブロックでbastion_hostを設定すると、プロビジョナはまずbastion_hostに接続し、そこからhost(DBノード)に接続します。
-
その後、プロビジョナremote-execを使用して、opcユーザーをoracleに切り替え、sysdbaとしてsqlplusに接続します。シェル・スクリプトは、SQLセカンダリ・スクリプトを起動して必要なgrant文を実行し、DBSNMPアカウントのロックを解除してパスワードを変更することもできます。シェルおよびSQLスクリプトの例は、files.zipにあります。
-
このステップでコードを検索できる例を次に示します。
resource "null_resource" "set_dbsnmp_pw_and_privs" { # connect to RAC node using the bastion connection { bastion_host = var.bastion_public_ip type = "ssh" user = "opc" host = local.node_ip private_key = file(var.ssh_private_key) agent = "false" timeout = "5m" } # copy sql scrip to RAC node provisioner "file" { source = "${path.root}/userdata/dbsnmp.sql" destination = "/tmp/dbsnmp.sql" } # copy shell scrip to RAC node provisioner "file" { source = "${path.root}/userdata/dbsnmp.sql" destination = "/tmp/dbsnmp.sh" } # run sqlplus script as oracle OS user from shell script provisioner "remote-exec" { inline = [ "chmod 777 /tmp/dbsnmp.sql", "chmod 777 /tmp/dbsnmp.sh", "sudo su -c '/tmp/dbsnmp.sh' oracle" ] } }
タスク3: DBSNMPパスワードのボールト、マスター・キーおよびシークレットの作成
-
Terraformリソースoci_kms_vaultを使用してボールトを作成します。
-
Terraformリソースoci_kms_keyを使用して、このボールトに新しいマスター暗号化キーを作成します。
-
Terraformリソースoci_vault_secretを使用して、前述のスクリプトで設定されたDBSNMPパスワードのシークレットを作成します。
タスク4: データベース管理サービスおよびOCIユーザーのポリシーの作成
リソースoci_identity_policyを使用してポリシーを作成します:
-
ポリシーを作成し、これらのステートメントを含めて、IAM権限をデータベース管理サービスに付与します。
statements = [ "Allow service dpd to manage objects in compartment <compartment>", "Allow service dpd to read secret-family in compartment <compartment>" ]
-
OCIユーザーのポリシーを作成するか、既存のステートメントにこれらのステートメントを含めます。
statements = [ "Allow group <user_group> to manage dbmgmt-family in compartment <compartment>" "Allow group <user_group> to read database-family in compartment <compartment>" "Allow group <user_group> to manage vnics in compartment <compartment>" "Allow group <user_group> to use subnets in compartment <compartment>" "Allow group <user_group> to use network-security-groups in compartment <compartment>" "Allow group <user_group> to use security-lists in compartment <compartment>" "Allow group <user_group> to manage secret-family in compartment <compartment>" "Allow group <user_group> to read buckets in compartment <compartment>" ]
タスク5: VCNでのプライベート・エンドポイントの作成
-
データベース管理のプライベート・エンドポイントを作成するには、Terraformリソースoci_database_management_db_management_private_endpointを使用します。
ノート: Oracle Cloudデータベースの1つと同じプライベート・サブネットに作成した場合、ネットワークをさらに構成する必要がないため、タスク7をスキップできます。
タスク6: プライベート・エンドポイントとクラウド・データベース間のトラフィックを許可するネットワークの構成
- プライベート・エンドポイントがデータベースとは異なるサブネットに作成されている場合は、oci_core_network_security_group_security_ruleを使用して既存のネットワーク・セキュリティ・グループにルールを追加します。
タスク7: クラウド・データベースでのデータベース管理の有効化
データベース管理を有効にするには、Terraformリソースoci_database_cloud_database_managementを使用する必要があります。前のステップで作成した情報の一部を移入する必要があります。
-
プライベート・エンドポイントは、タスク5で作成されたリソースから取得する必要があります。
-
サービス名を属性として直接取得するデータ・ソースがありません。サービス名の形式は「一意のデータベースName.Hostドメイン名」です。「一意のデータベース名」の形式は「データベースName_Regionキー自動生成文字列」であるため、サービスを間接的に取得する必要があります。
-
まず、データ・ソースoci_database_databasesを作成します。このデータソースは、すべての接続文字列をリストする属性connection_stringsを返します。
-
この結果に異なるTerraform関数を適用して、最終的にサービス名に文字列として分離します。
-
これらのステップをコードの一部として実行し、各Oracle Cloudデータベースでデータベース管理を有効にすると、OCIコンソールで「パフォーマンス・ハブ」ボタンが使用可能になり、「メトリック」ページにメトリックが移入されます。
-
破棄オプションで同じTerraformコードを使用すると、「データベース管理」オプションを無効にできます。
関連リンク
謝辞
作成者 - Adina Nicolescu (シニア・クラウド・エンジニア)
その他の学習リソース
docs.oracle.com/learnで他のラボをご覧いただくか、Oracle Learning YouTubeチャネルでより無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Enable Database Management for Oracle Cloud databases using Terraform
F79854-01
March 2023
Copyright © 2023, Oracle and/or its affiliates.