AWS弹性beanstalk部署因ENOMEM错误而失败

您的AWS Elastic Beanstalk部署失败: – 间歇性 – 没有真正明显的原因

第1步:检查明显的日志

/var/log/eb-activity.log

Running npm install: /opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/npm Setting npm config jobs to 1 npm config jobs set to 1 Running npm with --production flag Failed to run npm install. Snapshot logs for more details. Traceback (most recent call last): File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 695, in <module> main() File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 677, in main node_version_manager.run_npm_install(options.app_path) File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 136, in run_npm_install self.npm_install(bin_path, self.config_manager.get_container_config('app_staging_dir')) File "/opt/elasticbeanstalk/containerfiles/ebnode.py", line 180, in npm_install raise e subprocess.CalledProcessError: Command '['/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/npm', '--production', 'install']' returned non-zero exit status 1 (ElasticBeanstalk::ExternalInvocationError) caused by: + /opt/elasticbeanstalk/containerfiles/ebnode.py --action npm-install 

第2步:谷歌适当的快照日志文件…

/var/log/nodejs/npm-debug.log

 58089 verbose stack Error: spawn ENOMEM 58089 verbose stack at exports._errnoException (util.js:1022:11) 58089 verbose stack at ChildProcess.spawn (internal/child_process.js:313:11) 58089 verbose stack at exports.spawn (child_process.js:380:9) 58089 verbose stack at spawn (/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/lib/node_modules/npm/lib/utils/spawn.js:21:13) 58089 verbose stack at runCmd_ (/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/lib/node_modules/npm/lib/utils/lifecycle.js:247:14) 58089 verbose stack at /opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/lib/node_modules/npm/lib/utils/lifecycle.js:211:7 58089 verbose stack at _combinedTickCallback (internal/process/next_tick.js:67:7) 58089 verbose stack at process._tickCallback (internal/process/next_tick.js:98:9) 58090 verbose cwd /tmp/deployment/application 58091 error Linux 4.4.44-39.55.amzn1.x86_64 58092 error argv "/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/node" "/opt/elasticbeanstalk/node-install/node-v6.10.0-linux-x64/bin/npm" "--production" "install" 58093 error node v6.10.0 58094 error npm v3.10.10 58095 error code ENOMEM 58096 error errno ENOMEM 58097 error syscall spawn 58098 error spawn ENOMEM 

第3步:明显的select…

  • 使用更大的实例,它的工作原理…

  • 不要修复,只需再试一次

    • 再次部署,它工作…

    • 克隆环境,它工作…

    • 重build环境,它的工作….

  • 留下肮脏和错误

TL; DR

你的实例(在我的情况下是t2.micro)将耗尽内存,因为实例启动是并行的。

黑客解决scheme:在实例上configurationSWAP空间并重试

对于一次性login实例…

 sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024 sudo /sbin/mkswap /var/swap.1 sudo chmod 600 /var/swap.1 sudo /sbin/swapon /var/swap.1 

从/更多详细信息: 如何将交换添加到EC2实例?

在部署过程中,我们使用了一些SWAP,但没有崩溃

 Mem: 1019116k total, 840880k used, 178236k free, 15064k buffers Swap: 1048572k total, 12540k used, 1036032k free, 62440k cached 

实际的决议

更大的实例

  • 虽然存储可以通过EBS进行扩展,但实例还包含固定的CPU和RAM, AWS源 。
  • 成本的钱,这些只是开发实例,其中内存只是一个问题在旋转

在ElasticBeanStalk中自动configuration交换

  • 可能.ebextensions/
  • 打开问题:云阵风格还是挂钩部署/重启?

跳上“无服务器”的潮stream

  • API Gateway + Lambda + Friends的承诺是我们不应该处理这个问题。
  • 你对云本地微服务“够高”吗? 他们甚至适合你的问题,当像SOA这样僵硬/不合时宜的东西就足够了。
  • 一旦开始云计算,恢复到本地将是困难的,这是一些需求。

使用较less的软件包

  • 有时候你会被遗留下来
  • 可能由必要的传递或子依赖造成。 它在哪里结束…分解其他人的图书馆?

说明

快速谷歌显示ENOMEM是一个内存不足的错误。 t2.micro实例只有1 GB的RAM。

我们很less会在开发中使用这个数量。 然而,ElasticBeanstalk通过产生的工作者并行化部分构build过程。 这意味着在SETUP期间,对于较大的包,可能会耗尽内存,操作将失败。

使用free -m我们可以看到…

开始 (大量的可用内存)

  total used free shared buffers cached Mem: 1019116 609672 409444 144 45448 240064 -/+ buffers/cache: 324160 694956 Swap: 0 0 0 

在下一个滴答声中内存不足)

 Mem: 1019116 947232 71884 144 11544 81280 -/+ buffers/cache: 854408 164708 Swap: 0 0 0 

部署过程中止

  total used free shared buffers cached Mem: 1019116 411892 607224 144 13000 95460 -/+ buffers/cache: 303432 715684 Swap: 0 0 0 

我们很less会在开发中使用这个数量。 然而,ElasticBeanstalk通过产生的工作者并行化部分构build过程。 这意味着在SETUP期间,对于较大的包,可能会耗尽内存,操作将失败。

这正是我发生的事情! 我的node.js服务器在我的dev ec2 t2-micro上工作的很好,但是当我在弹性beanstalk上(也用t2-micro)部署了一个分段环境时,出现了这个错误,把这个eb实例改为t2-small。