AWS S3 + CloudFront を用いたサーバー構築 - OAC で安全にアクセス

## 概要

AWS S3 と CloudFront を使用し、独自ドメインで安全にアクセスできるサーバー環境構築をステップバイステップで解説します。本ガイドでは、Origin Access Identity (OAC) を活用し、CloudFront からのみ S3 にアクセスできるようにすることでセキュリティを強化します。また、AWS Certificate Manager (ACM) を利用して無料の SSL 証明書を取得し、HTTPS 接続を実現します。最後に、Route53 を用いて独自ドメインを CloudFront に設定し、ユーザーに安全なアクセスを提供する方法を紹介します。

### **1. S3 バケットの作成**

まず、S3 バケットを作成します。バケット名はグローバルにユニークである必要があるため、注意して命名してください。

- AWS コンソールにログインし、S3 サービスにアクセスします
- **バケットを作成** をクリックします
- バケット名を入力し、リージョン(日本の場合は東京を選ぶと良い)を選択して **次へ** をクリックします
- **オブジェクト所有者** はACL無効を選択します
- バケットのアクセス権限を適切に設定します。本記事では、CloudFront からのみアクセスできるようにしますので、"**アクセス権限の編集**" で "**ブロックパブリックアクセス**" を選択します
- "**ブロックパブリックアクセス**" の設定で、"**パブリックアクセスをすべて ブロック**" を選択し、**次へ** をクリックします
- **バケットのバージョニング** は必要なら有効にしてよいですが、無効でもよいです
- "**タグ**" は任意で設定できます。**次へ** をクリックします
- "**確認**" 画面で設定を確認し、**バケットを作成** をクリックします
- 作成ができたら、そのバケットを選択肢、"**プロパティ**" タブを選ぶと、一番下に「**静的ウェブサイトホスティング**」というセクションがあるので、編集をクリックします
- 静的ウェブサイトホスティングで「有効にする」を選択し、インデックスドキュメントには「index.html」を入力、それ以外の項目はデフォルトのままで「変更の保存」をクリックします

![s3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34853/7f53f977-fab1-c727-eddc-8b572e89fc6f.png)

### **2. ACM を利用した SSL 証明書の取得**

ACM を利用して、無料の SSL 証明書を取得します。先にこちらの手順をしておくとスムーズです。

- AWS コンソールで ACM サービスにアクセスします
- 画面右上のリージョンの設定が「バージニア北部（N. Virginia）」になっていることを確認してください
- **証明書をリクエストする** をクリックします
- **ドメイン名** に独自ドメイン名を入力し、**検証方法** は「DNS検証」を選択します
- キーアルゴリズムは「RSA 2048」を選んでください
- 設定できたら画面右下の「リクエスト」をクリックします

![acm copy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34853/37bf92d7-fa0c-920f-d679-a0ed288417b8.png)

- 証明書リクエストが作成されたら、ドメインの欄にある「**Route 53でレコードを作成**」をクリックすると、自動的にRoute53にレコードが追加されます
 ※ Route53 を使用していない場合は、ドメインを管理しているDNS側でCNAMEにキーを設定する必要があります
- 検証が正常に設定されると、しばらく待てば、証明書が発行されて「発行済み」の状態になります
- 証明書は、後ほどCloudfrontの管理画面から設定できるので、ダウンロードはしなくても大丈夫です

![acm2 copy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34853/42debb7a-30ba-1950-a717-cc188b00271a.png)


### **3. CloudFront のディストリビューション**

CloudFront のディストリビューションを作成します。

- AWS コンソールで CloudFront サービスにアクセスします
- ディストリビューションのメニューに移動し、**ディストリビューションを作成** をクリックします
- **Origin Domain** に S3 バケットのエンドポイント `[YOUR_BUCKET_NAME].s3.amazonaws.com` を入力します
- **Origin Path** は空欄のままにしてください
- **オリジンアクセス** は、「Origin access control settings (recommended)」を選び、「Create new OAC」を選んで、 OAC を作成します
- OACの設定はデフォルトのままで「Create」をクリックして作成して大丈夫です
- **Default Cache Behavior** で、以下の設定を行います
    - **Viewer Protocol Policy** に **Redirect HTTP to HTTPS** を選択します
    - **Allowed HTTP Methods** に **GET, HEAD** を選択します
    - **Cache Policy** はデフォルトのままでよいです
    - **Origin Shield** は必要の応じて有効にしてください
    - **Origin Response Headers** はデフォルトのままで良いです
- 設定の**料金クラス**は「すべてのエッジロケーションを使用する（最高のパフォーマンス）」を選びます
- **代替ドメイン**には、さきほどACMで設定した証明書のドメインを入力します（サブドメインもつけている場合はサブドメイン込みで入力します）
- **Custom SSL Certificate** に、ACM で取得した証明書を選択し、**SSL Certificate ID** を入力します
- **セキュリティポリシー**はTLSv1.2_2021（推奨）を選びます
- **サポートされているHTTPバージョン**は、HTTP/2のままで良いです
- **デフォルトルートオブジェクト**は、「index.html」を入力します
- それ以外はデフォルトの設定で大丈夫です
- **設定の確認** 画面で設定を確認し、**ディストリビューションを作成** をクリックします
- 正常に配信設定（ディストリビューション）が作成されると、画面上部に「S3のバケットポリシーに設定する必要がある」という旨の通知が出ると思いますので、コピーをクリックしてコピーしておくと次のステップで便利です

![cloudfront copy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34853/87dcb715-b9d4-68af-e3a8-f0152b83c598.png)

### **4. S3 バケットのポリシー設定**

OAC を使用して S3 バケットへのアクセスを制限するため、ポリシーを設定します。

- AWS コンソールで S3 サービスにアクセスします
- **バケット** をクリックします
- 該当のS3 バケットを選択し、**アクセス許可** のタブをクリックします
- **バケットポリシー** をクリックします
- 下記のポリシーをコピーして貼り付けます。`[YOUR_OAC_ID]` は、作成した OAC の識別子に置き換えてください
- 先ほどのCloudfrontの配信設定を作成した最後に、S3のバケットポリシーをコピーしていた場合は、そのまま貼り付けると`[YOUR_OAC_ID]` などが入力された状態で貼り付けられます

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowCloudFrontAccess",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::cloudfront:user/CloudFrontOriginAccessIdentity[YOUR_OAC_ID]"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::[YOUR_BUCKET_NAME]/*"
    }
  ]
}
}
```

- **保存** をクリックします

### **5. Route53 で独自ドメインの設定**

Route53 を使用して、独自ドメインを CloudFront に設定します

- AWS コンソールで Route53 サービスにアクセスします
- **ホストゾーン** で、ドメインを選択し、「**レコードを作成**」をクリックします
- **レコード名** には、空白 or サブドメイン を入力し、**レコードタイプ** に `A` を選択します
- **値** には、入力欄のすぐ上部にある「エイリアス」にチェックを入れて、CloudFrontを選び、先ほど作成した配信設定を選びます
- **TTL** はデフォルト値のままにしてください
- **レコードを作成** をクリックします

![route53 copy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34853/3202471b-5902-de38-89c6-6a5a1bf0de96.png)


これで、独自ドメインから CloudFront を介して S3 バケットにアクセスできるようになります

## まとめ

本記事では、AWS S3 と CloudFront を使用し、独自ドメインで安全にアクセスできるサーバー環境構築方法を解説しました。OAC を活用することで、セキュリティを強化し、ACM を利用することで無料の SSL 証明書を取得することができます。さらに、Route53 を用いて独自ドメインを設定することで、ユーザーに安全なアクセスを提供できます。