はじめに 
CloudFront + S3 へのデプロイを GitHub Actions で自動化したの続き。
CloudFront + S3 で作成した静的サイトでは、存在しないページにアクセスされると、S3 の 403 Forbidden エラーレスポンス(XML)をそのままブラウザに返してしまう。

かっこ悪いので Hugo が生成した 404.html を表示するように設定してみる。
やったこと 
S3 バケットのポリシーについて 
存在しないファイルにアクセスされたときに 403 Forbidden になってしまうのは、S3 バケットが CloudFront に対して許可しているアクセス権限に s3:ListBucket が含まれていないのが原因らしい。
s3:ListBucket も許可すれば 404 が返るようになる、とこのと。
次のページを参考にさせてもらった。
- https://dev.classmethod.jp/articles/tsnote-cloudfront-s3-notexistobject-403-001/
 - https://aimstogeek.hatenablog.com/entry/2018/07/23/135032
 
S3 からは 404 が返ってきたほうがあるべき姿な気がするが、許可する権限が増えてしまうのが気になる。
今回はアクセス許可は触らず、403 が返却されることを前提に進める。
CloudFront の エラーページ登録 
AWSコンソール > CloudFront > ディストリビューション> 作成したディストリビューション > エラーページ と進み、カスタムエラーレスポンスを作成する。
オリジンである S3 が 403 を返してきたときのレスポンスコードとページを設定する。
注意点
- レスポンスページのパスは S3 でのパスではなく、サイト上でのパスになる。
 - エラーページを設定してから CloudFront に反映されるまで1分ほど待ちがある。
 
 ※ 何度か試行錯誤したので、スクショは編集画面になっている。
確認 
存在しないページにアクセスすると、404.html の内容が返ってくるようになった。

おわりに 
存在しないページにアクセスすると XML が返ってきていたので何だこりゃと思っていたら、S3のエラーレスポンスだった。
無事に Hugo の 404.html ページを返せるようになった。