chakokuのブログ(rev4)

日々のごった煮ブログです

AWSでNode.js + Scratch 3.0を動かす->動くには動いたがWebAPI連携で問題があり却下

IoT勉強会で拡張機能付きScratch3.0を使ってもらう予定。各自のラスパイでScratchをうごかしてもらってもいいのだが、ビルドに時間がかかるので、あらかじめAWS上でScratchを走らせておいてAWSから持って行ってもらう方がいいのでは?と思い試作中

curl -sL https://rpm.nodesource.com/setup_8.x | sudo bash -
sudo yum install -y nodejs
sudo yum install -y npm
sudo npm install -g yarn

なにかと問題になるchromedriverでエラーが発生、

45340 verbose stack     at EventEmitter.<anonymous> (/usr/lib/node_modules/npm/node_modules/npm-lifecycle/index.
js:332:16)
45340 verbose stack     at emitTwo (events.js:126:13)
45340 verbose stack     at EventEmitter.emit (events.js:214:7)
45340 verbose stack     at ChildProcess.<anonymous> (/usr/lib/node_modules/npm/node_modules/npm-lifecycle/lib/sp
awn.js:55:14)
45340 verbose stack     at emitTwo (events.js:126:13)
45340 verbose stack     at ChildProcess.emit (events.js:214:7)
45340 verbose stack     at maybeClose (internal/child_process.js:915:16)
45340 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:209:5)
45341 verbose pkgid chromedriver@90.0.1
45342 verbose cwd /home/ec2-user/lang/js/Scratch/scratch-gui
45343 verbose Linux 5.10.75-79.358.amzn2.x86_64
45344 verbose argv "/usr/bin/node" "/usr/bin/npm" "i"
45345 verbose node v8.17.0
45346 verbose npm  v6.13.4
45347 error code ELIFECYCLE
45348 error errno 1
45349 error chromedriver@90.0.1 install: `node install.js`
45349 error Exit status 1
45350 error Failed at the chromedriver@90.0.1 install script.
45350 error This is probably not a problem with npm. There is likely additional logging output above.
45351 verbose exit [ 1, true ]

手当が面倒なので、依存リストから外す

$ diff package.json_org  package.json
107d106
<     "chromedriver": "90.0.1",

ec2-user権限だと、npm linkで権限エラーになるのでこの行だけsudoで権限付与

mkdir Scratch ; cd Scratch
git clone --depth 1 https://github.com/llk/scratch-vm.git
git clone --depth 1 https://github.com/llk/scratch-gui.git
cd scratch-vm
npm i
sudo npm link  #npm link  
cd ../scratch-gui
npm i
npm link scratch-vm
npm start

起動したが途中でプロセスがkillされるなぜなんだろうか??

$ npm start > /tmp/exec_log 2>&1
Killed

oom-killされていた。メモリを使い果たしていた。。

[ 3628.291624] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/,task=node,pid=2089,uid=0
[ 3628.302154] Out of memory: Killed process 2089 (node) total-vm:2017820kB, anon-rss:805048kB, file-rss:88kB, shmem-rss:0kB, UID:0 pgtables:10204kB oom_score_adj:0
[ 3628.353757] oom_reaper: reaped process 2089 (node), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

うーむ。一番安いt2.microにしたせいか。

# free -h
              total        used        free      shared  buff/cache   available
Mem:           965M         82M        829M        488K         53M        786M
Swap:            0B          0B          0B

メモリが足りないからインスタンスタイプを上げよう。。なんてそのまま仕事やないかと思いながら、、、一つ上に上げてみる。無事起動できた。ちなみに、t2.smallの場合、実装が2Gで、約800MB使っていて、空きが800MB

# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        790M        803M        400K        378M        1.0G
Swap:            0B          0B          0B

無事Scratchサービスが立ち上がって、8601番ポートでListenしている。ただ、EC2のENI(Network Interface)にはセキュリティのためのアクセス制限がかかっている。SecurityGroupで最初は22番しかあいていないので、Scratch用のポート、8601を開ける。理想的には接続許可IPを自宅のGlobalIPのみ接続にしておければ他から接続されることはない(のだが、、自宅は固定IPではないので、、)。

AWSに接続してScratch3.0を動かしている画面、(お金がかかるので確認を終えたら止めました)

ちなみに、t2.smallのオンデマンド料金は、0.023 USD/Hour
1時間動かしたら2.6円、一日だと63円、一月なら1933円、

LambdaでもNode.jsが動くらしいが、、やったことなくていろいろハマりそうなので、障壁の低いEC2で動かすことにした。

■メモ
UTC->JSTへの変更

sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
vi /etc/sysconfig/clock
-------------------------
ZONE="Asia/Tokyo"
UTC=False
-------------------------

当初、yarnでパッケージを入れていたがインストール途中でエラーが発生したため、npmによるインストールにした

■顛末
ローカルのRPiで動かすと起動が遅いと考えてAWS上でScratch3.0を動かすように取り組んだ。普通の動作なら問題ないのだが、拡張機能でWebAPIの連携を実装しており、ローカル環境で動作するWebAPIを呼び出そうとすると通信エラーが発生した。WebAPIの呼び出しはScratch3.0が動作しているブラウザ上のJavaScriptから行われていると思っていたが、Node.js側から接続に行っているのだろうか??ブラウザ側の処理とサーバ側の処理がどのように分担されているのか?よくわからず。
結局当初予定だった、RPi上でScratch3.0を起動してもらう方針に戻した。