使用 Carrierwave 與 Figaro套件,在Heroku 部署 Rails 專案結合 AWS S3 存放上傳圖片
從 5 月初開始,為了一直要在 Heroku 上,上傳照片時圖檔會同時存放到 AWS S3 上,花了將近一個月研究及解決錯誤,甚至還把 Rails 版本從 5.1.6 升級到 5.2 使用 Acvive storge 的功能,還是會出現各種錯誤,最後終於成功設定。
說明:
- Carrierwave 所使用 AWS S3 的功能,會跟 Rails 5.2 內建的 Acvive storge 功能衝突,請二擇一。
- 在這裡不特別講AWS S3 功能及如何使用,在網路上已有許多教學。
實作步驟大概如下:
第一階段:使用 Carrierwave Gem:
Step1:透過 Carrierwave 官網可以看到,要安裝 Fog-aws 此套件。
Step2:這裡有一點要注意的是官網是寫到要把程式碼放在lib/carrierwave/storage/fog.rb裡,但是經過實驗與上網爬文之後,實際上是要放在 config/initializers/carrierwave.rb(自己新增)裡。
跟官網不同的是,增加一段判別的方式。而這邊紀錄一下個人的實作經驗,我自己的專案是想實作圖片上傳的功能,在開發時,是把檔案存在本地端,也就是public/uploads底下,而部署之後希望能放到S3上。
因此改寫程式碼為:
第二階段:使用 Figaro Gem:
在和其它網站連結時,需要載入申請的 password or key。如果我們把密碼直接寫在程式碼中,哪麼很有可能會被洩漏。這樣對網站和使用者資訊都是不安全的。
Figaro 是一個方便管理機密資訊、密碼的 Gem,並且能一個指令就將機密資訊同步到 Heroku 上。
基本原理是:
- 把密碼儲存在一個不被 git 紀錄的 yml 文件中。
- 密碼資訊在運作時被載入到 ENV[] 的環境變數中。
- 需要使用密碼的程式碼,通過 ENV[] 環境變數來獲得密碼,而不是直接寫在程式碼中。
Step3:先安装,老步驟
寫入 Gemfile
執行 bundle install
執行figaro install
這個步驟其實就是生成一個 config/application.yml 的文件,並自動寫入 .gitignore 中。
Step4:配置
配置完後,使用時在程式碼出載入 ENV[] 就可以得到配置好的密碼。
舉例,我需要 AWS 的 key,程式碼中就寫為 (可參考圖三程式碼):
部署到 Heroku
Step5:部署到 heroku 上除了基本的部署指令之外,還需要做一個設定,否則配置的密碼不會生效。
Step6:另外可以使用以下的程式碼來檢查環境配置是否生效:
- 先輸入 heroku config 確認
- 再輸入heroku run rails c,跑 ENV[“AWS_ACCESS_KEY_ID”]、ENV[“AWS_SECRET_ACCESS_KEY”]、ENV[“AWS_REGION”] 及 ENV[“S3_BUCKET_NAME”]
- 以上如有分別顯示相對應的密碼及名稱,恭喜您設定完成了。
Step7:這樣應該就沒問題了,到專案網址試著上傳圖片後,再到AWS確認看看吧~