Oracle Application Container Cloud を使って Node.js アプリをデプロイしてみた
Oracle Cloud Service の一つ、Oracle Application Container Cloud (ACC) というモノを使ってみた。簡単にいえば、Heroku みたいに Web アプリケーションがデプロイできるサービスなのだが、Oracle Cloud 製品群の中では「第1世代」に属される古いサービス。今後はあまりアップデートされないと思うので、ガッツリ使うつもりはないが、サクッと Web アプリをデプロイできる手軽さが良い。
目次
管理画面とアプリケーションの作成
Oracle Cloud にログイン → Oracle Cloud My Services ダッシュボードに移動 → ハンバーガーメニューより「サービス」→「Application Container」と移動する。
ACC の管理画面に移動するので、初回は「Create Application」ボタンを押下する。
「アプリケーションの作成」ダイアログが表示されたら、今回は Node.js アプリをデプロイしてみるため、「Node」を選択する。
次のダイアログで、早速アプリケーションをアップロードできるのだが、まずは動作確認も兼ねて、サンプルアプリをデプロイさせてみる。
- 「アプリケーション:」セレクトボックスが「アーカイブのアップロード」になっていると思うので、「サンプルのデプロイ」を選択する。
- 「インスタンス:」は「1」、「メモリー (GB):」も「1 (GB)」で良い
- 「Nodeバージョン:」欄で確認できるが、使用できる Node.js のバージョンは本稿執筆時点で v8 系が最新。ちょっと遅いか。
「作成」ボタンを押下すると、インスタンスの生成が開始される。インスタンス一覧から対象のインスタンスを選択し、インスタンス詳細画面に移動すると、デプロイ状況が確認できる。
5〜10分くらいすると、インスタンスの生成とサンプルアプリのデプロイが完了する。インスタンス詳細画面にて、次のような書式の URL が確認できると思うので、コレにアクセスしてみよう。
https://【アプリ名】-【テナント名】.【リージョン名】.oraclecloud.com:443
サンプルアプリは「Oracle Application Container Cloud Service」という見出しのペライチサイトが表示されるのみだが、内部的には ejs
パッケージを利用して実装されており、Node.js アプリが動作している。
アプリケーションの作成
続いて、デプロイするアプリケーションを作成する。
$ mkdir practice-acc && cd $_
$ npm init -y
# サンプルとして Express をインストールする
$ npm install -S express
# エントリポイントの生成
$ touch index.js
index.js
const express = require('express');
const app = express();
app.use((req, _res, next) => {
console.log(`${req.url} [${req.method}] : ${JSON.stringify(req.body)}`);
next();
});
// 「/」ページ
app.get('/', (_req, res) => {
res.send('Hello World');
});
// 「/test」ページ
app.get('/test', (_req, res) => {
res.send('Hello World Test');
});
// サーバ起動
const port = process.env.PORT || 8080;
app.listen(port, () => {
console.log(`Listen : ${port}`);
});
アプリケーション・マニフェストの定義
Heroku の場合、資材をデプロイすると npm start
コマンドが自動的に実行されるので、コレを利用して Node.js サーバを起動させたりするワケだが、Oracle ACC の場合はアプリケーション・マニフェストと呼ばれるファイルで起動コマンドを定義する必要がある。
$ touch manifest.json
manifest.json
{
"runtime": {
"majorVersion": "8"
},
"command": "node ./index.js",
"release": {},
"notes": "Practice ACC"
}
runtime
が Node.js のバージョン、command
に起動用コマンドを指定する。"command": "npm start"
と書きたいところだが、ACC の VM (仮想環境) 内で、ディレクトリパスが上手く解決できないことがあるので、npm start
スクリプトとして記述した内容をそのまま書いてしまうのが安全だと思われる。
アプリケーション・アーカイブの作成
資材の準備ができたら、これらを Zip ファイルにまとめる。
Heroku と違って、Oracle ACC はデプロイ時に npm install
などを実行してくれないので、アップロードする資材に node_modules/
ディレクトリを含めておく必要がある。また、ココでは MacOS に同梱の zip
コマンドを使っているが、解凍時にトップレベルにディレクトリが出来ないように圧縮する必要があるので注意。
デプロイ時に Cannot find module '/u01/index.js'
などのようなエラーが発生する場合は、圧縮時のディレクトリ階層が正しくないか、node_modules/
の準備が出来ていないことが主な原因である。直前に npm install
を実行したか、zip
コマンドによる圧縮時の階層構造は正しいか確認すること。
# 作業用ディレクトリのプロジェクトディレクトリ直下に移動すること
$ cd practice-acc/
# 資材を圧縮する
$ zip -r my-project.zip package.json index.js node_modules/
# 以下のようにプロジェクトルート直下のファイルが直接格納されていること
adding: package.json (deflated 34%)
adding: index.js (deflated 34%)
# 以下略
アプリをデプロイする
Oracle ACC のインスタンス詳細画面に異動し、「デプロイメント」メニューを選ぶ。「デプロイ済アプリケーション」欄の右側にある「更新」ボタンを押下すると、アップロード欄が表示される。
- 「アーカイブ:」欄に、前述の圧縮した Zip ファイル
- 「マニフェスト構成:」に、前述の
manifest.json
ファイル
を指定する。
manifest.json
が正しく読み込まれれると、「ランタイム」欄の「起動コマンド:」が変化するはずなので、コレを確認して「編集の適用」ボタンを押下する。
あとは4・5分待つとデプロイが完了するので、index.js
で定義した以下の URL パスにアクセスしてみよう。
https://【アプリ名】-【テナント名】.【リージョン名】.oraclecloud.com:443/
→Hello World
と表示されるはずhttps://【アプリ名】-【テナント名】.【リージョン名】.oraclecloud.com:443/test
→Hello World Test
と表示されるはず
なお、デプロイしたファイルに問題があった場合は、自動的に直前の資材にロールバックされる。
動作ログを見るには
アプリ中で console.log()
で標準出力に出力した内容は、アプリログとして参照できる。
インスタンス詳細画面の「管理」項目を押下し、「ログ」タブを押下すると、ログファイルの Zip ファイルがダウンロードできる。
…コレが物凄く使いづらい。ログファイルは適当な間隔で1つの Zip ファイルにまとまっていて、コレをダウンロードすることでしか、動作ログを確認できない。リアルタイムに tail -f
するような仕組みはないので、諦めよう。
参考資料
- Oracle Application Container Cloud Service: Building a RESTful API with Node.js and Express
- Deploy a Node.js application to Oracle Application Container Cloud Service | Learn Code Share
zip -x "node_modules/oracledb/*"
- Deploy a Node.js Application to Oracle Cloud
- Oracle Application Container Cloud Service を使ってみた - Qiita
- Create the manifest.json File
- Deploying an Application to Oracle Application Container Cloud Service
- Create the deployment.json File
- Explore the Application Deployments Page