Skip to main content

AWS S3バケット設定ガイド:CloudFront + OACで安全な静的サイトホスティング

Website Development Version 1.0.0

このドキュメントでは Cloud Front や Route53 と組み合わせてサイトホスティングをする上で必要なS3の設定について説明していきたいと思います。

ホスティングの概要や、各サービスの基本的な役割については AWSホスティングとは?S3 + CloudFront + Route53の概要と役割 を確認してください

S3バケットを作成する

それでは、実際にS3バケットを作成していきましょう。

バケット作成の手順

まずは基本的な手順から。AWSコンソールにログインしたら、S3サービスに移動し、「バケットを作成」をクリックします。

一般設定で重要なポイント

バケット名は、AWS全体で一意である必要があります。つまり、世界中の誰も使っていない名前でなければなりません。例えば my-blog のようなシンプルな名前は既に使われている可能性が高いので、my-blog-2024 のように少し工夫するか、ドメイン名を含めるなどして、ユニークな名前にしましょう。

AWSリージョンは、ユーザーに近いリージョンを選ぶのが基本です。日本のユーザーがメインなら ap-northeast-1(東京)がおすすめです。ただし、CloudFrontを使用する場合は、リージョンの影響はそれほど大きくありません。

セキュリティ設定の考え方

オブジェクト所有権では、「ACLを無効化(推奨)」にチェックを入れます。これは、AWSが推奨している新しい方式で、よりシンプルで安全な権限管理が可能になります。

パブリックアクセス設定は、CloudFront + OACを使用する場合、すべてブロックしたままにしておきます。これが重要なポイントです。パブリックアクセスをブロックしていても、CloudFront経由でのアクセスは可能になります。むしろ、直接アクセスをブロックすることで、セキュリティが向上します。

その他の設定

バケットバージョニングは、通常の静的サイトホスティングでは無効で問題ありません。ファイルの履歴管理が必要な場合のみ有効にします。

デフォルトの暗号化は、セキュリティの観点から必ず設定しましょう。SSE-S3(S3が管理する暗号化キー)で十分ですが、より厳格な管理が必要な場合はSSE-KMSを選択することもできます。

設定が完了したら、「バケットを作成」をクリックして、バケットが作成されるのを待ちます。通常、数秒で完了します。

バケットポリシーでセキュリティを強化する

バケットを作成しただけでは、まだ安全に使用できません。CloudFront + OACを使用する場合、S3バケットへの直接アクセスをブロックし、CloudFront経由でのみアクセス可能にする必要があります。

これにより、誰でもS3のURLに直接アクセスしてファイルを取得することを防ぎ、必ずCloudFrontを経由するように強制できます。CloudFrontには、キャッシュやセキュリティヘッダーの追加など、多くの利点があるので、この制限は実質的にメリットしかありません。

手動でバケットポリシーを設定する方法

まず、手動で設定する方法を説明します。後で自動生成の方法も紹介しますが、仕組みを理解しておくと、トラブルシューティングの際に役立ちます。

設定手順

  1. S3コンソールで作成したバケットを選択
  2. 「アクセス許可」 タブを開く
  3. 「バケットポリシー」 セクションで 「編集」 をクリック
  4. 以下のJSONポリシーを貼り付けます(プレースホルダーを実際の値に置き換えてください):
{
  "Version": "2012-10-17",
  "Id": "PolicyForCloudFrontPrivateContent",
  "Statement": [
    {
      "Sid": "AllowCloudFrontServicePrincipal",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::BUCKET_NAME/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT_ID:distribution/DISTRIBUTION_ID"
        }
      }
    }
  ]
}

置き換えが必要な値

このポリシーには、3つの値を実際の値に置き換える必要があります:

  • BUCKET_NAME: 先ほど作成したバケットの名前
  • ACCOUNT_ID: AWSアカウントID(12桁の数字。右上のアカウント名をクリックすると確認できます)
  • DISTRIBUTION_ID: CloudFrontディストリビューションID
Information

重要な注意点
「DISTRIBUTION_ID」は、CloudFrontを設定してからでないと確認できません。そのため、先に下記リンクを参考にCloudFrontを設定してから、バケットポリシーの設定を行うようにしましょう。
CloudFront設定ガイド

Tip

便利な小技
「AWS:SourceArn」の値は、CloudFrontコンソールで作成したディストリビューションを開き、ARNをコピー&ペーストすれば簡単に入力できます。手動で入力するよりも確実で、タイプミスも防げます。

  1. すべての値を置き換えたら、「変更の保存」 をクリックします。

バケットポリシーの自動生成(おすすめ)

実は、もっと簡単な方法があります。CloudFrontコンソールでOACを作成する際に、バケットポリシーを自動生成するオプションがあります。この方法を使用すると、上記の手動設定は不要です。

自動生成の手順

  1. CloudFrontコンソールでOACを作成する際に
  2. 「バケットポリシーを更新」 オプションを選択
  3. バケットポリシーが自動的に更新されます

この方法なら、JSONを手動で編集する必要がなく、ミスも防げます。特に初めて設定する場合は、この方法を強くおすすめします。

パブリックアクセスの設定を確認する

「パブリックアクセスをブロック」という設定名を見ると、「これだとサイトにアクセスできなくなるのでは?」と心配になるかもしれません。しかし、CloudFront + OACを使用する場合、パブリックアクセスをブロックしたままでも問題ありません。

むしろ、この設定を有効にすることで、セキュリティが大幅に向上します。OAC経由でのみアクセス可能になるため、悪意のあるユーザーがS3のURLに直接アクセスしてファイルを取得することを防げます。

設定の確認方法

念のため、設定が正しく行われているか確認しておきましょう:

  1. S3コンソールでバケットを選択
  2. 「アクセス許可」 タブを開く
  3. 「パブリックアクセスのブロック」 セクションで設定を確認

CloudFront + OACを使用する場合、以下の4つの設定がすべて有効になっていることを確認してください:

  • パブリックアクセスをすべてブロック: 有効
  • 新しいパブリックバケットポリシーを介したパブリックアクセスとクロスアカウントアクセスをブロック: 有効
  • パブリックアクセスとクロスアカウントアクセスをブロック(任意のパブリックバケットポリシーを介して): 有効
  • 新しいパブリックバケットまたはアクセスポイントポリシーを介したパブリックアクセスとクロスアカウントアクセスをブロック: 有効

これらがすべて有効になっていれば、セキュリティ設定は完璧です。

CORS設定について(通常は不要)

CORS(Cross-Origin Resource Sharing)は、異なるドメイン間でリソースを共有するための仕組みです。APIリクエストや外部リソースへのアクセスが必要な場合に設定しますが、CloudFrontを使用している場合は、通常は設定不要です。

なぜCloudFrontでは不要なのか

CloudFrontを使用している場合、CORS設定は通常不要です。CloudFrontが適切なヘッダーを処理してくれるため、S3バケット側でCORSを設定する必要がありません。むしろ、不要な設定を追加することで、設定が複雑になり、トラブルの原因になる可能性があります。

それでも設定が必要な場合

もし、何らかの理由でCORS設定が必要になった場合は、以下の手順で設定できます:

  1. S3コンソールでバケットを選択
  2. 「アクセス許可」 タブを開く
  3. 「クロスオリジンリソース共有(CORS)」 セクションで 「編集」 をクリック
  4. 以下のCORS設定を追加します(必要に応じてカスタマイズ):
[
  {
    "AllowedHeaders": ["*"],
    "AllowedMethods": ["GET", "HEAD"],
    "AllowedOrigins": ["https://your-domain.com"],
    "ExposeHeaders": [],
    "MaxAgeSeconds": 3000
  }
]

ただし、まずはCloudFrontの設定を確認し、本当にCORS設定が必要かどうかを判断することをおすすめします。

ライフサイクルポリシーでコストを削減する(オプション)

S3のストレージコストは比較的安いですが、長期間ファイルを保存し続けると、コストが積み重なっていきます。特に、古いバージョンのファイルや、もう使わなくなったファイルが残っている場合、無駄なコストが発生している可能性があります。

ライフサイクルポリシーを設定することで、古いファイルを自動的に削除またはアーカイブできます。これにより、コストを削減できるだけでなく、バケットの管理も楽になります。

ライフサイクルポリシーの設定例

