【2024年 AWS】S3でSSL化した静的Webサイトを公開する

ブログ運営するために今回S3を使ったのでメモ。

## S3バケット作成とファイルアップロード
まずバケット作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/196cb3fb-77ad-03fc-3025-b7f8ad1ad816.png)
パブリックアクセスを許可。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/e8b5f1aa-6984-9341-301b-1d2800adef81.png)
バケットポリシーを設定。
~~~json:バケットポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket-name/*"
        }
    ]
}
~~~
プロパティタブから静的ホスティングを有効にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/2f497e9d-f201-7387-44d4-294e4fa30838.png)
後はファイルをアップロード。
最低限index.htmlとerror.htmlが必要。
背的ホスティングを有効にした際に表示されるURLにアクセスするとサイトが表示される(静的Webサイトのホスティング作業が完了)。

## CloudFront経由でS3にアクセス
CloudFrontでディストリビューションを作成。
以下のオプションで、OAIではなく機能強化されたOACを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/36994fe8-03b0-dc94-161b-90a3fac48b8a.png)
こちらの記事がとてもわかりやすく説明されていたので、以下の記事を参考に設定した。
https://dev.classmethod.jp/articles/amazon-cloudfront-origin-access-control/
**「Webサイトのエンドポイントを選択」というボタンが出てきますが無視してS3バケットを選択。じゃないとOACの設定ができない。**
OACの設定以外は特にいじらずデフォルトのまま。
https://(cloudfrontのURL)/index.htmlでWebサイトが表示されたらOK。
cloudfrontのみのアクセスにしたいので、S3はパブリックアクセスをブロックに戻しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/19a7d382-1b34-a03e-4f3b-1031a182d1bd.png)

## Route53でドメイン設定
Route53でドメイン取得は高いのでお名前.comでドメイン取得する。
ドメインが取得できたらホストゾーンを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/d1e61c82-48fc-14ed-63c6-1d5d06d6ffb7.png)
以下サイトを参考にお名前.comの方でネームサーバー設定。
https://dev.classmethod.jp/articles/route53-domain-onamae/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/d69ebe60-3a1a-16f7-d677-f41fc5847bb2.png)

## ACMでSSL証明書を発行し設定
以下サイトの「5. ACMでSSL証明書を発行する」を参考に設定した。
https://www.aws-room.com/entry/s3-ssl-hosting
ACMで証明書のリクエストの後に「Route53でレコード作成」で作成後、半日後にはステータスが成功になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/47130911-b457-4077-1be7-708603d53c9e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/f825c9ca-b1ab-ce00-ee22-9bfc6898e7a2.png)
上記のサイトを参考に作成した証明書をCloudFrontに設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/b584333a-3489-b253-2081-834ff2757d5f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/0e666176-3fa0-a1fb-6b94-c65398c93038.png)
「ウィザードに切り替える」を押すと参考サイトと同様の画面になる。
CloudFrontでディストリビューションを作成したのにリソースが見つからないと出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/7f7fe898-258b-cea8-1969-2dc6df3d4bfc.png)
CloudFrontの設定で代替ドメイン名に取得したドメイン名を追加すると表示されるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/c5ce4cd9-19eb-a435-d27b-4aa5b273648b.png)
**以下のオプションも設定しておかないと403エラーが出るので、ドメインに直でアクセスされた際に表示するhtmlファイル名を入れておく。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/e0de062a-aeda-6d76-d7bf-71aec1630a8e.png)
https://(独自ドメイン)でページが表示されたら、最後に**S3ホスティング機能を無効にしておく。S3の静的ホスティングURLからもアクセスできてしまうので**

## 参考サイト
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/WebsiteHosting.html
https://zenn.dev/wakkunn/articles/66a6e8372611dc
https://dev.classmethod.jp/articles/amazon-cloudfront-origin-access-control/
https://www.aws-room.com/entry/s3-ssl-hosting
https://dev.classmethod.jp/articles/route53-domain-onamae/
https://mik2062.jp/s3-cloudfront/#index_id0