terraform(v1.0.0)でAPEXをOCI DBaasにインストールする手順

はじめに

今回は、Oracle DatabaseのためのWebアプリケーション開発ツール “APEX” を、OCIのDBサーバ上にインストールする手順をお伝えしていきます。

作業のおおまかな流れ
  1. Oracleが提供しているterraformをインストール
  2. terraformのスクリプトでComputeインスタンスにORDSをデプロイ
  3. APEXを既存のDBサーバ上にインストール
もう少し細かいことを言うと…

  • Computeのインスタンス上にORDSをstandaloneでデプロイします。
  • APEXのWEBアクセスはpublic IPアドレスでアクセスします。DNSの設定は行いません。
  • Publicのサブネットで構成します。

DBaasはPrivateのネットワークでもインストール可能です。
その際は、Privateのサブネットとセキュリティリストを設定する必要があります。

図で表すとこのような感じになります。

手順の参考元は、こちらのオラクル社による手順書(英文)です。

ちなみに今回の記事は、以前に弊社ブログでご紹介したterraformのバージョン0.11.11を使ってAPEXをDBサーバ上にインストールする手順の記事の更新版となります。

APEXやORDSをデプロイするためのスクリプトはterraform0.11.Xの使用を前提として作られているのですが、terraformなどのバージョンが上がっても問題なく動作するのか?という検証記事です。

今回は以下のバージョンを使用してインストールしていきます。
terraform 1.0.0
Oracle Database 19.11.0.0.0
ords 21.1.1.116.2032
APEX 21.1

 

前提として

作業に着手する前に、以下4つの前提条件をご確認ください。

① ユーザ、コンパートメントが作成済みであること
 ※未作成の場合はOCIの使い方の記事をご参照ください。
② terraformを実行するlinuxのComputeインスタンスが作成済みであること。
③ データベースインスタンスが作成済みであること。
 ※未作成の場合はOCIの使い方(データベース編)の記事をご参照ください。
④ オブジェクトストレージのバケットが作成済みであること。

 

0.事前・途中でメモしておくべき項目

作業を進めていくと、APEX用のインスタンスを作成する際に環境変数を設定する場面があります。(本記事「6.環境変数の設定」にて)

そのとき以下に挙げているocidなどの情報を入力する必要があるため、あらかじめ黄色枠内の項目をメモ帳にコピペして控えておくと便利です。

また、「★事前に要取得」と記載しているものは、このタイミングで調べてメモしておくといいでしょう。

メモ項目

tenancy’s OCID:
手順の中で取得

user’s OCID:
手順の中で取得

fingerprint:
手順の中で取得

path to your SSH public key:
手順の中で取得

path to your SSH private key:
手順の中で取得

path to your API private key :
手順の中で取得

compartment’s OCID:
★*1 事前に要取得

database host’s IP address:
★*2 事前に要取得

database service name:
★*3 事前に要取得

subnet’s OCID:
★*4 事前に要取得

URL for ORDS.war file:
手順の中で取得

URL for APEX zip file:
手順の中で取得

★*1 compartment’s OCID

OCIコンソール上で、

アイデンティティとセキュリティ → アイデンティティ → コンパートメント

該当するコンパートメントをクリックして、コンパートメントの詳細画面からocidをコピーします。

★*2 database host’s IP address

OCIコンソール上で、

Oracle Database → ベア・メタル、VMおよびExadata → 該当するDBシステムをクリック → 左端リソースメニューより「ノード」

以下のようにパブリックIPアドレスが表示されます。

★*3 database service name

DBインスタンスにsshログインし、コマンド「lsnrctl status LISTENER | grep PDB名(小文字)」で調べることができます。

$ sudo su - oracle
$ lsnrctl status LISTENER | grep pdb
Service "pdb.XXX.XXX.oraclevcn.com" has 1 instance(s).

※PDB名を調べる場合はこちら

