AWS EC2 的主機從原本的 Ubuntu 18 升級到 20,但卻遇到無法成功部署的問題。如果你也有相同困擾,不妨參考我的作法試試看吧!

起因

某天晚上,在 Teams 上收到主管的訊息說:我好像不小心玩壞測試機了⋯⋯

隔天仔細一問,原來是因為主管在檢查各個專案的 EC2 主機是否有資安疑慮。
然後在主機上要下指令更新套件時,不小心去更新到主機系統,導致主機從原先的 Ubuntu 18 更新到 20 了!
但我們也都很納悶為什麼這樣升級完之後,Rails 程式無法順利被啟動,只好開始研究怎麼救活它了。

過程

起初,我們發現原因似乎是主機上的 Puma server 沒有順利運作啟用。
因此我們嘗試透過 Capistrano 重新部署程式,想看能不能藉此重新啟用它。
但經過幾次嘗試都失敗,只好再想看看其他解法。

接著主管想到,如果複製其他台主機來作為新的主機環境來讓我們能重新部署程式,應該可以吧?
我們測試環境的主機配置為:

  1. 一台主機 (A) 處理網頁連線
  2. 兩台主機 (B、C) 處理 Sidekiq 排程

由於被玩壞掉的是 A 主機,所以主管幫忙複製 B 主機產生出 D 主機。
不過我猜測這樣複製出來的 D 主機配置,會與原先 A 主機的不同,進而導致部署可能失敗。
經過測試後,的確重新部署到 D 主機的環境也仍然失敗,看來還是先暫停採用這個解法好了。

就在下午休息放空的時候突然想到,這類型的問題應該不會只有我們遇到過才對吧?
會不會網路上有不少求救文章能幫助我解決 A 主機無法順利連線的問題?

產生這樣的想法後,便開始在 Stack Overflow 上爬文。
一查才發現,的確有人遇過這類型的問題[1],雖然提問者不是用 Ruby 環境而是 Python。
但看了文章內容後覺得挺有參考價值的,不妨試試看文章中的正解⋯⋯

咦?!居然成功了!🥳

總結

文章中的答案提到因為升級成 Ubuntu 20 時,系統的內建套件 libffi6 也一併升級成 libffi7 ,但原本安裝的 Python 設定仍然是會去找 libffi6

所以綜合大家所回覆的解法,建議將 Python 重新安裝一次,讓它能去吃到系統中新的 libffi7 就沒問題。
同理,我們也只要重新安裝 Ruby 即可!

參考資料


  1. Ubuntu 20.04 upgrade, Python missing libffi.so.6 ↩︎