使用 Carrierwave 與 Figaro套件,在Heroku 部署 Rails 專案結合 AWS S3 存放上傳圖片

vita shela
獨角獸之路
Published in
5 min readJun 25, 2018

從 5 月初開始,為了一直要在 Heroku 上,上傳照片時圖檔會同時存放到 AWS S3 上,花了將近一個月研究及解決錯誤,甚至還把 Rails 版本從 5.1.6 升級到 5.2 使用 Acvive storge 的功能,還是會出現各種錯誤,最後終於成功設定。

說明:

  1. Carrierwave 所使用 AWS S3 的功能,會跟 Rails 5.2 內建的 Acvive storge 功能衝突,請二擇一。
  2. 在這裡不特別講AWS S3 功能及如何使用,在網路上已有許多教學。

實作步驟大概如下:

第一階段:使用 Carrierwave Gem:

Step1:透過 Carrierwave 官網可以看到,要安裝 Fog-aws 此套件。

圖一、請透過https://rubygems.org/ 尋找此套件及安裝

Step2:這裡有一點要注意的是官網是寫到要把程式碼放在lib/carrierwave/storage/fog.rb裡,但是經過實驗與上網爬文之後,實際上是要放在 config/initializers/carrierwave.rb(自己新增)裡。

圖二、基本格式

跟官網不同的是,增加一段判別的方式。而這邊紀錄一下個人的實作經驗,我自己的專案是想實作圖片上傳的功能,在開發時,是把檔案存在本地端,也就是public/uploads底下,而部署之後希望能放到S3上。

因此改寫程式碼為:

圖三、路徑:config/initializers/carrierwave.rb
圖四、路徑:uploaders/photo_uploader.rb

第二階段:使用 Figaro Gem:

在和其它網站連結時,需要載入申請的 password or key。如果我們把密碼直接寫在程式碼中,哪麼很有可能會被洩漏。這樣對網站和使用者資訊都是不安全的。

Figaro 是一個方便管理機密資訊、密碼的 Gem,並且能一個指令就將機密資訊同步到 Heroku 上。

基本原理是:

  • 把密碼儲存在一個不被 git 紀錄的 yml 文件中。
  • 密碼資訊在運作時被載入到 ENV[] 的環境變數中。
  • 需要使用密碼的程式碼,通過 ENV[] 環境變數來獲得密碼,而不是直接寫在程式碼中。

Step3:先安装,老步驟

寫入 Gemfile

圖五

執行 bundle install

圖六

執行figaro install

圖七

這個步驟其實就是生成一個 config/application.yml 的文件,並自動寫入 .gitignore 中。

Step4:配置

圖八、配置就是在config/application.yml文件中填寫需載入的密碼

配置完後,使用時在程式碼出載入 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確認看看吧~

--

--

vita shela
獨角獸之路

在因緣際會之下接觸了Ruby,便覺得這個程式語言很有趣,而後又接觸了Rails 之後才發現,透過這兩者可以讓開發變得這麼有趣。就算是半路出家的我,也深深感受到開發的成就感及樂趣,我樂於學習及持續進步,希望有朝一日能成為同時精通前端設計和後端開發的工程師,因此正朝著全端開發的路上前進中。