$ sudo su - oracle
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Jun 22 17:56:14 2021
Version 19.11.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.

Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.11.0.0.0

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB 

★*4 subnet’s OCID

OCIコンソール上で、

ネットワーキング → 仮想クラウド・ネットワーク → 該当する仮想クラウド・ネットワークをクリック

さらに、左端の「リソースメニュー」でサブネットが選択された状態で、該当するサブネットをクリック。

サブネットの詳細画面からocidをコピーします。

 

1.セキュリティリストの設定

APEXインストールのため、セキュリティリストにインスタンスを作成するリージョンのIPアドレスレンジのポート22と1521をイングレスルールに追加します。

ここでは東京リージョンを使用しているので、以下に挙げている東京リージョンのIPアドレスレンジをそれぞれ追加します。

各リージョンのIPアドレスレンジはこちらでご確認ください。

※以下に挙げている東京リージョンのIPアドレスは記事投稿時(2021年6月22日)以降に追加・変更されている可能性がありますので、念のためリンク先をご覧いただくことをおすすめします。

ソースタイプ CIDR
ソースCIDR 132.145.112.0/20
132.226.0.0/20
138.3.208.0/20
140.83.32.0/21
140.238.32.0/19
152.70.96.0/20
158.101.64.0/19
158.101.128.0/19
168.138.192.0/19
193.123.160.0/20
IPプロトコル TCP
ソースポート範囲 すべて
宛先ポート範囲 22
1521

APEXをインストールするため、0.0.0.0/0のエグレスルールを追加します。

ソースタイプ CIDR
ソースCIDR 0.0.0.0/0
IPプロトコル TCP
ソースポート範囲 すべて
宛先ポート範囲 すべて

 

2.Terraformのインストール

terraform実行インスタンスにsshログインし、Terraformのバージョン管理をするためtfenvをインストールします。

※コマンドの実行はすべて「opc」ユーザで行っています。

gitがインストールされていない場合は、先にyumでgitをインストールします。

$ git --version
-bash: git: command not found
$ sudo yum -y install git
$ git --version
git version 1.8.3.1
$ git clone https://github.com/tfutils/tfenv.git ~/.tfenv
Cloning into '/home/opc/.tfenv'...
remote: Enumerating objects: 1259, done.
remote: Counting objects: 100% (106/106), done.
remote: Compressing objects: 100% (69/69), done.
remote: Total 1259 (delta 50), reused 49 (delta 25), pack-reused 1153
Receiving objects: 100% (1259/1259), 268.68 KiB | 0 bytes/s, done.
Resolving deltas: 100% (789/789), done.
$ vi ~/.bash_profile
※ファイルの末尾に、以下を追記します
export PATH="$HOME/.tfenv/bin:$PATH"
$ source ~/.bash_profile

バージョン 1.0.0 のterraformをインストールし、デフォルトのバージョンとして設定します。

$ tfenv install 1.0.0
Installing Terraform v1.0.0
Downloading release tarball from https://releases.hashicorp.com/terraform/1.0.0/terraform_1.0.0_linux_amd64.zip
######################################################################## 100.0%
Downloading SHA hash file from https://releases.hashicorp.com/terraform/1.0.0/terraform_1.0.0_SHA256SUMS
No keybase install found, skipping OpenPGP signature verification
terraform_1.0.0_linux_amd64.zip: OK
Archive:  tfenv_download.vfKipt/terraform_1.0.0_linux_amd64.zip
  inflating: /home/opc/.tfenv/versions/1.0.0/terraform  
Installation of terraform v1.0.0 successful. To make this your default version, run 'tfenv use 1.0.0'
$ tfenv use 1.0.0
Switching default version to v1.0.0
Switching completed
$ terraform --version
Terraform v1.0.0
on linux_amd64

 

3.Webサーバ用の鍵の作成

Webサーバ用の鍵を作成します。

