簡體   English   中英

AWS彈性beanstalk部署失敗,出現ENOMEM錯誤

[英]AWS elastic beanstalk deploy fails with ENOMEM error

您的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步:明顯的選擇......

  • 使用更大的實例,它的工作原理......

  • 不要修理,再試一次

    • 再次部署,它的工作原理......

    • 克隆環境,它的工作原理......

    • 重建環境,它的工作....

  • 感覺又臟又錯

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

從/更多細節: 如何將交換添加到EC2實例?

在部署期間,我們使用了一點SWAP,但沒有崩潰

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

實際分辨率

更大的例子

  • 雖然可以通過EBS擴展存儲,但實例附帶固定的CPU和RAM, AWS源
  • 花錢,這些只是開發實例,其中mem只是一個問題

在ElasticBeanStalk中自動配置交換

  • 可能.ebextensions/
  • 開放性問題:雲形成風格還是部署/重啟時的鈎子?

加入“無服務器”的潮流

  • API Gateway + Lambda + Friends的承諾是我們不應該處理這個問題。
  • 對於雲原生的微服務,你“夠高”嗎? 它們甚至適合您的問題,當像SOA這樣的穩定​​/不時尚的東西就足夠了。
  • 一旦進入雲端,恢復到本地將是困難的,這是一些要求。

使用較少膨脹的包

  • 有時你會被遺留下來
  • 可能由必要的傳遞或子依賴性引起。 它在哪里結束......分解其他人的圖書館?

說明

一個快速的谷歌揭示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

下次打勾時內存不足)

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

我們很少會在開發中使用這個數量; 但是,ElasticBeanstalk通過衍生的工作程序並行化部分構建過程。 這意味着在SETUP期間,對於較大的包,可能會耗盡內存並且操作將失敗。

這正是我發生的事情! 我的node.js服務器在我的dev ec2 t2-micro上運行良好,但是當我在彈性beanstalk(也有t2-micro)上部署了一個臨時環境時,出現了這個錯誤,將eb實例更改為t2-small就是這個技巧。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM