Open10
HugoをAWSで動かすためのメモ
ローカル
Dockerfile
FROM klakegg/hugo:0.101.0-ubuntu
RUN apt update && apt install -y git vim less tree
docker-compose.yaml
version: '3'
services:
hugo:
build: .
image: klakegg/hugo:0.101.0-ubuntu
volumes:
- ".:/src"
entrypoint: bash
ports:
- "1313:1313"
tty: true
working_dir: /src
インストール(papermod)
## プロジェクト作成
hugo new site quickstart
cd quickstart/
## テーマインストール
git clone https://github.com/adityatelange/hugo-PaperMod themes/PaperMod --depth=1
## 設定にテーマを追記
echo "theme = 'PaperMod'" >> hugo.toml
## サーバ起動
hugo server --bind 0.0.0.0
成功
OK!
記事を書く
## ページ追加
hugo new posts/my-first-post.md
cat content/posts/my-first-post.md
## 下書き(Drift)含めてビルド
hugo server --bind 0.0.0.0 -D
下書きが表示されればOK
下書きを本書きにする
記事のプレビューが問題なければ
draft: false
としてビルド可能にします
外部に持っていくためにビルドする
これだけ
$ hugo
Start building sites …
hugo v0.101.0-466fa43c16709b4483689930a4f9ac8add5c9f66 linux/amd64 BuildDate=2022-06-16T07:09:16Z VendorInfo=gohugoio
| EN
-------------------+-----
Pages | 7
Paginator pages | 0
Non-page files | 0
Static files | 0
Processed images | 0
Aliases | 1
Sitemaps | 1
Cleaned | 0
Total in 44 ms
ホスティング用のs3を作る
terraformで作ります
ホスティング用s3tfファイル
main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.65.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
default_tags {
tags = {
env = "test"
provision = "terraform"
}
}
}
locals {
bucket_name = "hugo-bucket-20230528"
}
resource "aws_s3_bucket" "hugo_bucket" {
bucket = local.bucket_name
}
resource "aws_s3_bucket_policy" "policy" {
depends_on = [
aws_s3_bucket.hugo_bucket,
]
bucket = aws_s3_bucket.hugo_bucket.id
policy = data.aws_iam_policy_document.policy_document.json
}
data "aws_iam_policy_document" "policy_document" {
statement {
principals {
type = "*"
identifiers = ["*"]
}
actions = [
"s3:GetObject",
]
resources = [
aws_s3_bucket.hugo_bucket.arn,
"${aws_s3_bucket.hugo_bucket.arn}/*",
]
}
}
resource "aws_s3_bucket_ownership_controls" "ownership" {
bucket = aws_s3_bucket.hugo_bucket.id
rule {
object_ownership = "BucketOwnerPreferred"
}
}
resource "aws_s3_bucket_public_access_block" "block" {
bucket = aws_s3_bucket.hugo_bucket.id
block_public_acls = false
block_public_policy = false
ignore_public_acls = false
restrict_public_buckets = false
}
resource "aws_s3_bucket_acl" "acl" {
depends_on = [
aws_s3_bucket_ownership_controls.ownership,
aws_s3_bucket_public_access_block.block,
]
bucket = aws_s3_bucket.hugo_bucket.id
acl = "public-read"
}
resource "aws_s3_bucket_website_configuration" "hugo_hosting" {
bucket = aws_s3_bucket.hugo_bucket.id
index_document {
suffix = "index.html"
}
error_document {
key = "error.html"
}
}
aws_s3_bucket
にすべての設定を記載するのは非推奨)
脱線(
s3へのsync
$ aws s3 sync --delete public s3://hugo-bucket-20230528
確認
OK
片付け
$ aws s3 rm s3://hugo-bucket-20230528 --recursive
$ terraform destroy
HugoではURLレンダリングができない
ためいまはトップページにしかアクセス出来ません。
http://<s3>/index.html:アクセス可能
http://<s3>/posts/my-first-post/index.html:アクセス不可(hugoがこのURLにつれていってくれないため)
CloudFront Functions
かLambda@Edge
を後々検討します
参考
2023/6/10追記
URLレンダリングのせいじゃなく、hugo側でbaseurl
を設定していなかったのが原因でした。
baseURL = '<ここを埋める>'
languageCode = 'en-us'
title = 'My New Hugo Site'
theme = 'PaperMod'
ここでページ遷移しようとすると末尾/index.html
が入らないため、これへの対処でcloudfront functionsが必要です
Cloudfront
S3での直接公開ではなく、Cloudfrontをはさみたいので設定します
cloudfrontでのhttps
cloudfront functions