Hugo で作ったサイトを CloudFront + S3 で公開する
2018-10-25Gatsby と同様に、CodeCommit に push したら CodeBuild でビルドして S3 にデプロイして公開される、というところまでを自動化します。
概要
基本的には Gatsby の場合 と同じなので、異なる部分について書いていきます。
やること
- S3 のバケットポリシーを変更
- CloudFront の Origin Domain Name を変更
- CodeBuild の環境、 Buildspec を変更
1. S3 のバケットポリシーを変更
まず、S3 のバケットポリシーを下記のように変更します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::{バケット名}/*"
}
]
}
Gatsby と Hugo の大きな違いとして、生成されるサイトがシングルページかどうか という点があります。
CloudFront で Default Root Object に index.html
を指定しておけば、https://michimani.net/
でのアクセスで https://michimani.net/index.html
が表示されます。
Gatsby ではここから画面遷移しないのでこれで問題なかったのですが、Hugo では https://michimani.net/post/some-post/
のような個別のページへ遷移することになります。この場合、https://michimani.net/post/some-post/index.html
が表示されるかと思いきや、Access Denied と言われてしまいます。
これを回避するために、バケットポリシーを上記のように変更します。
2. CloudFront の Origin Domain Name を変更
上記の問題解決に関連して、CloudFront の Origin Domain Name を変更します。
新しい値としては、S3 の Static website hosting で確認できるエンドポイントの http:// を除いた部分 です。
3. CodeBuild の環境、 Buildspec を変更
Hugo は Go 言語で作られているので、 CodeBuild の環境 (イメージ) を aws/codebuild/golang:1.10
に変更します。
また、ビルド時のコマンドも変わるため、 Buildspec を下記のように変更します。
version: 0.2
phases:
install:
commands:
- curl -Ls https://github.com/gohugoio/hugo/releases/download/v0.49/hugo_0.49_Linux-64bit.tar.gz -o /tmp/hugo.tar.gz
- tar xf /tmp/hugo.tar.gz -C /tmp
- mv /tmp/hugo /usr/bin/hugo
- rm -rf /tmp/hugo*
build:
commands:
- hugo
post_build:
commands:
- aws s3 sync "public/" "s3://{バケット名}" --delete --acl "public-read"
- aws cloudfront create-invalidation --distribution-id {ディストリビューションのID} --paths "/*"
また、Gatby の時には CodePipeline で Algolia のインデックスを削除するアクションを入れていましたが、これも削除します。
以上で Hugo の自動デプロイ環境が整いました。
push からデプロイまでのパイプライン全体の所要時間としては、Gatsby のときは 6〜7 分でしたが、Hugo では 3〜4 分 になりました。
このあたりにも Hugo ビルド速度の恩恵を感じられました。
comments powered by Disqus