2019-10-15に更新

Oracle CloudでLaravelを動かしてみた

読了目安:14分

Oracle CloudではサーバーとRDBがAlways Freeにより永久無料で使えるという事なのでLaravelを動かせるか試してみました。Google Cloud Platformもサーバーの無料枠はありますが、RDBは今のところHeroku以外で自由なフレームワークから利用できるクラウドサービスは知りません。これでもしLaravelも無料で動かせるようになれば最高です。

ちなみにデータベースはOracleです。このあたりWeb系の人は慣れてない人が多いかもしれませんので注意です。僕もよく分からず試しました。

注意点

クラウドサービスにありがちですが、サーバーは無料だけど、それを動かすための他の何かが有料、だったり、微妙な設定により有料になってしまう場合がある、等のようなこともありえます。

Oracle Cloudは登録したばかりだと1ヶ月間は期間限定で無料枠がついているため、本当にAlways Freeにより無料になっているのか、1ヶ月無料のせいで無料に見えてしまっているのかの判断ができません。

ということで当記事も無料でOracle Cloudを使ってみる、という趣旨ではなく、あくまでもタイトルそのままの通り、Oracle CloudでLaravelを動かしてみた、というだけの話となります。また1ヶ月経って色々明らかになったらまた更新します。

ちなみに、人によってはまだAlways Freeのインスタンスが作成できない、という声も上がっているようです。まだ供給不足の可能性がありますのでうまくいかない場合は日をおいて試してみる必要があるかもしれません。(2019年9月時点)

(ちなみに、メモらずにばーっと試してから書いているため抜けのある手順などももしかしたらあるかもしれません)

Oracle Cloudに新規登録

ひとまずOracle Cloudに新規登録してアカウントを作成しておく必要があります。新規登録にはクレジットカードと電話番号の登録が必要です。

僕の場合、いつも使っているクレジットカードだとなぜかエラーになって登録できなかったため、別のカードを登録しました。念の為複数のカードを用意しておいて方が良いかもしれません。

インスタンスを作成

Oracle Cloudにログインできたら、早速インスタンスを作成します。具体的には恐らくOracle Cloud Infrastructureという枠のCompute Cloud Serviceというサービスになると思います。コンソールのメニューでいうとこの画像のように、「コンピュート」→「インスタンス」でアクセスできるページです。

ここにインスタンスの作成ボタンがありますのでそちらをクリックしてインスタンスを作成していきます。いまのところ、作成画面はすごくシンプルのようです。

命名はそのままでも適当に変更するでも良いでしょう。

イメージの選択

イメージ・ソースの変更ボタンをクリックすると、OSのイメージを変更することができます。下記のように、Always Free対象が書かれているので分かりやすいです。

ここから好きなものを選択しましょう。僕はせっかくなのでデフォルトのOracle Linuxの最新版である7.7を選択してみました。

僕はこれで適当にインスタンスを作成してしまったのですが、今「シェイプ、ネットワーク、ストレージ・オプション」の設定を開いて見てみたところ便利なものがあったので、一応紹介しておきます。

パブリックIPアドレス

何も設定せずインスタンスを作成してしまうと、パブリックIPアドレスが割り当てられません。そうすると当然ブラウザからアクセスすることができません。それどころかSSHで接続もできません(できるのかもしれませんが分からなかった&それっぽいものがあったけど無理だった)。そのためあとでIPを作成して割り当てる必要があるのですが、このオプションを見ると「パブリックIPアドレスの割当て」という設定があるようです。恐らくこちらを選択しておくと作成しておいてくれるので後で設定する必要がなくなって便利なのではないかと思います。

ちょっと忘れつつありますが、もしあとで設定する場合はインスタンス作成後、グローバルメニューに「ネットワーキング」→「パブリックIP」というメニューがあるため、そこで追加できたような気がします。

SSHキーの追加

SSHキーの追加のメニューもありました。SSH接続のために必要で、これもあとで設定できるので必ずしもここで設定する必要はないのですが、まあ、もう自分のPCに鍵があるのであれば指定しておくと良いと思います。公開鍵を指定してください。間違えて秘密鍵を指定しないようにしてください。

作成実行

他もざっと見てみましたが、とりあえずはこれくらいで、他はデフォルトで大丈夫なのではないかと思います。問題なければ「作成」ボタンをクリックして作成してしまいましょう。

