[Ting's笔记Day7]活用套件carrierwave gem:(2)利用Amazon S3架设图片服务器

来到第7篇了!培养写做习惯真是不容易:)git

 

在个人上一篇文章活用套件carrierwave gem:(1)在Rails实现图片上传功能,上传图片功能已经完成啦!可是目前图片仅能上传在本身的本地文件夹内孤芳自赏。/images/emoticon/emoticon25.gifgithub

 

若是咱们要把网站完整的功能部署到正式环境,让其余网络使用者也能够一块儿上传图片,势必须要一个图片服务器。目前最主流的Image Host之一算是AWS(Amazon Web Service)里的S3(Simple Storage Service)了。安全

 

在这边咱们略过申请账号的过程(须要绑信用卡号,但只要在一年内不超过特定用量就可免费。)服务器

 

A.安装Fog-AWS Gem与Figaro Gem网络

为了串接carrierwave上传到Amazon S3的功能,咱们回到carrierwave gem在Github的页面Using Amazon S3这个段落好好研究。它要咱们在Gemfile里新增gem“fog-aws”,而后在carriewave/intializers下,新增一个档名称叫作carrierwave.rb,。数据结构

以它提供的示例程序上写的上来看(leafor):app

 

CarrierWave.configure do |config|less

config.fog_provider = 'fog/aws' #requiredide

config.fog_credentials = {学习

provider: 'AWS',#required

aws_access_key_id: 'xxx',

#required unless using use_iam_profile

aws_secret_access_key: 'yyy',

#required unless using use_iam_profile

use_iam_profile: true,#optional,defaults to false

region: 'eu-west-1',#optional,defaults to 'us-east-1'

host: 's3.example.com',#optional,defaults to nil

endpoint: 'https://s3.example.com:8080' #optional,defaults to nil

}

config.fog_directory = 'name_of_bucket' #required

config.fog_public = false #optional,defaults to true

从研读代码的过程当中,咱们很容易发现到了里面出现一个使用任何云端上传服务都会有的密钥及安全性的问题!如何避免以后代码备份到Github上,Access Key被全世界的人看光光?

 

[解决方案]

这时候咱们除了fog-aws,还要装一个gem叫作Figaro以解决上述问题。Figaro会帮咱们修改Rail的configuration档,用环境变数ENV代替密钥,并产生一个简单的YAML档。

 

YAML是一种写法优雅,适合表达、编辑数据结构与各类设定档的格式(注意:大小写和TAB键敏感!)。YAML近一步了解:Wiki|简书

 

如今咱们立刻来安装gem:

 

gem 'figaro'

gem“fog-aws”#用双引号,由于里面有特殊字元“-”

而后在terminal跑bundle install,

再重启服务器rails s(安装gem的三大步骤要牢记!)

 

这样咱们一次就装好了figaro和fog-aws两支gem。

 

接着,按照Figaro主页README.md档的指示,到terminal输入bundle exec figaro install:

 

tingdeMacBook-Air:yelpdemo tingtinghsu$ bundle exec figaro install

create config/application.yml

append .gitignore

这时候项目就会在config文件夹下产生了新的yml档:config/application.yml。

 

以后git push项目到git版控服务器如github,figaro这支gem会用.gitignore隐藏好application.yml,帮助咱们的私密数据没法被它人观看。

 

新手如我在修改代码的时候,经常看到一些新名词,例如刚刚的fog-aws,这时候去google一下定义,对于程序构架的理解是颇有帮助的。我很好奇为什么要用fog(雾?️?)这个名词。ITHome的这篇文章有提到:原来fog(雾运算)是相对于cloud(云计算)。

 

边缘运算是就近运算的概念,将运算更靠近数据源所在的本地区网(Local Network)内运算,尽量不用将数据回传云端,以减小数据往返云端的等待时间及下降网络频宽成本。边缘运算一般是在本地端和云端两边交界的附近作运算处理,也就是数据进出区网附近的位置,这么作的目的,在于既能够将运算环境放在本地,同时又能够靠近云端边界附近,借此跟云衔接。毕竟并非所有的数据都能放在本地端运算,仍是会有些须要更进一步分析及判断的数据,

 

B.在Amazon S3创建新的bucket

Amazon S3的bucket(储存桶)是相似云端文件夹(~雾端文件夹?)的概念。新手推荐

初期接触Amazon S3服务的板友们,我很建议去这个lab按照教学操做,内容设计互动上还挺有趣的~

 

