静态对象存储的意思就是,和FTP差很少,只能上传、下载、删除,不能修改、更新,更不能存动态数据库一类的东西。
虽然仍是有不少差异,可是S3和CDN差很少。nginx
为何不选择能够当硬盘同样随便操做的EBS而是用静态对象存储的S3呢?web
Cost 花销计算
S3同样传承了AWS复杂的Cost Calculation。数据库
每个月须要上缴的费用主要是这3部分的总和:apache
⓵ 数据所占的容量:服务器
⓶ API请求数量:app
⓷ 数据传输费用:优化
几种我的常见案例(月):ui
也就是说,API请求很是便宜,数据传输能够经过EC2内部传输的免费额度来省钱,最贵的是数据存储费用。这样来算,我的直接用Glacier最划算。.net
其中比较乱的是传输费用。code
Cost优化
参考:Optimizing Costs for S3
参考:10 Things You Might Not Know About Using S3
登陆AWS进入S3 -> create bucket -> 建立S3全网惟一名称 -> 默认选项 -> 选择公开数据的浏览权限 -> 完成建立Bucket。
过程十分简单,就不截图占地方了。以后均可以修改,填错了也没问题。
下一步:获取secret_key
,用于以后各类访问。
进入官网: Security Credential
建立key:
选择左侧User -> 为s3建立专门的用户(IAM) -> 输入名称、密码 -> 成功后,获取这个用户独有的key pair -> 记住key pair。
用s3fs将S3挂载为本地文件夹
Map S3 as local drive注意:Public access
权限必须设置成Everyone
,要否则没法从各类程序访问。
进入bucket的管理后台,选择Permissions
,而后设置Public access
.
具体步骤参考:
# https://cloud.netapp.com/blog/amazon-s3-as-a-file-system sudo apt-get install -y s3fs # Change key pairs to yours echo ACCESS_KEY:SECRET_KEY > ~/.passwd-s3fs chmod 600 ~/.passwd-s3fs mkdir ~/s3-drive # Mount the aws S3 bucket (replace your uid and gid) /usr/bin/s3fs Your-Bucket-Name ~/s3-drive -o umask=0007,uid=1000,gid=1000 # Show all the mounted devices mount # Show what's in the bucket ls ~/s3-drive
s3fs的文件读取权限问题
注意,S3的权限问题十分严格。并且每一个文件的权限都有可能不同。
若是是网页上传的,有可能和本地s3fs上传的权限不一样,这样就不能互通操做。可是一旦用s3fs
上传所有的文件,那么权限就都是统一的。
一旦文件权限没有统一,那么就会在访问时出现No such file
或Permission denied
问题。
目前解决方案有两种:
x-amz-meta-(mode,mtime,uid,gid)
umask
, uid
, gid
。如-o umask=0007,uid=1000,gid=1000
有几点须要注意:
如何修改header: x-amz-meta-
?
在后台文件管理界面,批量选择文件,而后点Actions,点change metadata,选择x-ama-meta-
,输入对应value。
将S3做为Webdav服务器
搜遍了全网,都没找到靠谱的S3转Webdav服务器方案,差点就本身写Webdav的protocol实现了。还好,通过各类换词搜索,灵机一动,换了种思路:可不能够先把S3映射为本地drive,而后再正常把本地drive共享为webdav?
答案是:能够的。
具体作法就是:用s3fs
映射到本地文件夹,再用wsgidav
或apache或nginx将文件夹共享为webdav服务器。亲测可用,并且十分好用。由于同属AWS资源,同属一个Region区,因此访问速度和访问EBS硬盘感觉不到什么区别。