AWS と GitHub Actions の勉強をかねて新しいブログサイトを構築することにした。
今回はHugo + CloudFront + S3でブログサイトを作成する。
初めはAWSのマネコンでぽちぽち操作をして、その後 terraform importで構成をTerraformに落とし込むことでIaC化することで、現実の操作内容とTerraformの中身を紐づくことができるのではないかと考えている。
技術構成は以下のようになった。
- 静的ジェネレーターはHugo
- CI/CDはGitHub Actions(ビルド担当)
- S3は静的ファイルの格納場所
- CloudFrontはCDNなのでここでwebに配信
- 独自ドメインは元からCloudflareで取得済み
作るもの
アーキテクチャの全体像は以下の通り。

ACMから証明書を発行してCloudflareに登録するところや,CloudFrontを利用してS3のバケットを参照させたり、CloudFront Functionsを用いてURLを変更するようにコードを書いて設定したりと初めのことも多かったのでとても楽しかった。
以下は学びになったAWSの操作を記載する。
ACMから証明書を発行してClaudflareに登録する
AWSにドメイン所有権を証明するために、ACMで証明書を発行 -> Cloudflareに登録の手順をやっていく。
- CLoudFrontが使用できるリージョンが
us-east-1なので、ACMのリージョンもus-east-1にする。そしてRequest a certificateをクリック。

- 公開証明書でリクエストを作成する

- この記事に複数ホストも登録できると記載があったので
*(アスタリスク)で登録した。

- CSVファイルをエクスポートして
CNAME nameとCNAME valueを控えておく(コピーでも良い)

on ☸ admin on kubernetes-the-hard-way in default () ~/Downloads
♥ ❯ cat DNS_Configuration.csv
Domain name,CNAME name,Type,CNAME value
*.shooonng.com,_6e2510b7de5c2f6a659fa878d7fe59f2.shooonng.com.,CNAME,_1e50acc97e023be2f97dc14014edac0b.jkddzztszm.acm-validations.aws.%
on ☸ admin on kubernetes-the-hard-way in default () ~/Downloads
♥
- Cloudflareのサイトから DNS > Records でNameとValueを登録する。Proxyは外しておく。


CloudFrontの設定
- Free Plan > 任意のDistribution name > 作成したS3 バケットを指定してCloudFront Distributionを作成する。



- Generalを選択して、CNAMEとACMで登録したSSL証明書を入力する。

- 作成されたオリジンを選択して、OACを作成していない場合は
Create new OACから新しいOACを作成する。

- 作成されたビヘイビアを選択して、以下項目を確認する。
- Origin and origin groups (作成してs3のバケットが指定されている。)
- Viewer protocol policy (
Redirect HTTP to HTTPSが指定されている。) - Allowed HTTP methods (
GET, HEADが指定されている。)

CloudFront Functionsを作成して、CloudFrontに設定する。
トップページは表示されるが記事のページにアクセスするとエラーになってしまったので、 CloudFront Functions を作成して、ディレクトリで終わるURLを index.html に書き換えることで、
S3 で静的サイトの pretty URL を正しく配信させる。
CloudFrontの左タブからFunctionsを選択して、Create FunctionsからCloudFront Functionsを作成する。以下jsを記載する。
CloudFrontの作成したディストリビューションからビヘイビアを選択して、
Function associationsから作成したCloud FunctionsからCloud Functionsを選択する。

あとがき
その他やったことははGitHub ActionsでCI/CDを設定したりした。
マネコンからS3作成、CloudFront作成、ACMで証明書発行など一連の操作をできて大変勉強になった。
次はこの設定をTerraformにimportしてIac化していく。
