先日AWS東京リージョンで障害が発生したニュースが騒がれましたが、それと前後して個人的にはIBM Cloud に障害が発生しました。インフラアップデートに伴い、2年前に作成したCloud Foundry アプリのNode.jsのバージョンがサポート外となったためアプリが起動しなくなったのですが、解決に1週間ほどかかりましたので、教訓のためにも顛末を残します。
障害
(1) Cloud Foundry appが起動しなくなった
アプリのWebにアクセスできないなと思い、ステータスを確認したら「未実行」となっており、再起動を繰り返していました。
(2) Node-Red Editorも起動しなくなった
CFアプリはNode-Redで開発ができるのが手軽で良いところですが、肝心のNode-Redエディタも起動されていません。CFアプリの一部ですから当然かもしれませんが、この時点でかなりヤバイ感を感じました。
WebブラウザでNode-Red エディタにアクセスすると404エラーです。
404 Not Found: Requested route (‘iot-xxxxxxxxxxxx.mybluemix.net’) does not exist.
(3) Webコンソールからのアプリのデプロイができない
対応作業中に判明しました。package.jsonファイルを修正した後に、Webコンソールだと再プッシュができない。
CLIでは pushできましたのでWebコンソール側の問題です。
$ ibmcloud cf push app_name
経緯
2017-02: Cloud Foundry App を3個作成。1個は継続してテスト運用、2個は時々起動。appはすべてIoTアプリ (Internet of Things Platform)
2019-06-12: IBM Cloudからupdateのお知らせが通知される。
IBM Cloud Foundry Public Now Supports cflinuxfs3
2019-06-30: 以降 IBM Cloud Foundry Publicで順次cflinuxfs3へのupdateが開始される。
2019-08-中旬: 自分のアプリのリージョンでcflinuxfs3へのupdateが行われた模様。
2019-08-19: 障害発生。起動中のアプリのステータスが「未実行」となり、アプリのNode-Red編集画面にアクセスできないことに気付く。インスタンスの起動失敗と再起動を繰り返している。
カスタマーサポートへ問い合わせ開始。
2019-08-21: 停止していた他の2個のアプリも起動すると同じ問題が発生。これで全てのアプリが使用できない状態となった。
2019-08-22: 使用しているNode.jsのバージョンがv4.xであり、cflinuxv3へのアップデート後はサポート外となるため起動に失敗していることが判明。
2019-08-23: package.jsonファイルのNode.jsバージョン修正。デプロイを試みるもアプリには反映されない状況。
2019-08-26: CLIからのpushによりデプロイ成功、アプリが正常に起動した。
2019-08-27: Tool ChainのDeploy Stage設定にpushが含まれていないことが判明、作成時のままで現状では期待通りの動作がしない見込み。
2019-08-28: Deploy Stage設定を再構成してWebコンソールからもデプロイ(push)が実行されることを確認。
2019-08-28: CFアプリが起動することを確認。障害から復帰した。
要因
(1) Cloud Foundry (2)Node-Red が起動しなくなった
このCFアプリの設定はNode.jsのバージョンが v4.x でした。cflinuxfs3では4.xはサポート外なのでアプリの起動時に4.xをロードしようとしてエラーが発生し、アプリの起動を繰り返していました。
ログ抜粋
$ ibmcloud cf logs --recent ... 2019-08-22T12:24:19.97+0900 [CELL/0] OUT Starting health monitoring of container 2019-08-22T12:24:22.44+0900 [APP/PROC/WEB/0] OUT > iot-bluemix@0.5.3 start /home/vcap/app 2019-08-22T12:24:22.44+0900 [APP/PROC/WEB/0] OUT > node --max-old-space-size=384 node_modules/node-red/red.js --settings ./bluemix-settings.js -v 2019-08-22T12:24:22.87+0900 [APP/PROC/WEB/0] ERR /home/vcap/app/node_modules/node-red/node_modules/fs-extra/lib/fs/index.js:93 2019-08-22T12:24:22.87+0900 [APP/PROC/WEB/0] ERR exports.write = function (fd, buffer, ...args) { 2019-08-22T12:24:22.87+0900 [APP/PROC/WEB/0] ERR ^^^ 2019-08-22T12:24:22.87+0900 [APP/PROC/WEB/0] ERR SyntaxError: Unexpected token ... 2019-08-22T12:24:22.87+0900 [APP/PROC/WEB/0] ERR at exports.runInThisContext (vm.js:53:16) 2019-08-22T12:24:22.87+0900 [APP/PROC/WEB/0] ERR at Module._compile (module.js:373:25) 2019-08-22T12:24:22.87+0900 [APP/PROC/WEB/0] ERR at Object.Module._extensions..js (module.js:416:10) 2019-08-22T12:24:22.87+0900 [APP/PROC/WEB/0] ERR at Module.load (module.js:343:32) 2019-08-22T12:24:22.87+0900 [APP/PROC/WEB/0] ERR at Function.Module._load (module.js:300:12) 2019-08-22T12:24:22.87+0900 [APP/PROC/WEB/0] ERR at Module.require (module.js:353:17) 2019-08-22T12:24:22.87+0900 [APP/PROC/WEB/0] ERR at require (internal/module.js:12:17) 2019-08-22T12:24:22.87+0900 [APP/PROC/WEB/0] ERR at Object. (/home/vcap/app/node_modules/node-red/node_modules/fs-extra/lib/index.js:6:3) 2019-08-22T12:24:22.87+0900 [APP/PROC/WEB/0] ERR at Module._compile (module.js:409:26) 2019-08-22T12:24:22.87+0900 [APP/PROC/WEB/0] ERR at Object.Module._extensions..js (module.js:416:10) 2019-08-22T12:24:22.89+0900 [APP/PROC/WEB/0] ERR npm ERR! Linux 4.15.0-54-generic 2019-08-22T12:24:22.89+0900 [APP/PROC/WEB/0] ERR npm ERR! argv "/home/vcap/app/vendor/node/bin/node" "/home/vcap/app/vendor/node/bin/npm" "start" 2019-08-22T12:24:22.89+0900 [APP/PROC/WEB/0] ERR npm ERR! node v4.8.7 2019-08-22T12:24:22.89+0900 [APP/PROC/WEB/0] ERR npm ERR! npm v2.15.11 2019-08-22T12:24:22.89+0900 [APP/PROC/WEB/0] ERR npm ERR! code ELIFECYCLE 2019-08-22T12:24:22.89+0900 [APP/PROC/WEB/0] ERR npm ERR! iot-bluemix@0.5.3 start: `node --max-old-space-size=384 node_modules/node-red/red.js --settings ./bluemix-settings.js -v` 2019-08-22T12:24:22.89+0900 [APP/PROC/WEB/0] ERR npm ERR! Exit status 1 ...
2年も前にテンプレート(カタログ)から作成したんですが、当時はデフォルトで Node 4.x となっていたと思われます。理解していませんでした… orz
package.json
{ "name" : "iot-bluemix", "version" : "0.5.03", "dependencies": { "bcryptjs" : "2.x", ... <省略> "node-red-contrib-bluemix-hdfs":"0.x" }, "scripts": { "start": "node --max-old-space-size=384 node_modules/node-red/red.js --settings ./bluemix-settings.js -v" }, "engines": { "node": "4.x" } }
(3) Webコンソールからのアプリのデプロイができない
IBM CloudのWebコンソールからTool Chainを使用するとアプリのファイル一式をGitで管理し、変更をデプロイできます。いわゆるDevOpsの継続的Deliveryです。
このDeployment Stageのデプロイスクリプトが空欄になっていました。
従って、デプロイ処理をWebコンソールから自動、手動を問わず実行しても、実際に変更したpackage.jsonを含むアプリが再デプロイ(push)されていませんでした。
カスタマーサポートからは、下記スクリプトが設定されているはずと指摘がありました。ところがありません。空白です。
#!/bin/bash cf push "${CF_APP}" # View logs #cf logs "${CF_APP}" --recent
組織やスペースも空白でした。デプロイステージが「汎用 Cloud Foundry」になっているのですが、「IBM パブリック Cloud」に設定するべきのようです。
画面上部には
「この汎用 Cloud Foundry は、非推奨方式を使用して作成されました。これを使用し続ける場合には、この書部を削除し、作成し直してください。」
と警告が表示されています。
別のIBM Cloudアカウントで最近作成したCFアプリの設定を見て違いに気付きました。
なぜ?、いつの間に不具合に? ですが、
これもcflinuxfs3へのupdateに起因していたようです。
修正
Deploy Stageの修正
アプリのファイルを修正した際に正常に再デプロイされるように、先にデプロイステージを修正します。
(1) Cloud Foundry Type を ‘汎用 Cloud Foundry’ から ‘IBM パブリック Cloud’ へ変更。
(2) APIキーの入力を要求されるので作成して入力。
(3) デプロイスクリプトを追加。
#!/bin/bash cf push "${CF_APP}" # View logs #cf logs "${CF_APP}" --recent
package.json の Node.jsのバージョン変更
Tool ChainからEclipse IDEでpackage.jsonを編集
package.json
{ ... "engines": { "node": "6.x" } }
Gitに連携しているので、編集後 git commitとgit push を行います。
Tool Chainで Build Stage と Deploy Stage が自動的に実行されCFアプリが再デプロイされて起動されます。
参考: IBM Cloud Command Line Interface
Webコンソールで行う操作と同じ処理をCLIでも行えます。今回の処理に必要な主なコマンドは以下の通りです。
ログイン $ ibmcloud login ターゲットの設定 $ ibmcloud target -g default ターゲットの確認 $ ibmcloud target --cf アプリ一覧 $ ibmcloud cf apps サービス一覧 $ ibmcloud cf services アプリのステータス等の確認 $ ibmcloud cf app app_name $ ibmcloud cf events app_name $ ibmcloud cf logs app_name --recent アプリの開始/停止 $ ibmcloud cf [start|stop] app_name アプリのデプロイ(アプリファイルをローカルにダウンロード要) $ ibmcloud cf push app_name
CLIでCFアプリの修正とデプロイ方法
Tool ChainのEclopse IDEやDelivery Pipelineの代わりにローカルへダウンロードして編集、デプロイをCLIで実行することも可能です。
アプリをローカルへダウンロード(git clone) 対象ファイルの編集とgit commit、git push アプリのデプロイ $ ibmcloud cf push app_name
まとめ
テスト用環境のため緊急性はなかったのですが、復旧まで1週間程度要した上に、複数のすべてのアプリが起動しなくなり一時はかなり焦りました。
IBM Cloud の Cloud Foundryはカタログから作成後、Node-Redエディタでアプリを開発できるので非常に簡単にアプリを立ち上げることができます。
今回そこに甘えてバックグラウンドの設定や仕組みを理解しないまま使用し続けていたところ、インフラのアップデートにより、古いコンポーネントのバージョンが合わなくなるという
障害事例になってしまいました。
だからと言って、IBM Cloudの問題でもAWS、Azure、GCPが良い訳でもなく、インフラのアップデートで何かの問題が起きるのは常です。
Deployを自動化する仕組みはあるにしてもそれも動作しないこともある訳で、
実際に障害が発生して初めて気づくことも多く、限られたリソースで事前にどれだけ想定できるのかと言えば「無理です」としか言えず。
明確な答えはないまま今日も悩ましくも運用するしかないのですね。
ともあれ、Cloud Foundry の知見は上がりました。
そうこうしている間にこんな通知が来ました。今度はログ機能のupdateらしいのですがさてこれにはどう対応するべきか。
IBM Log Analysis with LogDNA for IBM Cloud Foundry Public Applications