※パスフレーズ無しで作成します
$ ssh-keygen -t rsa -b 2048 -C websshkey -f /home/opc/.ssh/id_rsa
$ ls -l /home/opc/.ssh
total 16
-rw-------. 1 opc opc 1675 Oct  2 16:37 id_rsa
-rw-r--r--. 1 opc opc  391 Oct  2 16:37 id_rsa.pub

作成した鍵のフルパスを「6.環境変数の設定」で指定する必要があるため、以下のパスをメモに記載して更新しましょう。

メモ項目 new!

path to your SSH public key:
/home/opc/.ssh/id_rsa.pub

path to your SSH private key:
/home/opc/.ssh/id_rsa

 

4.APIキーの作成と登録

資格証明を格納する.ociディレクトリを作成します。

opensslコマンドで秘密鍵を生成しパーミッションを変更します。

次に、秘密鍵から公開鍵を生成します。

$ mkdir .oci
$ openssl genrsa -out ./.oci/oci_api_key.pem 2048
Generating RSA private key, 2048 bit long modulus
..................+++
....................................+++
e is 65537 (0x10001)
$ chmod go-rwx ./.oci/oci_api_key.pem
$ openssl rsa -pubout -in ./.oci/oci_api_key.pem -out ./.oci/oci_api_key_public.pem
writing RSA key
$ ls -l .oci
total 8
-rw-------. 1 opc opc 1675 Oct  4 16:54 oci_api_key.pem
-rw-rw-r--. 1 opc opc  451 Oct  4 16:54 oci_api_key_public.pem
メモ項目 new!

path to your API private key:
/home/opc/.oci/oci_api_key.pem

公開鍵を表示しコピーします。

$ cat .oci/oci_api_key_public.pem

一旦ここで作業をOCIコンソール上に移します。

アイデンティティとセキュリティ→ ユーザ → ユーザ名

このように選択し、左下のリソースメニューからAPIキーを選択後「APIキーの追加」ボタンを押します。

APIキーの追加ウィンドウが表示されるので、「公開キーの貼付け」を選択したら公開鍵を貼り付けて「追加」を押します。

公開鍵を追加すると以下の情報が表示されるので、コピーして控えておきます。

のちの作業(6.環境変数の設定)で使うのは、テナンシーOCID・ユーザOCID・フィンガープリントです。

用意してあるメモ帳を更新しておきましょう。

メモ項目 new!

tenancy’s OCID:

user’s OCID:

fingerprint:

 

5.オブジェクトストレージへのアップロード

まずは以下リンクから、Oracle REST Data ServicesとOracle APEXの最新バージョンをダウンロードします。

Oracle REST Data Services
Oracle APEX

ダウンロードしたOracle REST Data Servicesのzipファイル(ここではords-21.1.1.116.2032.zip)を解凍し、ords.war を取り出します。

ダウンロードした「ords.war」と「apex_21.1.zip」ファイルをObject Storage bucketにアップロードします。

アップロードの手順は、

ストレージ → オブジェクト・ストレージとアーカイブ・ストレージ → バケット名

リソースメニューの「オブジェクト」→ アップロードボタン

オブジェクトのアップロード画面が表示されたら、ダウンロードした「ords.war」と「apex_21.1.zip」ファイルをドロップするか選択をして、アップロードボタンを押します。

さらに、作成したオブジェクトの「アクション」アイコン(3ドット)から「事前認証リクエストの作成」を実行します。(「ords.war」と「apex_21.1.zip」の両方とも)

名前と有効期限を設定し、「事前認証リクエストの作成」ボタンをクリックします。

以下画像のように事前認証リクエストのURLが表示されるので、メモにコピーしておきます。

どちらも「6.環境変数の設定」で使用します。

※ウィンドウを閉じてしまうと、再度表示することはできません。

もし閉じてしまった場合は、事前認証リクエストを再度やり直しましょう。

メモ項目 new!

URL for ORDS.war file:

URL for APEX zip file:

 

6.環境変数の設定

wgetコマンドでterraform scriptからterraformのtemplateと環境設定のscriptをダウンロードします。