例えば、90日以上経過した古いファイルを自動的に削除するルールを作成する場合:

  1. S3コンソールでバケットを選択
  2. 「管理」 タブを開く
  3. 「ライフサイクルルール」 セクションで 「ルールを作成」 をクリック
  4. ルール名を入力(例: Delete old files
  5. 「ルールスコープ」「すべてのオブジェクトに適用」 を選択
  6. 「アクション」「オブジェクトの非現行バージョンを完全に削除」 を選択
  7. 「日数」 を設定(例: 90日)
  8. 「ルールを作成」 をクリック

この設定により、90日以上経過したファイルが自動的に削除されます。ただし、静的サイトの場合は、通常はファイルを削除する必要はないので、この設定はオプションです。バージョニングを有効にしている場合や、定期的にファイルを更新する場合に特に有効です。

設定完了前の最終確認

設定が完了したら、次のステップに進む前に一度確認しておきましょう。以下のチェックリストを確認することで、後で発生する可能性のあるトラブルを事前に防げます。

✅ チェックリスト

  • バケットが作成されている
  • バケットポリシーが設定されている(CloudFront + OACを使用する場合)
  • パブリックアクセスのブロック設定が適切に設定されている
  • CORS設定が追加されている(必要な場合のみ)
  • ライフサイクルポリシーが設定されている(必要な場合のみ)

すべての項目にチェックが入ったら、次のステップに進みましょう。

よくあるトラブルと解決方法

設定を進めていくと、いくつかのエラーに遭遇する可能性があります。ここでは、よくあるトラブルとその解決方法を紹介します。

403エラーが発生する場合

403エラー(Forbidden)は、アクセス権限の問題で発生します。CloudFront経由でアクセスしようとしたときに403エラーが出る場合、以下の点を確認してください。

バケットポリシーの確認

まず、バケットポリシーが正しく設定されているか確認しましょう:

  • CloudFront + OACを使用する場合、適切なポリシーが設定されているか確認
  • AWS:SourceArn の条件が正しく設定されているか確認(これが間違っていると、CloudFrontからのアクセスが拒否されます)
  • バケット名、アカウントID、ディストリビューションIDが正しいか確認(タイプミスがないか、特に注意)

パブリックアクセスの設定確認

パブリックアクセスのブロック設定も確認しましょう:

  • CloudFront + OACを使用する場合、パブリックアクセスをブロックしたままでも問題ありません
  • 直接S3ウェブサイトホスティングを使用する場合のみ、パブリックアクセスを許可する必要があります

もし、パブリックアクセスを許可してしまっている場合は、設定を見直してください。

ファイルがアップロードされない場合

ファイルをS3バケットにアップロードしようとしても、アップロードが失敗する場合、以下の点を確認してください。

IAM権限の確認

まず、IAMユーザーに適切な権限があるか確認しましょう。以下の権限が必要です:

  • s3:PutObject - ファイルをアップロードする権限
  • s3:GetObject - ファイルを取得する権限
  • s3:DeleteObject - ファイルを削除する権限
  • s3:ListBucket - バケットの内容を一覧表示する権限

これらの権限がないと、ファイルのアップロードが正常に動作しません。

バケット名とリージョンの確認

次に、設定ファイルの内容を確認しましょう:

  • .env ファイルの S3_BUCKET が正しく設定されているか確認
  • バケット名が一意であることを確認(他のアカウントで既に使われている名前は使用できません)
  • AWS CLIの設定でリージョンが正しく設定されているか確認
  • バケットのリージョンと一致しているか確認(リージョンが違うと、バケットが見つかりません)

これらの確認を行っても問題が解決しない場合は、AWS CLIの設定や、アップロード時のエラーログを確認してみてください。

次のステップ

S3バケットの設定が完了したら、次はCloudFrontの設定に進みましょう。CloudFrontを設定することで、世界中のユーザーに高速でコンテンツを配信できるようになります。

以下のガイドを参考に、次のステップに進んでください:

特に、CloudFrontの設定は、このS3バケットと密接に関連しているので、順番に進めていくことをおすすめします。

参考リンク

さらに詳しく知りたい場合は、以下の公式ドキュメントを参照してください: