【AWS】Amazon LinuxにOracle Instant Clientをインストールする(Chefレシピ付)

2013.10.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは植木和樹です。仕事でRDS for Oracleを使う機会があったので、Amazon Linuxからsqlplusが使えるよう「Oracle Instant Client」をインストールしました。本日はインストール録になります。

インストール台数が少々多かったのでChefのcookbookを作成して作業時間を短縮しました。せっかくなのでその際に使用したレシピも公開したいと思います。

Oracle Instant Clientとは

Oracle Instatnt Clientは、Oracleが無償で提供しているOracleクライアント向けバイナリパッケージです。通常OracleクライアントはセットアップCD-ROMからOralce Univarsal Installerを使ってメディアインストールするのですが、sqlplusや開発用ライブラリしか使わないアプリケーションサーバー向けにzipやRPMでお手軽にインストールできるようになっています。

Oracle Database Instant Client

環境

今回の環境やソフトウェアのバージョンは以下の通りです。

EC2
Amazon Linux AMI 2013.09 (64-bit) ami-3561fe34
RDS
Oracle Database Enterprise Edition 11.2.0.2.v7 (Lincense Included)
Oralce Instant Client
Version 11.2.0.4.0

Instant Clientは「Basic」と「SQL*Plus」のみを利用しました 。JDBCやCのヘッダーファイルが必要な場合は対応したパッケージもインストールしてください。

それとchefからS3のファイルをダウンロードするので、EC2にはS3ReadOnlyAccessポリシーを持ったIAMインスタンスプロファイルを割り当てています。

インストール手順

インストール手順は以下の流れになります。

  1. OTN(Oralce Technorogy Network)にユーザー登録する
  2. ダウンロードサイトからrpmファイルをローカルPCにダウンロードする
  3. rpmファイルをS3へアップロードする
  4. chefを使ってインストールする

OTNにユーザー登録する

ダウンロードにはOTN(Oralce Technorogy Network)へのログインが必要になりますので、事前にユーザー登録をしておいてください。ユーザー登録は下記ページから行うことができます。

Oracle Technorogy Network

20131012_oracle-client_001

ユーザー登録後、OTNにログインした状態で以下の作業を続けます。

rpmファイルをダウンロードする

ダウンロードは「Instant Clientのダウンロード」から行うことができます。今回はAmazon Linux 64bitを利用するため「Instant Client for Linux x86-64」を選択します。

まずはページ上部の「Accept License Agreement」のラジオボタンをクリックします。

20131012_oracle-client_002

その後ページを下にスクロールして「Version 11.2.0.4.0」から2つのパッケージのRPMをダウンロードします。

  1. Instant Client Package - Basic: All files required to run OCI, OCCI, and JDBC-OCI applications
  2. Instant Client Package - SQL*Plus: Additional libraries and executable for running SQL*Plus with Instant Client

20131012_oracle-client_003

S3へrpmをアップロードする

ダウンロードしたファイルをS3へアップロードします。バケットを作成して「software」フォルダに2つのrpmアップロードしました。

20131012_oracle-client_004

chefからs3_fileリソースを利用してS3上のrpmをダウンロードし、rpmコマンドでインストールします。s3_fileリソースは「ChefでS3からファイルを取得する」で紹介しています。便利なので超オススメです。

chefを使ってインストールする

インストールはchef-soloを使用しました。cookbookを作成しインストールレシピを作成します。その後knife-soloを利用して適用しています。

$ knife solo init .
$ cp -rpi >my-chef-repos</site-cookbooks/s3_file site-cookbooks/
$ knife cookbook create oracle-instant-client -o site-cookbooks
$ vi site-cookbooks/oracle-instant-client/recipes/default.rb
$ vi roles/app_server.json
$ knife solo bootstrap -i my_keypair.pem ec2-user@12.34.56.78 -o 'role[app_server]'

recipes/default.rb

include_recipe "s3_file"
work_dir = "/home/ec2-user/work"

directory work_dir do
  owner  "ec2-user"
  group  "ec2-user"
  mode   "00755"
  action :create
end

node['oracle-instant-client']['rpms'].each do |rpm_path|
  file = File.basename(rpm_path)
  s3_file "#{work_dir}/#{file}" do
    source "s3://#{node['oracle-instant-client']['bucket']}/#{rpm_path}"
    owner  "ec2-user"
    group  "ec2-user"
    mode   "0644"
    action :create
    not_if { File.exists?("#{work_dir}/#{file}") }
  end

  rpm_package "#{file}" do
    source "#{work_dir}/#{file}"
    action :install
  end
end

roles/app_server.json

{
  "name": "app_server",
  "default_attributes": {
    "oracle-instant-client": {
      "bucket": "my-bucket",
      "rpms": [
        "software/oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm",
        "software/oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm"
      ]
    }
  },
  "json_class": "Chef::Role",
  "description": "This is a Role for setting up an application server",
  "chef_type": "role",
  "run_list": [
    "recipe[oracle-instant-client]"
  ]
}

Oracleにsqlplusで接続する

sqlplusを実行する前に環境変数LD_LIBRARY_PATHの設定が必要です。

$ export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib
$ sqlplus64 awsuser/mypassword@"(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com)(PORT=
1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))"

接続するたびに毎回@以降の文字列を入力するのはさすがにツラいので接続文字列を設定しましょう。ec-userのホームディレクトリにoracle/network/adminディレクトリを作成し、そこにtnsnames.oraを作成します。

$ mkdir -p ~/oracle/network/admin
$ vi ~/oracle/network/admin/tnsnames.ora

mydb =
(DESCRIPTION=
  (ADDRESS=(PROTOCOL=tcp)
      (HOST=oracle.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com)
      (PORT=1521))
  (CONNECT_DATA=(SERVICE_NAME=ORCL))
)

これで@mydbで接続先を指定することができます。環境変数TNS_ADMINでtnsnames.oraのあるディレクトリを指定したら、再度sqlplusで接続してみましょう。

$ export TNS_ADMIN=~/oracle/network/admin
$ sqlplus64 awsuser/mypassword@mydb

SQL*Plus: Release 11.2.0.4.0 Production on Sun Oct 6 01:30:40 2013

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

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE    11.2.0.2.0      Production
TNS for Linux: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production

SQL> quit

まとめ

今回はOracle Instant Clientのインストール方法をご紹介しました。今回初めてRDS for Oracleを触っているのですが、OracleはMySQLに比べると全体的に事例が少ない印象です。

今後オンプレミスからAWSへの移行が増えてきた際に、既存アプリケーションパッケージの動作条件としてRDBMSにOracle利用が要求され、AWSでもOracleが採用されるケースが多くなると思います。RDSはバックアップやパッチ適用など保守運用の手間が大幅に省力化できるため、DBの管理にはなるべく手間をかけずOracleを利用することができ魅力的です。本ブログでもRDS for Oracleを検討されている方のために、積極的に情報公開していきたいと思います。