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 就可以了.
您的 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 就可以了.