インスタンスにSSH接続

なにはともあれ作成したインスタンスにSSHでアクセスする必要があります。

インスタンス詳細画面の左メニューに「コンソール接続」というメニューがあります。これは作成したのかどうか覚えてないのですが、一つコンソール接続があります。

ここのメニューでSSHもしくはVNCで接続する方法が説明されているようですが、僕の場合試してみてもうまくいかず、よく分かりませんでした。

ということで、普通にシェルでSSH接続を試してみたらできました。デフォルトでopcというユーザーが作られており、これでsudo出来るらしいです。

ssh opc@パブリックIPアドレス

インスタンス内で色々設定

とにかくLaravelを動かせるように色々設定していきます。Oracle LinuxはAmazon Linuxと同様、Red Hatベースのようですのでyumを使って色々とインストールしていきます。

今回、ちょうどいいシンプルなプロジェクトがなかった且つどれがOracle Linux内ですぐ動かせるのかよく分かっていなかったので、直接中でLaravelをインストールして動かしてみることにしました。既存のプロジェクトを動かしてみたい場合はGit等もインストールしておいてください。

Apacheをインストール

とにかくApacheだとたいして設定しなくてもPHPをすぐ動かせるのでApacheをインストールしました。

sudo yum install httpd
sudo systemctl enable httpd
sudo systemctl restart httpd

Firewallの設定

このままだとポートが開いておらず、Webサーバーにアクセスできません。とりあえず80番ポートを開きます。

ポートを確認

sudo firewall-cmd --list-ports

ポートの設定を追加

sudo firewall-cmd --permanent --add-port=80/tcp

追加した設定を反映&再度確認

sudo firewall-cmd --reload
sudo firewall-cmd --list-ports

これでサーバー内のポート設定はできました。しかしまだアクセスできないと思います。あとはコンソールのネットワークの設定も同様に必要っぽいです。

コンソールでポートの設定

これもちょっとうろ覚えなのですが、インスタンス詳細画面に「プライマリVNIC情報」という項目があり、そこに「パブリック・サブネット」というリンクがあると思います。それをクリックします。

すると下の方にサブネットの一覧が表示されます。「パブリック・サブネット」という名前のものが最初からあると思いますので、それをクリックします。

するとセキュリティリストというものの一覧が出てきます。それの名前をクリックします。

ここでようやく「イングレス・ルール」というものが出てきます。最初からSSHの22ポートの設定があるためそれっぽい感じです。雰囲気で下記のような感じで追加でhttpとhttpsのポートを設定しました。

これでIP直のURLでアクセスできるようになっていると思うので一応試しておくと良いと思います。問題なければApacheの最初のページが表示されます。

PHPをインストール

こんな操作ログが残っていました。yum-config-managerなんて昔からありましたっけ? むちゃくちゃ便利ですね。というか、もしかしたらyum-utilsは最初から入っていたかもしれませんので、そうであれば最初の3行は不要かもです。

sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
sudo yum install yum-utils
sudo yum-config-manager --enable remi-php73
sudo yum install php php-mcrypt php-cli php-gd php-curl php-zip php-mbstring php-xml php-oci8
sudo systemctl restart httpd

php-oci8というものをインストールしていますが、これがOracleと接続するためのパッケージです。

libclntsh.soをインストール

このままだと、/usr/lib64/php/modules/oci8: cannot open shared object fileという、libclntsh.so.19.1というファイルが足りないぞ、というエラーがでてLaravelが動作しません。というか、PHPコマンド実行時に毎回Warningが出ます。php-oci8というPHPとOracleのInstant Clientを接続するパッケージはインストールされていますが、Instant Clientがインストールされていないためそのあたりのライブラリも入っていないようです。これをインストールします。

下記のページからrpmをダウンロードできます。

Instant Client for Linux x86-64 (64-bit)

一番最新のBasic Packageをダウンロードしてインストールしました。

wget https://download.oracle.com/otn_software/linux/instantclient/193000/oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64.rpm
sudo yum install oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64.rpm

不安な場合は、zipファイルの方をダウンロードして中身を確認し、必要なlibclntsh.soが入っているかを確認してみると良いと思います。

もしかしたらApacheとPHPのあとにこれをインストールした場合はhttpdの再起動も必要かもしれません。