1.进入Amazon S3 console,按下的create bucket创建bucket。

 

输入Bucket Name和Region(区域)。注意(bucket是个物件,你的bucket name必须是个unique name和世界上其余人的bucket name都不同)然指定一个区域(region),不一样区域的bucket对于使用者的上传下载速率有显著影响。(原来如此!难怪后文出现了卡bug。)我选了我目

前所在的城市Sydney。

 

在设定bucket的Permission页面时,一开始对于新手来讲,将bucket设定为public是较为容易的学习作法。(若是咱们的数据是极为隐密的,就千万不能这样作!)

 

2.在bucket内按upload上传一张图片(或任何档案),记下所在的host和region。

 

 

点开档案,能够看到每一个档案都会有属于本身的独特网址。

 

从这行网址,就能够确认主机s3-ap-southeast-2.amazonaws.com,区域是ap-southeast-2,这二者是咱们修改carrierwave.rb所须要的参数。

 

host:“s3-ap-southeast-2.amazonaws.com”,

region:“ap-southeast-2”

3.在Sercurity Credentials新增Access Key

在右上方点击咱们的账户,菜单上会出现Sercurity Credential(安全凭证)。按下以后,视窗会提醒你接下来的步骤要当心谨慎,按下Continue to Sercurity Credential后出现如下画面:

 

点选Create New Access Key,而后Download Key File能够下载新建好的Access Key。

 

C.到项目修改application.yml

咱们用记事本打开热腾腾刚打好的钥匙Access Key!在刚刚figaro帮咱们制做的application.yml,放入密钥id和access key。

 

pusher_app_id: '放个人id'

pusher_key: '放个人钥匙'

pusher_secret: '放个人秘密路径'

咱们使用的是Amazon S3,因此前面三个pusher修改成:

 

aws_access_key_id: '放个人刚刚建好的id'

aws_secret_access_key: '放我刚刚建好的key'

fog_directory: '个人Amazon S3 bucket名称'

以此类推,若是你使用Google Cloud,就要换成Google Cloud的变数和相对应的key。YAML对于任何多的空格space或tab都是敏感的,因此输入数据时要特别当心。

 

D.Config/initializers新增新档carrierwave.rb,代换参数,重启server。

在config/initializers/路径下,新增carrierwave.rb,将carrierwave提供给咱们代码贴过去修改,代换刚才提到figaro帮咱们作好的ENV[]环境变数:

 

CarrierWave.configure do |config|

config.fog_provider = 'fog/aws' # required

config.fog_credentials = {

provider: 'AWS',# required

aws_access_key_id: ENV[“aws_access_key_id”],

aws_secret_access_key: ENV[“aws_secret_access_key”],

host:“s3-ap-southeast-2.amazonaws.com”,

region:“ap-southeast-2”

}

config.fog_directory = ENV[“fog_directory”] # required

# optional,defaults to {}

end

这边咱们更动到了config档案,记得要重启服务器rails s。

 

[Bug注意!]

 

host:“s3-ap-southeast-2.amazonaws.com”,

region:“ap-southeast-2”

这两行要代换成你所选择的Amazon aws服务器主机区域,否则会产生问题(vmwork)!

 

后来我用关键字Excon::Errors::SocketError Broken pipe(Errno::EPIPE)参考了这篇网志终于搞定!

 

(跟Amazon S3相关功能的熟悉和随之而来的bug让我卡了两天/images/emoticon/emoticon14.gif)这篇文章的得来不易啊…。

 

C.修改carriewave的uploader.rb

去app/uploaders/image_uploader.rb,把storage:file加上注释,消去storage:fog的注释,让carriewave知道,如今咱们要把图片要上传到Amazon S3去。

 

class ImageUploader < CarrierWave::Uploader::Base

# Choose what kind of storage to use for this uploader:

# storage:file

storage:fog #Use Amazon S3

end

def store_dir

“uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}”

end

=大功告成!=

试着用本机功能的上传按钮传图片,再点开图片网址确认。

这张照片已经放入Amazon S3的bucket啰!

 

我很开心地修改3家餐厅的数据,去Amazon S3的bucket确认,图片已经安安稳稳地躺在路径/upload/restaurant/image/餐厅id里了。

 

下一篇要讲把上传Amazon S3的新功能Deploy部署到Heroku上!

相关文章
相关标签/搜索