+86 135 410 16684Mon. - Fri. 10:00-22:00

CloudFront服务发布方法总结

CloudFront服务发布

CloudFront服务发布方法总结

最近公司接到一客户要在海外上新业务,采用了亚马逊的CloudFront服务,源站采用的是S3服务,这也是亚马逊推荐的成熟架构,因为这次是合作,所以源站的数据主要是由对方上传,所以需要建一个bucket,给对方设置好上传下载的权限即可,基本需求就是这样,我们看来如何完成:

首先第一步先建立bukcet, 例如名称可以叫www.awsok.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.awsok.com/*”,
           “arn:aws:s3:::www.awsok.com”
      ]
    }
  ]
}

这样设置完是否OK呢,当然给这么大的权限,是肯定没问题的,不过有一个条件,就是如果你的S3只有一个bucket,这样设置是没有问题的,但如 果你还有其他bucket,比如awsok.com,那么这么设置完,这个用户也是可以看到的,只是没权限操作而已,当然我不想让对方看到我有多 少bucket的,所以我进行了修改,最后的policy如下:

{
“Statement”: [
{
“Effect”: “Allow”,
“Action”: [
“s3:ListBucket”
],
“Resource”: [
“arn:aws:s3:::www.awsok.com”
] },
{
“Effect”: “Allow”,
“Action”: [
“s3:*”
],
“Resource”: [
“arn:aws:s3:::www.awsok.com/*”
] }
] }

经过这么设置,他就只能看自己的bucket了其它他是看不到的,不过通过awscli操作的时候,要显示的指定bucket的名,就是得跟上bucket名称。

以上完成,把key发给对方,对方就可以上传数据了,等上传完毕,然后建立发布(可以同步建发布,不必等数据上传完毕),建发布比较简单,只要注意 以下几点就可以了,缓存的过期时间要跟研发确定好,第二如果将来要需要域名CNAME到亚马逊建立发布后的CDN地址,就需要在

Alternate Domain Names
(CNAMEs)

这个框里把将来要解析的域名写上,例如www.awsok.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.awsok.com/*”
}
] }

再次访问上传的图片或文件,已可以正常访问了,本次需求完成。

接上篇,给合作方建好后,以为没事了,谁知过了2天,运营的人跑过来说也需要这个bucket的访问权限,只需要其中一个目录的上传删除权限 即可,而且研发方已经建好了目录,好吧,作为一个优秀的运维人员,咱们是来者不拒呀,开工,建IAM用户,细节不废话了,这里我们主要讲如何设置用户的 policy,建好用户后进入用户权限设置页,直接设置inline policy,json如下:

{
“Statement”: [
{
“Effect”: “Allow”,
“Action”: [
“s3:ListBucket”
],
“Resource”: [
“arn:aws:s3:::www.awsok.com”
] },
{
“Effect”: “Allow”,
“Action”: [
“s3:*”
],
“Resource”: [
“arn:aws:s3:::www.awsok.com/my/*”
] }
] }

这样就设置好了,因为运营基本都是技术小白,所以还得提供个操作S3的工具,研发那边指定要选择S3 Browser,不知为何,其实CloudBerryLab我也测试了,两种工具都可以,然后填入key,加入一个扩展的bucket(add external bucket), 输入

www.awsok.com/my

点创建就完成了,其他不用调整,运营人员就可以对这个目录有上传和删除权限了,如果上传后马上是访问不到的,没关系,稍等几分钟就可以访问了,可能是cdn需要同步的原因。

搞完运营,研发又来了,说*.json的文件不能缓存,我当时就很奇怪,不缓存的东西为毛放CDN上呢?我说为什么不直接放到nginx上处理这种 不变的文件,当时讨论了一大堆,还是要建不缓存机制,打开CloudFront页面,找到Invalidations,然后点击create invalidations, 输入:/*.json,点击创建即可,这样就不缓存以.json结尾的文件了,到此需求才全部结束。