Hugo + CloudFront + S3 + GitHub Actions でCI/CD付きブログサイトを構築してみる Part5 GitHub Actionsを実行

## 概要

https://qiita.com/Tanamachi_kaoru/items/f9bc1285c410e52f6bac

の続きです。今回はgitHub Actionsの設定/実行/記事確認まで実施します。

この記事はそのメモやまとめです。
すでに設定済みの項目がいくつかある。
試行錯誤しながらやったので、手順として不要かもしれない。**あくまでメモ用。**

# GitHub Actionsについて学習
今いる現場で利用はしているが、自分で構築した経験がないのでまずは概要から把握します。
以下の２つの記事を読み概要を把握しました。

https://qiita.com/shun198/items/14cdba2d8e58ab96cf95

https://selfnote.work/20220109/programming/begginer-github-actions/

# 完成した資材
基本的には[参考サイト](https://dev.classmethod.jp/articles/cloudfront-and-s3-using-hugo-with-github-actions/)をもとに作成します。
github側（GitHub Secrets）の設定は済ませています。

```yaml
name: Hugo

on:
  push:
    branches:
      - master
    paths:
      - "hogehoge-site/**"

defaults:
  run:
    working-directory: hogehoge-site

env:
  AWS_REGION: ap-northeast-1
  AWS_ROLE_ARN: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/github_assume_role
  AWS_TARGET_S3_BUCKET: ${{ secrets.AWS_TARGET_S3_BUCKET }}

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          submodules: recursive # Fetch Hugo themes (true OR recursive)
          fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: "0.107.0"

      - name: Build
        run: |
         pwd
         ls -la /home/runner/work/hogehoge-site_HUGO 
         ls -la /home/runner/work/hogehoge-site_HUGO/hogehoge-site_HUGO
         ls -la
         hugo

      - name: Configure AWS credentials from IAM Role
        uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: ${{ env.AWS_ROLE_ARN }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Upload file to S3
        run: aws s3 sync --delete public s3://${{ env.AWS_TARGET_S3_BUCKET }}
```

こちらのコードについては後に判明する問題の原因を探るためにデバッグ目的で書いたものです。
```yaml
      - name: Build
        run: |
         pwd
         ls -la /home/runner/work/hogehoge-site_HUGO 
         ls -la /home/runner/work/hogehoge-site_HUGO/hogehoge-site_HUGO
         ls -la
         hugo
```

ここからは実際に記事をpushしてgithub Actionsを動かして動作を確認していく。

## つまづき1
github Actionsがcheck outで失敗する。
エラー内容は
```
Fetching submodules
  /usr/bin/git submodule sync --recursive
  /usr/bin/git -c protocol.version=2 submodule update --init --force --recursive
  Error: fatal: No url found for submodule path 'hogehoge-site/themes/hugo-tranquilpeak-theme' in .gitmodules
  Error: The process '/usr/bin/git' failed with exit code 128
```
だった。これはHUGOで利用しているテーマのsubmodule化が必要だった。

https://sejuku.net/blog/73151

Repositoryのtopで以下のコマンドを実行。
```
git submodule add https://github.com/kakawait/hugo-tranquilpeak-theme.git hogehoge-site/themes/hugo-tranquilpeak-theme
```

以下のファイルが生成され、submodule化された。
```.gitmodules
[submodule "hugo-tranquilpeak-theme"]
	path = hogehoge-site/themes/hugo-tranquilpeak-theme
	url = https://github.com/kakawait/hugo-tranquilpeak-theme.git
```

## つまづき2
上記修正でgithub actionsは完走したが、ページのレイアウトがおかしい……。
白部分が多いし、ローカルで実行したときとページがぜんぜん違う。

```hogehoge-site/config.toml
baseURL = 'http://example.org/'
```
baseURLがデフォルトのままだった……。
ここをサイトのURLに変えるとローカルで実行したときと同じレイアウトになった。

## つまづき3
しかし、メイン部分の記事が表示されていない。
ブラウザのコンソールを見てみる。
![59903ddc7be208c80ebd71559175e03a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185852/82e63e68-8194-dd96-566f-47df17f57daa.png)

403が出ていてコンテンツを読み込めていないようだ。

まずは参考サイトの「サブページが表示できない」を参考にCloudFront Functions でindex.htmlを補完してあげます。
初めて触る機能でしたので、ちょっとググりながら触りました。日本語だと「関数」と表示されています。

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/example-function-add-index.html

https://zenn.dev/yh1224/articles/xq2kvl7vv1ygl8c4z

この変更をterraformに落とし込みます。
こちらのサイトを参考にしました。

https://zenn.dev/ysmtegsr/articles/d4eb3e8493b7a5ccd427

```terraform:add-index-function.js
function handler(event) {
    var request = event.request;
    var uri = request.uri;

    // Check whether the URI is missing a file name.
    if (uri.endsWith('/')) {
        request.uri += 'index.html';
    }
    // Check whether the URI is missing a file extension.
    else if (!uri.includes('.')) {
        request.uri += '/index.html';
    }

    return request;
}
```
上記ファイルをcloudfrontのディストリビューション部分で読み込みます。
function_associationとresource "aws_cloudfront_function" "add-index-function"を追加しました。

```terraform
~~~~~~
  default_cache_behavior {
    allowed_methods        = ["GET", "HEAD"]
    cached_methods         = ["GET", "HEAD"]
    target_origin_id       = "s3origin"
    compress               = false
    viewer_protocol_policy = "redirect-to-https"
    cache_policy_id        = "4135ea2d-6df8-44a3-9df3-4b5a84be39ad" # CachingDisabled
    #cache_policy_id  = "658327ea-f89d-4fab-a63d-7e88639e58f6" # CachingOptimized
    function_association {
      event_type   = "viewer-request"
      function_arn = aws_cloudfront_function.add-index-function.arn
    }
  }

~~~~~~

# index.htmlのためにcloudfront_functionを定義
resource "aws_cloudfront_function" "add-index-function" {
  name    = "add-index-function"
  runtime = "cloudfront-js-1.0"
  comment = "Add index.html to the path"
  publish = true
  code    = file("${path.module}/add-index-function.js")
}
```
上記をapplyしても変わりませんでした。
さらに以下を追加修正します。

https://dev.classmethod.jp/articles/tsnote-cloudfront-s3-notexistobject-403-001/

ListBucketと`${aws_s3_bucket.s3_hugo.arn}`を追加してapply。
```terraform
    actions = [
      "s3:GetObject",
      "s3:ListBucket"
    ]
    resources = [
      "${aws_s3_bucket.s3_hugo.arn}/*",
      "${aws_s3_bucket.s3_hugo.arn}"
    ]
```

これで403は消えたが、未だに記事が表示されない。


## つまづき4
記事が公開されていない原因は、
記事のdraftがtrue(下書き)状態なので公開設定にされていないことが原因だった。

https://yy16ki.hatenablog.com/entry/2022/09/17/171900

```
---
title: "My First Post"
date: 2023-04-27T08:44:14Z
draft: true
---
## テスト投稿
こんにちは
```

falseにしたら表示された。
```
---
title: "My First Post"
date: 2023-04-27T08:44:14Z
draft: false
---
## テスト投稿
こんにちは
```

# ハマったところとか
- つまづきがかなり多く、解決するまでかなり時間がかかってしまった。

# 次にやること
ひとまずブログとして公開できるところまで完成しました。
ローカルで記事を書いてpushするだけで自動的に Web 公開できる環境が完成！

次は参考サイトに記載されているやつもコストをちょっと調べてみてやってみたいと思います。
WAFは個人の超小さいブログには不要だと思う……。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/ServerLogs.html

https://dev.classmethod.jp/articles/athena-cloudfront-log-activity/

https://dev.classmethod.jp/articles/aws-waf-cloudfront/

先にやりたいのは
- HUGOのレイアウトをいい感じに編集する
- datadogと連携させてlogを簡単に確認できるようにする
ですので、こちらを先にやってみます。