CloudFront服务发布

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

首先第一步先建立bukcet, 例如名称可以叫www.mindg.cn,具体建立过程就不说了,不管用web console还是用API都很简单,我们来进入下一步,因为是要对方访问,所以需要建立一个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.mindg.cn/*”,
           “arn:aws:s3:::www.mindg.cn”
      ]
    }
  ]
}

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

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

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

Alternate Domain Names
(CNAMEs)

这个框里把将来要解析的域名写上,例如www.mindg.cn

到这里基本大功告成了,接下来测试下上传的文件吧,咦?怎么报没有权限呢,直接在S3中打开也是报没权限,好吧,我们其实还差一步,因为默认放到bucket里的文件是隐私的设置,其他人是无法访问的,这么一说你可能就明白了,可反过来一想困难又来了,我已经上传了上千个图片了,或者以后我每上传的文件都要手工设置成公共模式吗,哦,NO,上帝救救我,,呵呵。。其实大可不必,其实再给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.mindg.cn/*”
}
]
}

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