最近在学习AWS服务,加之两次遇到github.io无法访问的情况,决定将博客迁移到AWS S3上。

S3介绍

S3是AWS一个对象存储服务,拥有11个9的耐久度和3个9的可用性(并不算高),属于AWS底层存储服务。同时提供Host静态网站的功能

第一步:创建一个Bucket

  • 进入S3界面,点击CreateBucket,取名为www.duyidong.com
  • 选择一个Region,你可以在这里找到延迟最低的Region用于存放你的博客
  • 设置Policy,确保外部可访问:

    {
     "Version": "2012-10-17",
     "Statement": [
         {
             "Sid": "PublicReadForGetBucketObjects",
             "Effect": "Allow",
             "Principal": "*",
             "Action": "s3:GetObject",
             "Resource": "arn:aws:s3:::www.duyidong.com/*"
         }
     ]
    }
    

    注: arn:aws:s3:::www.duyidong.com/*为bucket里对象的资源标识符

  • Properties下开启Static website hosting,设置入口文件为index.html,404页面为404/index.html

第二步:创建一个用于上传静态文件的用户

使用Policy Generator创建一个Policy

这里需要一个只有对www.duyidong.com这个bucket有上传权限的用户,首先要创建Policy,这里要用到Policy Generator。

  • 进入IAM -> Policies -> Create Policy -> Policy Generator
  • 选择S3的PutObject Action, ARN为目标Bucket的ARN,届时会生成如下Policy:

    注:经笔者反复试错,再参照官方文档,最终确定User Policy需要以下权限:

    {
    "Version":"2012-10-17",
    "Statement":[
       {
          "Effect":"Allow",
          "Action":[
             "s3:ListBucket",
             "s3:GetBucketLocation"
          ],
          "Resource":"arn:aws:s3:::www.duyidong.com"
       },
       {
          "Effect":"Allow",
          "Action":[
             "s3:PutObject",
             "s3:GetObject",
             "s3:DeleteObject"
          ],
          "Resource":"arn:aws:s3:::www.duyidong.com/*"
       }
    ]
    }
    

创建用户组

Groups -> Create New Group -> 将上一步创建的Policy attach到该UserGroup上,用户组创建完成。

创建用户

Users -> Add User,勾选Programmatic access,输入用户名,将用户加入到上一步创建的用户组中,将用户的Access key下载到本地。

第三步:安装插件,上传静态文件

  • 运行命令
npm install --save hexo-deployer-s3

编辑_config.yml:

deploy:
  type: s3
  bucket: <AWS bucket name>
  aws_key: <AWS id key>
  aws_secret: <AWS secret key>
  region: <AWS bucket region>

由于我会把博客源码放到Github上,Access key不能写在配置文件里,而采用环境变量的方式,在~/.bashrc中加入:

export AWS_ACCESS_KEY-ID=<access key>
export AWS_SECRET_ACCESS_KEY=<secret key>

再执行

source ~/.bashrc

届时将可以成功将博客发布到S3上,执行:

hexo d

其他

对比了一下Github和S3的速度,最大的一个页面github.io大概需要6-9秒,而S3要11秒左右,虽然github的速度不太稳定,但毕竟要比S3快,所以暂不把DNS指向S3,待日后开启CloudFront服务后再做决定。
另外,hexo是支持多路径发布的,形如:

deploy:
- type: git
  repo:
- type: heroku
  repo:

后续

要使用自己的域名,开启HTTPS,使用AWS的CND,参照:使用AWS解锁HTTPS和CDN