EC2 インスタンスの Docker から SQL*Plus を使用して RDS for Oracle へ接続してみた

EC2 インスタンスにインストールした Docker から、SQL*Plus を使用して、RDS for Oracle へ接続します。
2021.07.07

こんにちは。

諸事情につき、久しぶりの投稿となります。はい。健康には気をつけましょう。

記事作成の背景

検証において RDS for Oracle に作成したインスタンスへサクッと接続したい場面があったとします。

従来の方法を愚直にやる場合、Oracle Client を OTN(Oracle Technology Network) からダウンロードして、インストール先の環境へ持っていって、インストールして、環境変数を設定して… としなければいけません。手順が多く、慣れていないと環境を汚してしまったり、エラーが発生してインストールが中断するなど、正直準備が面倒です。

調べてみたところ、Oracle 社が公開している Dockerfile がありましたので、こちらを使用して どっかーん してみました。という訳で、今風に Docker を使って、RDS for Oracle へ接続した備忘録を残しておきます。

oracle/docker-images: Official source for Docker configurations, images, and examples of Dockerfiles for Oracle products and projects

※追記: AWS CloudShell を使って、よりシンプルに実行したかったのですが、以下制約があり断念…
重要
現在、は、AWS CloudShellコンピューティング環境はDockerコンテナをサポートしていません。

検証環境

  • EC2: Amazon Linux 2
  • RDS: Oracle Database 19c (マルチテナント)
  • Oracle Client: 19.3.0

手順

1. Git と Docker のインストールとサービスの有効化

$ sudo yum install -y git docker
$ sudo systemctl start docker
$ sudo usermod -a -G docker ec2-user
$ sudo systemctl enable docker

2. Docker Image を取得し、イメージを作成

$ mkdir -p docker/sqlplus
$ cd docker/sqlplus/
$ git clone https://github.com/oracle/docker-images.git
$ cd docker-images/OracleInstantClient/oraclelinux7/19/
$ sudo docker build -t oracle/instantclient:19.3.0 .

3. 取得した Docker Image を run して、sqlplus を実行

$ sudo docker run -ti --rm oracle/instantclient:19.3.0 sqlplus '<ユーザー名>/<パスワード>@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=<DBのFQDN>)(Port=1521))(CONNECT_DATA=(SID=<DB名>)))'

以下、実行結果です。

[ec2-user@ip-172-31-39-173 ~]$ sudo docker run -ti --rm oracle/instantclient:19.3.0 sqlplus 'admin/**********#@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=multi-19c.***.ap-northeast-1.rds.amazonaws.com)(Port=1521))(CONNECT_DATA=(SID=multi)))'

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jul 7 08:39:46 2021
Version 19.11.0.0.0

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

Last Successful login time: Wed Jul 07 2021 04:31:28 +00:00

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

SQL> select status from v$instance;

STATUS
------------
OPEN
無事接続が完了し、DBインスタンスが OPEN していることを確認しました。
なお、今回はマルチテナントで作成したのですが、RDS for Oracle では CDB への接続が制限されているため、操作することはできません。
SQL> alter session set container=CDB$ROOT;
ERROR:
ORA-01031: insufficient privileges
つまり、PDB の追加作成など CDB 経由で実行する作業は、行うことができません。
「それ、マルチテナントの皮を被ったシングルテナントでは…」という点については、以下の弊社ブログでも触れていますので、ご参照ください。

まとめ

簡単ではありましたが、EC2 インスタンスにインストールした Docker より、SQL*Plus を使用して、RDS for Oracle へ接続してみました。 Docker を使用することで、簡単に目的が満たせたと思います。
次回は別の方法で RDS for Oracle へ接続してみます。
以上です。