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で動かすことにした。
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を起動してもらう方針に戻した。