ORDS-APEX_Comp.zipを解凍し、ORDS-APEX_Comp内にあるsetup.shを実行します。

$ wget https://objectstorage.uk-london-1.oraclecloud.com/p/Syf5wONrf1h6j4GBcFFnWUAEtdFLdNDMWb7j0iPpIjcy838VxLfgNaqg_qcGRaPs/n/intdbaasecra/b/masito-SQLDeveloperWeb/o/ORDS-APEX_Comp.zip
$ unzip ORDS-APEX_Comp.zip
$ cd ORDS-APEX_Comp

対話式になっているので、これまで控えてきたメモをもとに以下のように入力していきます。

$ ./setup.sh
-------------------------------------------------------------------------
 Setting up environment variables to launch a compute instance for ORDS.
 Please enter required information below:
-------------------------------------------------------------------------

***** Authentication *****
Enter your tenancy's OCID []: ※テナンシのOCIDを入れます
Enter your user's OCID []: ※ユーザのOCIDを入れます
Enter your fingerprint []: ※「4.APIキーの作成と登録」で登録した鍵のフィンガープリントを入れます
Enter path to your SSH public key []: /home/opc/.ssh/id_rsa.pub
Enter path to your SSH private key []: /home/opc/.ssh/id_rsa
Enter path to your API private key []: /home/opc/.oci/oci_api_key.pem
Enter your compartment's OCID []: ※コンパートメントのOCIDを入れます

***** Target Database *****
Enter the database host's IP address []: ※データベースのパブリックIPアドレスを入れます
Enter the database service name []: ※データベースのサービス名を入れます

***** Compute Instance *****
Enter the region <us-phoenix-1|us-ashburn-1|eu-frankfurt-1|uk-london-1|ca-toronto-1> []: ap-tokyo-1  ※リージョンを入れます。東京リージョンを使用する場合は、「ap-tokyo-1」を入れます。
Enter the AD <1|2|3> []: 1 ※ADの番号を入れます
Enter the available Oracle Linux 7.X version <7.9|...> []: 7.9 ※OSのバージョンを入れます
Enter the subnet's OCID []: ※サブネットのOCIDを入れます
Enter the Compute Instance's display name []: HOGE-Comp01 ※APEXインスタンスの表示名を設定します
Enter the Compute Instance's hostname []: hoge-comp01 ※APEXインスタンスのホスト名を設定します
Enter the Compute Instance's shape <VM.Standard2.1|VM.Standard2.2|...> []: VM.Standard2.1 ※インスタンスのシェイプを入れます
Enter the Compute Instance's port []: 8888  ※インスタンスのポート番号を入れます
Enter 0 to run Jetty (ORDS standalone mode), or 1 to run Tomcat []: 0  ※0を入れるとJetty、1を入れるとTomcatが実行されます
Enter 0 to access with FQDN (hostname.yourdomain), or 1 to access with public IP address []: 1 ※0を入れるとFQDN、1を入れるとパブリックIPアドレスでアクセスできるようになります

***** File location on Object Storage *****
Enter the URL for ORDS.war file []: ※「3.オブジェクトストレージへのアップロード」で作成した事前認証リクエストのURLを入れます
Enter the URL for APEX zip file []: ※「3.オブジェクトストレージへのアップロード」で作成した事前認証リクエストのURLを入れます

***** APEX installation mode *****
Enter 0 to install APEX with Full development environment mode, or 1 to install APEX with Runtime environment mode []: 0

INFO: Updating values...

INFO: env-vars is updated successfully.
      Pleaes set environment variables. (ex. source env-vars)
$ source env-vars

上記のように、設定が終わったあとにsource env-varsを入力して、入力した環境変数を有効にします。
 

7.Terraformの実行

terraform init

ワークスペースの初期化を行います。provider ociのダウンロードなどが行われます。

$ terraform init

Initializing the backend...

