AWS elastic beanstalk 部署失败并出现 ENOMEM 错误

AWS elastic beanstalk deploy fails with ENOMEM error

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

第一步:查看明显的日志

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

TL;DR

您的实例(t2.micro 在我的例子中)运行内存不足,因为实例旋转是并行的。

黑客解决方案:在实例上提供 SWAP space 并重试

对于一次性,同时登录实例...

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
  • 要花钱,这些只是内存只是在启动期间出现问题的开发实例

在 ElasticBeanStalk 中自动配置交换

  • 可能.ebextensions/
  • 未决问题:云形成式还是部署/重启挂钩?

加入'server-less'潮流

  • API Gateway + Lambda + Friends 的承诺是我们不必处理这个问题。
  • 您'tall enough' 支持云原生微服务吗?当像 SOA 这样的 staid/unfashionable 就足够时,它们是否适合您的问题。
  • 一旦转向云优先,恢复到本地将很困难,这对某些人来说是一个要求。

少用臃肿的包

  • 有时您会受困于遗留问题
  • 可能是由必要的传递依赖或子依赖引起的。它在哪里结束...分解别人的图书馆?

说明

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

我们很少会在开发上使用这个数量;但是,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

运行 下一次 tick 内存不足)

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

Rarely would we use this amount on dev; however, ElasticBeanstalk parallelizes parts of the build process through spawned workers. This means that during SETUP, for the larger packages, one may run out of memory and the operation will fail.

这正是我的遭遇!我的 node.js 服务器在我的开发 ec2 t2-micro 上运行良好,但是当我在弹性 beanstalk(也使用 t2-micro)上部署暂存环境时出现此错误,将 eb 实例更改为 t2-small 就可以了.