AWS弹性beanstalk部署失败,出现ENOMEM错误

时间:2017-04-21 19:23:55

标签: node.js amazon-web-services out-of-memory elastic-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步:Google提供适当的快照日志文件...

/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步:明显的选择......

  • 使用更大的实例,它可以工作......

  • 不要修复,再试一次

    • 再次部署并且有效......

    • 克隆环境并且有效......

    • 重建环境,它有效....

  • 感觉又脏又错误

2 个答案:

答案 0 :(得分:13)

TL; DR

您的实例(在我的情况下为t2.micro)内存不足,因为实例启动是并行化的。

黑客攻击解决方案:在实例上提供SWAP空间并重试

一次性,登录实例...

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

来自/更多详情:How do you add swap to an EC2 instance?

在部署期间,我们使用了一点SWAP,但没有崩溃

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

实际分辨率

更大的实例

  • 虽然存储可以通过EBS进行扩展,但是实例带有固定的CPU和RAM,AWS source
  • 花钱,这些只是dev实例,其中mem只是在启动时出现问题

在ElasticBeanStalk中自动配置交换

  • 可能.ebextensions/
  • 开放性问题:云形成风格还是部署/重启时的挂钩?

跳上“无服务器”&#39;行列

  • API Gateway + Lambda + Friends的承诺是我们不应该处理这个问题。
  • 你是否足够高&#39;对于云原生微服务?它们甚至适合您的问题,当像SOA这样的稳定​​/不时尚的东西就足够了。
  • 一旦进入云端,恢复到本地将很困难,这是一些要求。

使用较少膨胀的套餐

  • 有时你会陷入遗产
  • 可能由必要的传递或子依赖性引起。它在哪里结束......分解其他人的图书馆?

说明

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

我们很少会在dev上使用这个数量;但是,ElasticBeanstalk通过衍生的工作程序并行化部分构建过程。这意味着在 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

答案 1 :(得分:1)

  

我们很少会在dev上使用这个数量;但是,ElasticBeanstalk通过衍生的工作程序并行化部分构建过程。这意味着在SETUP期间,对于较大的包,可能会耗尽内存并且操作将失败。

这正是我发生的事情!我的node.js服务器在我的dev ec2 t2-micro上运行良好,但是当我在弹性beanstalk(也有t2-micro)上部署了一个staging环境时出现了这个错误,将eb实例更改为t2-small就是这个技巧。 / p>