Initializing provider plugins...
- Finding hashicorp/null versions matching "~> 2.1"...
- Finding latest version of hashicorp/oci...
- Installing hashicorp/null v2.1.2...
- Installed hashicorp/null v2.1.2 (signed by HashiCorp)
- Installing hashicorp/oci v4.31.0...
- Installed hashicorp/oci v4.31.0 (signed by HashiCorp)

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

╷
│ Warning: Version constraints inside provider configuration blocks are deprecated
│ 
│   on provider.tf line 11, in provider "null":
│   11:   version = "~> 2.1"
│ 
│ Terraform 0.13 and earlier allowed provider version constraints inside the provider configuration block, but that is now deprecated and will be removed in
│ a future version of Terraform. To silence this warning, move the provider version constraint into the required_providers block.
╵

╷
│ Warning: Quoted references are deprecated
│ 
│   on remote-exec.tf line 3, in resource "null_resource" "remote-exec_init":
│    3:   depends_on = ["oci_core_instance.ORDS-Comp-Instance"]
│ 
│ In this context, references are expected literally rather than in quotes. Terraform 0.11 and earlier required quotes, but quoted references are now
│ deprecated and will be removed in a future version of Terraform. Remove the quotes surrounding this reference to silence this warning.
│ 
│ (and 9 more similar warnings elsewhere)
╵

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

terraform plan

設定ファイルのチェックを行います。

$ terraform plan
var.target_db_admin_pw
  Enter a value: DBAASのDBのsysのパスワードを入力する

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
 <= read (data resources)

Terraform will perform the following actions:

  # data.oci_core_vnic.InstanceVnic will be read during apply
  # (config refers to values not yet known)
 <= data "oci_core_vnic" "InstanceVnic"  {
      + availability_domain    = (known after apply)
      + compartment_id         = (known after apply)
      + defined_tags           = (known after apply)
      + display_name           = (known after apply)
      + freeform_tags          = (known after apply)
      + hostname_label         = (known after apply)
      + id                     = (known after apply)
      + is_primary             = (known after apply)
      + mac_address            = (known after apply)
      + nsg_ids                = (known after apply)
      + private_ip_address     = (known after apply)
      + public_ip_address      = (known after apply)
      + skip_source_dest_check = (known after apply)
      + state                  = (known after apply)
      + subnet_id              = (known after apply)
      + time_created           = (known after apply)
      + vlan_id                = (known after apply)
      + vnic_id                = (known after apply)
    }

~ 省 略 ~

      + timeouts {
          + create = "60m"
        }
    }

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

~ 省 略 ~

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

terraform apply

リソースを作成します。

$ terraform apply
var.target_db_admin_pw
  Enter a value: DBAASのDBのsysのパスワードを入力する

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
 <= read (data resources)

Terraform will perform the following actions:

  # data.oci_core_vnic.InstanceVnic will be read during apply
  # (config refers to values not yet known)
 <= data "oci_core_vnic" "InstanceVnic"  {
      + availability_domain    = (known after apply)
      + compartment_id         = (known after apply)
      + defined_tags           = (known after apply)
      + display_name           = (known after apply)
      + freeform_tags          = (known after apply)
      + hostname_label         = (known after apply)
      + id                     = (known after apply)
      + is_primary             = (known after apply)
      + mac_address            = (known after apply)
      + nsg_ids                = (known after apply)
      + private_ip_address     = (known after apply)
      + public_ip_address      = (known after apply)
      + skip_source_dest_check = (known after apply)
      + state                  = (known after apply)
      + subnet_id              = (known after apply)
      + time_created           = (known after apply)
      + vlan_id                = (known after apply)
      + vnic_id                = (known after apply)
    }

~ 省 略 ~

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes (yesと入力します)