Composerをインストール

Composerもインストールしておきます。

sudo su -
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

上記の場合スーパーユーザーでインストールしているので、完了したらexit等で元のユーザーに戻っておいてください。

Laravelをインストール

とりあえず素のLaravelを動かします。ドキュメントどおりにLaravelをインストールします。今回は/var/www/appとしてインストールします。/var/wwwにcdしておきます。ディレクトリの権限とかはうまいこと設定しておいてください。

composer create-project --prefer-dist laravel/laravel app

あとstorageディレクトリに書き込み権限が付いていない場合はつけておきます。

chmod 0777 storage/
find storage -type d -exec chmod 0777 {} \;
find storage -type f -exec chmod 0666 {} \;

キーを作成しておきます。

php artisan key:generate

まずはこれの最初のページが表示されることを目標に進めていきます。

Apacheの設定

Laravelをインストールしたディレクトリ用のバーチャルホストの設定を行います。/etc/httpd/conf.d/app.confというファイルを作成して書き込みます。ServerNameは適宜自分のものに合わせておいてください。

<VirtualHost *:80>
  DocumentRoot /var/www/app/public
  ServerName octest.alphabrend.net
</VirtualHost>

<Directory "/var/www/app/public">
  AllowOverride All
  Options FollowSymLinks
</Directory>

設定できたらhttpdを再起動しておきます。

sudo systemctl restart httpd

SELinux

SELinuxが動作しているためうまく動きません。適切な設定が必要ですが、今回は試しのため無効にしてあります。

sudo setenforce 0

アクセスしてみる

これで恐らくLaravelの最初のページにはアクセスできるようになっているのではないかと思います。http://バーチャルホストで設定したホスト名でアクセスしてみてください。

ディレクトリの所有権のエラーが出る場合にはもしかしたらstorageディレクトリの所有者をapacheにしておく必要があるかもしれません。

sudo chown -R apache:apache storage

あとはおかしいな、と思ったらとりあえずhttpdを再起動してみると良いかもしれません。

Oracleデータベースを利用する

さて、ここまでは単なるインスタンスの設定だったのである意味どうでもよい話でしたが、引き続き肝となるOracleのデータベースへの接続を行ってLaravelが動作するようにしていきます。

今回利用するのはOracle Autonomous Transaction Processingというデータベースで、略してATPと呼ばれているようです。コンソールのメニューにもありますのでそちらを開きます。

データベースを作成する

「Autonomous Databaseの作成」ボタンをクリックして作成画面を開きます。

すこしスクロールすると、「Always Freeの構成オプションのみを表示」という設定があります。Always Freeで試したい場合はこちらを有効にしておくと良いでしょう。必要な設定は自動的に切り替わります。途中で有料の設定を選択してしまった場合はこちらも勝手に解除されるので確認にもなります。

「管理者資格証明の作成」というところでパスワードを設定します。admin(小文字)とこのパスワードでデータベースに接続できますので覚えておいてください。

基本的には他の設定は全部そのままで大丈夫だったと思います。問題なければ一番下の「Autonomous Databaseの作成」ボタンをクリックしてデータベースを作成します。

ちなみに、Always Freeの場合は一度も接続していない場合、ちょっと時間がたつとデータベースは停止してしまいます。接続したことがあっても、1週間くらいアクセスがなければ停止するようです。初期設定時はよく止まっていますので、止まっていたら適宜起動してください。

クライアント資格証明

データベースの詳細画面を開くと、「DB接続」というボタンが表示されているためこれをクリックします。すると「クライアント資格証明(ウォレット)のダウンロード」という項目がありますので、このダウンロードボタンをクリックしてダウンロードしておきます。これを利用してデータベースに接続するようです。

そのためこれをサーバーに設置します。何か方法があるのかもしれませんが、よく分からなかったためとりあえず自分のPC上でscpを使って送信しました。

scp ダウンロードしたファイル opc@パブリックIP:~

本来であればこれらのファイルを/usr/lib/oracle/19.3/client64/lib/network/adminに配置するらしいのですが、Laravelからは権限の問題でアクセスができませんでした。そのため、とりあえず/php_oracleというディレクトリを作り、ここに配置しました。

