2022年8月8日月曜日

REST対応SQLサービスによるMySQLへのアクセス

先日の記事にて、Always FreeのAmpere A1インスタンスにMySQLサーバーをインストールし、Oracle Cloudのデータベース・ツール接続サービスより利用できるようにしました。

Peter O'Brienさん(米国オラクル社の開発者)が、彼のブログ記事How to use the Oracle Database Tools Service to provide data to APEXで説明していますが、Oracle Cloudが提供しているSQLワークシートデータベース・アクションは、ORDSの機能であるREST対応SQLサービス(REST対応SQLサービス自体はAPEXではなく、ORDSが実装している機能)経由で、データベースにSQLを発行しています。

つまり、データベース・ツール接続よりSQLワークシートが使えるのであれば、REST対応SQLサービスを通してSQLを実行することも可能です。APEXからもREST対応SQLサービスをデータ・ソースとして、レポートやチャートを作成することができます。Peter O'Brienさんの記事によると、データベース・ツール接続REST対応SQLサービスのエンドポイントの形式は以下になります。< region >はap-tokyo-1やus-ashburn-1といったリージョンの名前、< connection ocid >は接続対象の接続のOCIDです。エンドポイントURLの形式については、Oracle Cloud Infrastructure DocumentationのREST APIsのセクションにて説明されています。20201005はAPI Versionになります。

https://sql.dbtools.< region >.oci.oraclecloud.com/20201005/ords/< connection ocid >/_/sql
(APEXでのREST対応SQLサービスのエンドポイント指定では、末部の/_/sqlは省略されます。)

これから、Oracle Cloud側での準備として、IAMユーザーの作成、APIキーの追加、グループの作成、ポリシーの作成を行います。Oracle APEXでは、Web資格証明の作成とREST対応SQLサービスの作成を行い、動作確認を実施します。



Oracle Cloud側の準備



データベース・ツール接続によって提供されるREST対応SQLサービスの呼び出しは、APIキーによって保護されています。そのため、APIキーを持つIAMユーザーを作成します。

Oracle Cloudのコンソールよりアイデンティティユーザーを開き、ユーザーの作成を実行します。


ユーザー・タイプの選択として、IAMユーザーを選択します。名前MySQLAccessUser説明にはMySQLへの接続ユーザーと記述します。

以上で、作成をクリックします。


ユーザーMySQLAccessUserはすぐに作成されます。ユーザー機能の編集をクリックします。


APIキーによるアクセスのみに使用するため、APIキーだけにチェックを入れ、それ以外の機能はすべてチェックを外します。

変更の保存をクリックします。


リソースAPIキーを選択し、APIキーの追加をクリックします。


APIキーの追加を行うダイアログが開きます。

方法にはいくつかの選択肢があります。今回は、事前の作業が不要な手順であるAPIキー・ペアの生成を選択します。秘密キーのダウンロードをクリックすると、秘密キーがファイルとしてダウンロードされます。ダウンロードされた秘密キーのファイルは、大事に保管してしておきます。

秘密キーをダウンロードした後に、追加をクリックします。


構成ファイルがプレビューされます。ここでプレビューされている情報は、APEXのWeb資格証明を作成する際に使用するので、コピーをクリックします。後で参照できるように、コピーした内容をファイルなどに保存しておきます。

閉じるをクリックします。


APIキーが登録されると、ユーザーの準備は完了です。


続いてアイデンティティグループを開き、グループの作成を実行します。


名前MySQLAccessGroupとします。説明MySQLへの接続グループと記述し、作成をクリックします。


グループMySQLAccessGroupが作成されます。リソースグループ・メンバーを開き、ユーザーをグループに追加をクリックします。


ユーザーMySQLAccessUserを選択し、追加をクリックします。


グループMySQLAccessGroupに、APIキーを持ったユーザーMySQLAccessUserが追加されました。


このグループMySQLAccessGroupに、データベース・ツール接続の利用を許可するポリシーを定義します。

アイデンティティポリシーを開き、ポリシーの作成を実行します。今回の作業はFree Tierアカウントで行っており、コンパートメントは積極的に使っていません。MySQLへの接続もルート・コンパートメントに作成しているため、ポリシーもルート・コンパートメントに作成します。


作成するポリシーの名前MySQLAccessPolicyとし、説明MySQLへのアクセス許可と記述します。コンパートメントルートポリシー・ビルダー手動エディタの表示ONにし、ボリシーとして以下を記述します。ポリシーの記述については、マニュアルのこちらを参照しました。database-tools-connectionsへのポリシー以外に、secret-familyreadも必要です。

Allow group MySQLAccessGroup to use database-tools-connections in tenancy
Allow group MySQLAccessGroup to read secret-family in tenancy
Allow group MySQLAccessGroup to read database-tools-connections in tenancy

以上を設定し、作成をクリックします。


ポリシーMySQLAccessPolicyが作成されます。


以上で、Oracle Cloud側の準備は完了です。


Web資格証明の作成



作成したユーザーMySQLAccessUserを使って、Oracle APEXのWeb資格証明を作成します。Web資格証明はワークスペースに作成します。そのため、アプリケーションが無くても作成できます。

アプリケーション・ビルダーよりワークスペース・ユーティリティを開きます。


ワークスペース・ユーティリティWeb資格証明を開きます。


作成済みのWeb資格証明が一覧されます。作成をクリックします。


作成するWeb資格証明名前は、MySQL Accessとします。認証タイプOracle Cloud Infrastructure (OCI)を選択します。

IAMユーザーMySQLAccessUserAPIキーを追加した際に表示された、構成ファイルのプレビューを参照します。

OCIユーザーIDとして、user=で指定されているocid1.userで始まる値を入力します。OCI秘密キーとして、APIキーの追加を行なったときにダウンロードした秘密キーを貼り付けます。OCIテナンシIDとして、構成ファイルのtenancy=として指定されているocid1.tenancyで始まる値を指定します。OCI公開キー・フィンガープリントとして、fingerprint=で指定されている値を入力します。

以上の設定を行い、作成をクリックします。


Web資格証明MySQL Accessが作成されました。




REST対応SQLサービスの作成



最初にデータベース接続より、REST対応SQLサービスでアクセスする対象の接続OCIDを取得しておきます。


ワークスペース・ユーティテリティREST対応SQLサービスを開きます。


作成済みのREST対応SQLサービスが一覧されます。作成をクリックします。


REST対応SQLサービス名前MySQLとします。エンドポイントURLは、本記事の一番最初に紹介している以下の形式で指定します。

https://sql.dbtools.< region >.oci.oraclecloud.com/20201005/ords/< connection ocid >

へ進みます。


資格証明として、先ほど作成しているMySQL Accessを指定します。

作成をクリックします。


エンドポイントURLおよび資格証明が正しく設定されていると、REST対応SQLサービスの作成に成功します。

デフォルト・データベースとしてsakilaを選択し、デフォルト・データベースの設定をクリックします。


REST対応SQLサービスの一覧に、MySQLが表示されます。


以上で、MySQLにアクセスするOracle APEXのアプリケーションを作成する準備ができました。

REST対応SQLサービスは、その接続先がOracle DatabaseであるかMySQLであるかに関わらず、APEXのデータ・ソースとしては同様に扱うことができます。ただし、記述するSQL自体はMySQL向けにする必要があります。例えば、MySQLでは大文字と小文字が区別されます。