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」を選択する。

次のダイアログで、早速アプリケーションをアップロードできるのだが、まずは動作確認も兼ねて、サンプルアプリをデプロイさせてみる。

「作成」ボタンを押下すると、インスタンスの生成が開始される。インスタンス一覧から対象のインスタンスを選択し、インスタンス詳細画面に移動すると、デプロイ状況が確認できる。

5〜10分くらいすると、インスタンスの生成とサンプルアプリのデプロイが完了する。インスタンス詳細画面にて、次のような書式の URL が確認できると思うので、コレにアクセスしてみよう。

サンプルアプリは「Oracle Application Container Cloud Service」という見出しのペライチサイトが表示されるのみだが、内部的には ejs パッケージを利用して実装されており、Node.js アプリが動作している。

アプリケーションの作成

続いて、デプロイするアプリケーションを作成する。

$ mkdir practice-acc && cd $_
$ npm init -y

# サンプルとして Express をインストールする
$ npm install -S express

# エントリポイントの生成
$ touch 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
{
  "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 のインスタンス詳細画面に異動し、「デプロイメント」メニューを選ぶ。「デプロイ済アプリケーション」欄の右側にある「更新」ボタンを押下すると、アップロード欄が表示される。

を指定する。

manifest.json が正しく読み込まれれると、「ランタイム」欄の「起動コマンド:」が変化するはずなので、コレを確認して「編集の適用」ボタンを押下する。

あとは4・5分待つとデプロイが完了するので、index.js で定義した以下の URL パスにアクセスしてみよう。

なお、デプロイしたファイルに問題があった場合は、自動的に直前の資材にロールバックされる。

動作ログを見るには

アプリ中で console.log() で標準出力に出力した内容は、アプリログとして参照できる。

インスタンス詳細画面の「管理」項目を押下し、「ログ」タブを押下すると、ログファイルの Zip ファイルがダウンロードできる。

…コレが物凄く使いづらい。ログファイルは適当な間隔で1つの Zip ファイルにまとまっていて、コレをダウンロードすることでしか、動作ログを確認できない。リアルタイムに tail -f するような仕組みはないので、諦めよう。

参考資料