Open10

HugoをAWSで動かすためのメモ

not75743not75743

ローカル

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

https://gohugo.io/
https://hub.docker.com/r/klakegg/hugo

not75743not75743

記事を書く

## ページ追加
hugo new posts/my-first-post.md
cat content/posts/my-first-post.md 

## 下書き(Drift)含めてビルド
hugo server --bind 0.0.0.0 -D

下書きが表示されればOK
https://blog.chick-p.work/blog/hugo-quickstart/

下書きを本書きにする

記事のプレビューが問題なければ

draft: false

としてビルド可能にします

not75743not75743

外部に持っていくためにビルドする

これだけ

$ 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
not75743not75743

ホスティング用の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にすべての設定を記載するのは非推奨)

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket

not75743not75743

s3へのsync

$ aws s3 sync --delete public s3://hugo-bucket-20230528

確認

OK

片付け

$ aws s3 rm s3://hugo-bucket-20230528 --recursive
$ terraform destroy
not75743not75743

HugoではURLレンダリングができない

ためいまはトップページにしかアクセス出来ません。
http://<s3>/index.html:アクセス可能
http://<s3>/posts/my-first-post/index.html:アクセス不可(hugoがこのURLにつれていってくれないため)

CloudFront FunctionsLambda@Edgeを後々検討します

参考

https://dev.classmethod.jp/articles/cloudfront-and-s3-using-hugo-with-github-actions/#toc-3
https://qiita.com/hideki/items/1f7fe183196259cdc4e8#cloudfront-functionsを設定する
https://technowanko.com/posts/hugo/003_hugo_hosted_on_s3/

2023/6/10追記

URLレンダリングのせいじゃなく、hugo側でbaseurlを設定していなかったのが原因でした。

baseURL = '<ここを埋める>'
languageCode = 'en-us'
title = 'My New Hugo Site'
theme = 'PaperMod'

ここでページ遷移しようとすると末尾/index.htmlが入らないため、これへの対処でcloudfront functionsが必要です