oci_core_instance.ORDS-Comp-Instance: Creating...
oci_core_instance.ORDS-Comp-Instance: Still creating... [10s elapsed]
oci_core_instance.ORDS-Comp-Instance: Still creating... [20s elapsed]
oci_core_instance.ORDS-Comp-Instance: Still creating... [30s elapsed]
oci_core_instance.ORDS-Comp-Instance: Still creating... [40s elapsed]
oci_core_instance.ORDS-Comp-Instance: Still creating... [50s elapsed]
oci_core_instance.ORDS-Comp-Instance: Creation complete after 56s [id=ocid1.instance.oc1.ap-tokyo-1.anxhiljrt3ntkzicaosokhkdaeqg2oixh4qbvvbtjosiuque7doknrhdzwyq]
data.oci_core_vnic_attachments.InstanceVnics: Reading...
data.oci_core_vnic_attachments.InstanceVnics: Read complete after 0s [id=CoreVnicAttachmentsDataSource-1318329797]
data.oci_core_vnic.InstanceVnic: Reading...
data.oci_core_vnic.InstanceVnic: Read complete after 0s [id=ocid1.vnic.oc1.ap-tokyo-1.abxhiljrxjeby4samsskh6a5mbxsplhiiac6mnecfh67g7mmpm7clmhoqylq]
null_resource.remote-exec_init: Creating...
null_resource.remote-exec_init: Provisioning with 'file'...
null_resource.remote-exec_init: Provisioning with 'remote-exec'...

~ 省 略 ~

null_resource.remote-exec_jetty-apex[0]: Still creating... [50s elapsed]
null_resource.remote-exec_jetty-apex[0] (remote-exec): ORDS is not running. Exsiting.
null_resource.remote-exec_jetty-apex[0] (remote-exec): Starting ORDS ...
null_resource.remote-exec_jetty-apex[0]: Still creating... [1m0s elapsed]
null_resource.remote-exec_jetty-apex[0]: Still creating... [1m10s elapsed]
null_resource.remote-exec_jetty-apex[0] (remote-exec): ORDS(pid=16949) has been started successfully!
null_resource.remote-exec_jetty-apex[0]: Creation complete after 1m18s [id=XXX]

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

Outputs:

InstancePrivateIP = [
  "XX.X.X.XXX",
]
InstancePublicIP = [
  "XXX.XX.XXX.XX",
]
URL_APEX_PublicIP = [
  "https://XXX.XX.XXX.XX:8888/ords/pdb/",

 

8.APEXにログイン

セキュリティリストのイングレスルールから、インストール用に設定したリージョンのIPアドレスレンジ(ポート22と1521)を削除します。

次に、APEXにログインするためイングレスルールにご自身の環境のグローバルIPアドレスとポート8888を追加します。

グローバルIPアドレスは確認くんなどで調べることができます。

terraform applyを実行した際、最後に表示されたURLにアクセスします。

(例)
https://<IPアドレス>:8888/ords/pdb/

Workspace
「internal」を入れます。
Username
「admin」を入れます。
Password
DBのパスワードを入れます。

サインインすると、パスワード変更画面に遷移します。

パスワードを変更完了させたら、APEXにログインできるようになります。


 

9.再実行する場合

ORDSが動いているWEBサーバを終了(ターミネイト)させます。

次に、DBサーバにインストールしたAPEXを削除するため、オブジェクトストレージにアップロードしたapex_21.1.zipをDBサーバ上でダウンロードし、解凍します。

$ sudo su - oracle
$ wget 「3.オブジェクトストレージへのアップロード」で作成したapex_21.1.zipの事前認証リクエストのURL
$ unzip apex_21.1.zip
$ cd apex

セッションが残っているとAPEX関連のスキーマが削除されないので、PDBを再起動します。

$ sqlplus / as sysdba
SQL> alter session set container=PDB;
SQL> shutdown immediate
SQL> startup

APEXを削除します。

SQL> @apxremov.sql

コンピュートインスタンスにある既存のORDS-APEX_Compのディレクトリを削除するかリネームし、再度ORDS-APEX_Comp.zipを解凍することでsetupからやり直しが可能になります。