CloudFront服务发布方法总结
最近公司接到一客户要在海外上新业务,采用了亚马逊的CloudFront服务,源站采用的是S3服务,这也是亚马逊推荐的成熟架构,因为这次是合作,所以源站的数据主要是由对方上传,所以需要建一个bucket,给对方设置好上传下载的权限即可,基本需求就是这样,我们看来如何完成:
首先第一步先建立bukcet, 例如名称可以叫www.awsgood.com,具体建立过程就不说了,不管用web console还是用API都很简单,我们来进入下一步,因为是要对方访问,所以需so要建立一个IAM用户,建立过程也不多说了,需要注意的是不用给用户设 置密码,用户生成的key字符串一定要下载下来,因为亚马逊建用户时那个key页面只能看到一次,如果不下载以后在想得到就没可能了。
经过以上操作,bucket,iam用户都已经建立完毕,接下来我们来设置他们的policy,先设置用户的,用户直接设置INLINE的策略,因为要给bucket所有的权限,所有能给的全部给,这是我的第一版体policy设置:
{“Version”: “2012-10-17″,“Statement”: [{“Sid”: “Stmt1385176073000″,“Effect”: “Allow”,“Action”: [“s3:AbortMultipartUpload”,“s3:DeleteObject”,“s3:DeleteObjectVersion”,“s3:GetBucketAcl”,“s3:GetBucketLocation”,“s3:GetBucketLogging”,“s3:GetBucketNotification”,“s3:GetBucketPolicy”,“s3:GetBucketRequestPayment”,“s3:GetBucketVersioning”,“s3:GetBucketWebsite”,“s3:GetLifecycleConfiguration”,“s3:GetObject”,“s3:GetObjectAcl”,“s3:GetObjectTorrent”,“s3:GetObjectVersion”,“s3:GetObjectVersionAcl”,“s3:GetObjectVersionTorrent”,“s3:ListAllMyBuckets”,“s3:ListBucket”,“s3:ListBucketMultipartUploads”,“s3:ListBucketVersions”,“s3:ListMultipartUploadParts”,“s3:PutBucketAcl”,“s3:PutBucketLogging”,“s3:PutBucketNotification”,“s3:PutBucketPolicy”,“s3:PutBucketRequestPayment”,“s3:PutBucketVersioning”,“s3:PutBucketWebsite”,“s3:PutLifecycleConfiguration”,“s3:PutObject”,“s3:PutObjectAcl”,“s3:PutObjectVersionAcl”],“Resource”: [“arn:aws:s3:::www.awsgood.com/*”,“arn:aws:s3:::www.awsgood.com”]}]}
这样设置完是否OK呢,当然给这么大的权限,是肯定没问题的,不过有一个条件,就是如果你的S3只有一个bucket,这样设置是没有问题的,但如 果你还有其他bucket,比如awsgood.com,那么这么设置完,这个用户也是可以看到的,只是没权限操作而已,当然我不想让对方看到我有多 少bucket的,所以我进行了修改,最后的policy如下:
{
“Statement”: [
{
“Effect”: “Allow”,
“Action”: [
“s3:ListBucket”
],
“Resource”: [
“arn:aws:s3:::www.awsgood.com”
]
},
{
“Effect”: “Allow”,
“Action”: [
“s3:*”
],
“Resource”: [
“arn:aws:s3:::www.awsgood.com/*”
]
}
]
}
经过这么设置,他就只能看自己的bucket了其它他是看不到的,不过通过awscli操作的时候,要显示的指定bucket的名,就是得跟上bucket名称。
以上完成,把key发给对方,对方就可以上传数据了,等上传完毕,然后建立发布(可以同步建发布,不必等数据上传完毕),建发布比较简单,只要注意 以下几点就可以了,缓存的过期时间要跟研发确定好,第二如果将来要需要域名CNAME到亚马逊建立发布后的CDN地址,就需要在
Alternate Domain Names
(CNAMEs)
这个框里把将来要解析的域名写上,例如www.awsgood.com
到这里基本大功告成了,接下来测试下上传的文件吧,咦?怎么报没有权限呢,直接在S3中打开也是报没权限,好吧,我们其实还差一步,因为默认放到 bucket里的文件是隐私的设置,其他人是无法访问的,这么一说你可能就明白了,可反过来一想困难又来了,我已经上传了上千个图片了,或者以后我每上传 的文件都要手工设置成公共模式吗。其实大可不必,其实再给bucket设置一条策略即可(建议测试的时候就上传了一个文 件,全部测试好再上传真正的业务文件),找到bucket,右键–>属性,然后点Edit bucket policy,输入以下json字符:
{
“Version”: “2008-10-17″,
“Statement”: [
{
“Sid”: “AddPerm”,
“Effect”: “Allow”,
“Principal”: {
“AWS”: “*”
},
“Action”: “s3:GetObject”,
“Resource”: “arn:aws:s3:::www.awsgood.com/*”
}
] }
再次访问上传的图片或文件,已可以正常访问了,本次需求完成。
接上篇,给合作方建好后,以为没事了,谁知过了2天,运营的人跑过来说也需要这个bucket的访问权限,只需要其中一个目录的上传删除权限 即可,而且研发方已经建好了目录,好吧,作为一个优秀的运维人员,咱们是来者不拒呀,开工,建IAM用户,细节不废话了,这里我们主要讲如何设置用户的 policy,建好用户后进入用户权限设置页,直接设置inline policy,json如下:
{
“Statement”: [
{
“Effect”: “Allow”,
“Action”: [
“s3:ListBucket”
],
“Resource”: [
“arn:aws:s3:::www.awsgood.com”
]
},
{
“Effect”: “Allow”,
“Action”: [
“s3:*”
],
“Resource”: [
“arn:aws:s3:::www.awsgood.com/my/*”
]
}
]
}
这样就设置好了,因为运营基本都是技术小白,所以还得提供个操作S3的工具,研发那边指定要选择S3 Browser,不知为何,其实CloudBerryLab我也测试了,两种工具都可以,然后填入key,加入一个扩展的bucket(add external bucket), 输入
www.awsgood.com/my
点创建就完成了,其他不用调整,运营人员就可以对这个目录有上传和删除权限了,如果上传后马上是访问不到的,没关系,稍等几分钟就可以访问了,可能是cdn需要同步的原因。
搞完运营,研发又来了,说*.json的文件不能缓存,我当时就很奇怪,不缓存的东西为毛放CDN上呢?我说为什么不直接放到nginx上处理这种 不变的文件,当时讨论了一大堆,还是要建不缓存机制,打开CloudFront页面,找到Invalidations,然后点击create invalidations, 输入:/*.json,点击创建即可,这样就不缓存以.json结尾的文件了,到此需求才全部结束。