質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.20%

【AWS】EC2インスタンスと外部オラクルRDSとの接続がうまくいきません。(Centos7.6.1810/PHP7.1.26/oci2.1.8/Apache2.4.6)

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,110

aaayii

score 14

【やりたいこと】
これから開発するウェブアプリケーション(AWSのEC2)から既存システムのデータを参照できるようにしたいです。
既存システムはVBで作られており、そのデータベースがRDSでオラクルエンジンを使っています。

【開発している環境】Centos7.6.1810/PHP7.1.26/oci2.1.8/Apache2.4.6

【つまづいているところ】
すべて設定し終わったあと「IP/test.php」に接続すると次のようなエラーがでてなかなか成功しません。
下記に実行した内容と結果、エラー内容、test.phpの内容を載せます。
恐れ入りますがご教授いただけると幸いです。
よろしくお願いいたします。

【test.php】

<?php


$conn = oci_new_connect('ユーザー名', 'パスワード', 'エンドポイント/orcl','AL32UTF8');
var_dump($conn);

【エラー内容】

PHP Warning:  oci_new_connect(): ORA-12170: TNS:Connect timeout occurred in /var/www/html/test.php on line 4

【oci8導入の流れ】※づらづら書きます。

#yum update
#yum install epel-release
#rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
#yum install --enablerepo=remi,remi-php71 php php-devel php-pear php-mbstring php-pdo php-gd php-zip php-xml php-fpm php-mcrypt php-mysqlnd php-pecl-apcu php-pecl-zendopcache php-intl
#yum install php71-php-oci8
//下記サイトからダウンロードrpmファイルを/tmpディレクトリに格納。
https://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html

#cd /tmp
#rpm -ivh oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm
#rpm -ivh oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm

#vi /etc/profile
#export ORACLE_HOME=/usr/lib/oracle/12.2/client64/lib [追記]
#export NLS_LANG=Japanese_Japan.AL32UTF8 [追記]
#export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH [追記]
#export PATH=$ORACLE_HOME:$PATH [追記]
#source /etc/profile

#yum -y install systemtap-sdt-devel
#export PHP_DTRACE=yes
#pecl channel-update pecl.php.net
#yum -y install gcc

#pecl install oci8-2.1.8
php.iniにextension=oci8.so [追加]
#systemctl restart httpd.service//Apache再起動

//モジュールが読み込まれているか確認。
#php -m | grep oci
oci8

//「oci_connect」関数が存在するかチェック。
#php --rf oci_connect
Function [ <internal:oci8> function oci_connect ] {

  - Parameters [5] {
    Parameter #0 [ <required> $username ]
    Parameter #1 [ <required> $password ]
    Parameter #2 [ <optional> $connection_string ]
    Parameter #3 [ <optional> $character_set ]
    Parameter #4 [ <optional> $session_mode ]
  }
}


!!追記です!!

#mkdir -p /usr/lib/oracle/12.2/client64/network/admin
#vi /usr/lib/oracle/12.2/client64/network/admin/tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = エンドポイント)(PORT = 1521))
(CONNECT_DATA =
(SID = ORCL)
)
)

イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • atata0319

    2019/03/05 12:00

    instant clientにはtnspingが含まれないことを確認しました。ネットワークレベルの疎通確認にはtelnetを使った方が早そうです。該当のエンドポイントの1521ポートに接続してみてください。

    キャンセル

  • aaayii

    2019/03/05 12:22

    セキュリティグループが設定とは、EC2でクライアント側のインバウンド設定のことでしょうか。
    また「# telnet エンドポイント 1521」を実行したところ、telnet: connect to address 10.0.0.7: Connection timed outと表示され接続できませんでした。
    それと新たにtnsnames.oraの設定をしてみました。追記いたしますので合わせてご確認いただきたいです。
    よろしくお願いいたします。

    キャンセル

  • aaayii

    2019/03/05 12:44

    ちなみにsqlplus64でユーザー名・パスを入力すると、「ORA-12162: TNS: 指定されたNetサービス名は正しくありません。」となります。
    調べるとユーザーオラクルの/oracle/.bashrcにORACLE_SIDをセットとありますがそもそもユーザーオラクルを作ってないですし、必要でしょうか。。

    キャンセル

回答 1

checkベストアンサー

0

同一 VPC 内での話ですが、RDS はデフォルトでポートが閉じられているので、RDS のセキュリティグループでポート 1521 で該当の EC2 の CentOS インスタンスからのインバウンドを許可しておく必要があります。同様に CentOS 側のセキュリティグループではポート 1521 の RDS に対するアウトバウンド通信を許可しておく必要があります。
これができていれば、CentOS から telnet エンドポイント 1521 が通るはずです。当然、標準の telnet プロトコルではないので応答はありません。


ちなみにsqlplus64でユーザー名・パスを入力すると、「ORA-12162: TNS: 指定されたNetサービス名は正しくありません。」となります。
調べるとユーザーオラクルの/oracle/.bashrcにORACLE_SIDをセットとありますがそもそもユーザーオラクルを作ってないですし、必要でしょうか。。

ORACLE_SID は不要です。それはローカルに DB を立てる時に使います。上記のエラーは tnsnames.ora は見つかったが、tnsnames.ora の内容に誤りがある際に発生します。ただし、記載通りの内容であれば、このエラーになる可能性は低いと思われます。現在稼働している Windows Server の tnsnames.ora をそのままコピーして改行文字が正しくない状態になっている可能性はあるかなと思いました。 何か予想外の文字が含まれているか確認することをお勧めします。なお、instant client で tnsnames.ora を使用する場合、TNS_ADMIN 環境変数を使用するのがお勧めです。上記の設定ですと以下のような記述になります。

export TNS_ADMIN=/usr/lib/oracle/12.2/client64/network/admin

ただ、他に Oracle Client をインストールしていないなら、現在のままでも良いと思います。


最初に書いた telnet が通った状態になっていれば、以下のように指定すれば大体つながると思うのですが・・・。

sqlplus64 ユーザー名/パスワード@エンドポイント名/ORCL


まずは SQL*Plus で普通に接続できてから、PHP の方を確認された方が良いかと思います。


あと、AWS の話であることを質問に追記した方が回答がつきやすいかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/06 12:23

    解決いたしました!
    今まで別のVPC内にインスタンスを作ってましたが、既存システムと同じVPC内にインスタンスを建て、セキュリティーグループも一緒のものを使用したら上記の設定で接続可能となりました!
    atata0319さんの「同一 VPC 内での話」がなかったら気づきませんでした。
    大変ありがとうございます!!!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • PHPに関する質問
  • 【AWS】EC2インスタンスと外部オラクルRDSとの接続がうまくいきません。(Centos7.6.1810/PHP7.1.26/oci2.1.8/Apache2.4.6)