ちなみに必要なファイルは下記ですのでコピーしておいてください。

  • tnsnames.ora
  • sqlnet.ora
  • cwallet.sso
  • ewallet.p12

アクセスできる権限を与えておきます。

sudo chown -R apache:apache /php_oracle

Laravel側でも環境変数でこのディレクトリの位置を指定できますのであとで説明します。

というかどうも全体的に所有者による権限の問題が頻発してました。詳しくは忘れたのか知らないのか分かりませんでしたが、改めて調査する時間をとるのが面倒だったのでとりあえず対処療法ばかりでやっています。すぐわかる方は適切な方法で対処してください。

Laravelでの接続設定

LaravelからOracleへの接続ですが、Laravelでは標準での接続方法が提供されていません。そのためパッケージをインストールする必要があります。

yajra/laravel-oci8: Oracle DB driver for Laravel 4|5|6 via OCI8

これを利用することでMySQL等と同様に接続して利用できるようになります。Composerでインストールします。

composer require yajra/laravel-oci8

そして設定用のファイルを生成します。

php artisan vendor:publish --tag=oracle

このファイルの内容は環境変数から指定できるようになっているため、直接変更はせず.envで設定します。

注意点として、APP_ENVはproduction、APP_DEBUGはfalseにしておきましょう。IPがパブリックなため、デバッグ状態のままエラーが発生すると環境変数が丸見えになってしまい危険です。

データベースの部分は下記のような感じです。ただ、そもそもクライアント資格証明で接続すると思うので、DB_HOST~DB_PASSWORDは設定不要のものもあるかもしれません。適宜試してみてください。

DB_CONNECTION=oracle
DB_TNS=DB201910021336_MEDIUM
DB_HOST=adb.ap-tokyo-1.oraclecloud.com
DB_PORT=1522
DB_DATABASE=DB201910021336
DB_USERNAME=admin
DB_PASSWORD=設定したパスワード
DB_SERVER_VERSION=18c
TNS_ADMIN=/php_oracle

DB_TNSは、OracleコンソールのDB接続ボタンを押した時に表示される「TNS名」という部分です。5つあってよく分からなかったので適当にMEDIUMを選びました。

DB_HOSTDB_PORTはTNS名の右に表示されている接続文字列という部分から適当に抽出しました。

DB_DATABASEは作成したデータベースの名前です。DB_USERNAMEはadmin(小文字)固定、DB_PASSWORDはデータベースを作成した時に設定したものです。

TNS_ADMINは先程クライアント資格証明を設定したフォルダを指定します。

マイグレーションしてみる

さて、実際にマイグレーションしてみましょう。

php artisan migrate

問題なければいつものようにマイグレーションが実行されるはずです。

storageディレクトリの権限がどうのこうのというエラーになる場合は所有者を変更したりしてみてください。

sudo chown -R opc:opc storage

Webでアクセスする場合にはまたapacheに戻しておいてください。

ブラウザでアクセスしてみる

次にブラウザでアクセスしてみますが、せっかくですのでDBから取得した情報も表示するようにします。routes/web.phpのウェルカムページにユーザー取得処理を追加しておきます。実際には取得前に追加する処理も入れておくとよいでしょう。

Route::get('/', function () {
    $users = \App\User::get();
    return view('welcome', compact('users'));
});

そしてwelcome.blade.phpにも下記の表示を追加します。

                <div>                                       
                    @foreach ($users as $user)              
                    <div>Name: {{ $user->name }}</div>      
                    @endforeach                             
                </div>                                      

問題なければこのような感じでデータが表示されます。

まとめ

ということでOracle CloudでLaravelをDB込で動かすところまでをざっと雑に試してみました。サーバーの知識が必要なためちょっと難易度は高いかもしれませんが、これが永久無料だとするとかなり最高ですね。GCEの永久無料枠よりもスペックは高いですし、そもそも2台まで使えるというのがすごいです。

まだ良くわかっていないことも多いため気分が乗ったらまた色々試してみたいと思います。

ツイッターでシェア
みんなに共有、忘れないようにメモ

だら@Crieit開発者

Crieitの開発者です。 Webエンジニアです(在宅)。大体10年ちょい。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel, React, Flutter, Vue.js, Node, RoR 趣味:Elixir, Phoenix, Nuxt, Express, GCP, AWS等色々 PHPフレームワークちいたんの作者

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント