AWS S3バケット作成と静的サイト公開手順

※本記事にはプロモーションを含む場合があります。
- S3の静的サイト公開は月額50円〜300円程度で運用でき、無料枠なら最初の12ヶ月は5GBまで無料
- バケット作成からアクセス確認まで、初めてでも約30分〜45分で完了する
- バケット名は3〜63文字、小文字英数字とハイフン・ドットのみという命名ルールがある
- 独自ドメイン化とHTTPS配信にはRoute 53・ACM・CloudFrontの3サービスの組み合わせが必要
- 公開設定を誤ると全世界からファイルが閲覧できる状態になるため、バケットポリシーの範囲設定が要になる
S3公開の費用対効果
静的サイトとは、HTML・CSS・JavaScriptのファイル群のみで構成され、サーバー側でのデータベース処理を伴わないWebサイトを指します。動的な処理がない分、サーバー負荷が小さく、攻撃対象になりやすい入力フォームやログイン機能も持たないため、セキュリティ面のリスクも相対的に低いといわれています。ブログ、ポートフォリオ、社内向けドキュメント、キャンペーンのランディングページなど、更新頻度が低いコンテンツと相性が良い形式です。
AWS S3を選ぶ最大の理由はコストと拡張性のバランスです。ストレージ料金は東京リージョンで1GBあたり月額0.025ドル前後(2026年時点の目安)とされており、10MB程度の小規模サイトであれば月額数十円で運用できるケースがほとんどです。加えてAWSの無料利用枠を使えば、アカウント作成から12ヶ月間は5GBまでのストレージと2万リクエストの読み取りが無料になります。他の選択肢と比較すると、以下のような違いがあります。
| サービス | 月額目安 | 独自ドメイン対応 | HTTPS対応 | 向いている用途 |
|---|---|---|---|---|
| AWS S3+CloudFront | 50円〜300円 | 可能(Route 53連携) | ACMで無料発行 | 本番運用・企業サイト |
| レンタルサーバー | 500円〜1,500円 | 可能 | プランによる | 動的サイトとの併用 |
| Netlify無料枠 | 0円 | 可能 | 自動発行 | 個人開発・検証用 |
| GitHub Pages | 0円 | 可能 | 自動発行 | OSSドキュメント |
無料の選択肢もありますが、AWS S3はCloudFrontによる世界99拠点以上のエッジ配信網、Route 53によるDNS管理、IAMによる細かな権限制御など、事業として運用する際に必要な機能が一通り揃っている点が強みです。トラフィックが急増した場合でもサーバーの増強作業が発生しない自動スケールも、他サービスとの差別化ポイントになります。
事前準備と必要ツール
作業を始める前に、以下の3点を用意しておくと手順の途中でつまずきにくくなります。1つ目はAWSアカウントです。クレジットカード情報の登録が必須なので、あらかじめ用意しておきます。アカウント作成後は、ルートユーザーをそのまま使わず、IAMユーザーを1つ作成してアクセスキーを発行する流れが推奨されています。ルートユーザーは全権限を持つため、漏えい時の被害範囲が大きくなるのが理由です。
2つ目はAWS CLIです。バケット操作をコマンドラインから行う場合に使用し、インストール後はaws configureコマンドでアクセスキー、シークレットキー、リージョン名(例:ap-northeast-1)、出力形式(json推奨)の4項目を登録します。3つ目はテキストエディタです。VS Codeであれば拡張機能「AWS Toolkit」を入れることで、エディタ上からバケットの中身を確認できるようになります。
公開するサイトのファイル一式も事前に用意しておきます。最低限必要なのはトップページのindex.htmlのみですが、404エラー用のerror.html、スタイルシート、画像フォルダも合わせて準備しておくと、後の手順がスムーズです。作業前チェックリストとして以下を確認してください。
- □ AWSアカウントを作成し、クレジットカード登録まで完了している
- □ IAMユーザーを作成し、管理者権限(もしくはS3限定権限)を付与した
- □ AWS CLIをインストールし、aws configureで認証情報を登録した
- □ index.htmlをローカルで作成し、ブラウザ表示を確認した
- □ 公開したいドメイン名(独自ドメインを使う場合)を決めている
バケット作成の手順(ステップ)
バケット名にはグローバルで一意という制約があります。既に世界中の誰かが使っている名前は選べないため、末尾に日付や会社名などを付けて重複を避けるのが実務的です。命名ルールは、3〜63文字、小文字英数字とハイフン・ドットのみ使用可能、先頭と末尾にハイフンやドットを置けない、IPアドレス形式(192.168.1.1のような表記)は不可、という5点です。「my-static-site-2026」のような名前は有効ですが、「MyStaticSite」(大文字使用)や「my_site」(アンダースコア使用)は無効になります。
リージョン選択も公開速度に影響します。主な閲覧者が日本国内であれば「アジアパシフィック(東京)」ap-northeast-1を選ぶと、レイテンシが小さく体感速度が上がります。以下の手順でバケットを作成します。
- AWS Management Consoleにログインし、検索バーに「S3」と入力してサービスを開く
- 「バケットを作成」ボタンをクリックする
- バケット名(例:my-static-site-2026)とリージョン(アジアパシフィック東京)を入力する
- 「オブジェクト所有者」で「ACLを無効にする(推奨)」を選択する
- 「パブリックアクセスをすべてブロックする」のチェックを一時的に外す(静的サイト公開に必要な設定のため)
- その他の設定はデフォルトのまま「バケットの作成」をクリックする
この6ステップは所要時間3分程度で完了します。パブリックアクセスブロックを外す操作については、後続のセクションで解説する範囲限定のポリシー設定とセットで行うことで、リスクを抑えた公開が可能になります。
公開設定とアクセス許可
バケット作成後は、静的サイトホスティング機能を有効化します。作成したバケットを開き「プロパティ」タブから「静的なWebサイトホスティング」セクションの「編集」をクリックし、機能を有効にした上でインデックスドキュメントにindex.html、エラードキュメントにerror.htmlを指定して保存します。この設定だけでは外部からアクセスできないため、次にバケットポリシーの編集が必要です。
「許可」タブの「バケットポリシー」から以下のようなJSONを登録します。Resourceの部分は自分のバケット名に置き換えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-static-site-2026/*"
}
]
}このポリシーはs3:GetObject(読み取り)のみを許可し、書き込みや削除は許可しない設計です。範囲を最小限に絞ることが、後述するセキュリティ対策の起点になります。設定を保存すると、プロパティ画面に「http://my-static-site-2026.s3-website-ap-northeast-1.amazonaws.com」のようなエンドポイントURLが表示され、これがサイトの初期アクセス先になります。
| 設定項目 | 推奨値 | 理由 |
|---|---|---|
| ACL | 無効にする | バケット所有者に権限を集約できる |
| パブリックアクセスブロック | 公開時のみ解除 | 公開不要なファイルの流出を防ぐ |
| ポリシーの対象アクション | s3:GetObjectのみ | 書き込み・削除権限を第三者に渡さない |
| 暗号化 | SSE-S3を有効化 | 保存データを自動暗号化できる |
ファイルのアップロード方法
ファイルのアップロード方法は、ブラウザ操作とCLI操作の2通りがあります。ファイル数が10個以下の小規模サイトならブラウザからの操作で十分ですが、100ファイルを超えるようなサイトや、更新を自動化したい場合はCLIが向いています。
ブラウザからは、バケットの「オブジェクト」タブを開き「アップロード」ボタンから「ファイルを追加」でローカルファイルを選択し、「アップロード」を実行するだけです。1ファイルあたり最大5TBまで対応していますが、5GBを超えるファイルはマルチパートアップロードが必要になる点に注意します。ファイル名の大文字・小文字はS3側でも区別されるため、ローカルと表記を一致させておきます。
CLIからは、以下のコマンドで単一ファイルをアップロードします。
aws s3 cp index.html s3://my-static-site-2026/
複数ファイルをまとめてアップロードする場合は、再帰オプションを付けます。
aws s3 cp . s3://my-static-site-2026/ --recursive
CLIには、スクリプトによる定期更新が組める、Content-Typeなどのメタデータを細かく指定できる、大量ファイルを一括処理できるという利点があります。またerror.htmlを作成しアップロードした上で「静的なWebサイトホスティング」設定のエラードキュメント欄に指定しておくと、404発生時にも独自デザインのページを表示でき、離脱率を抑える効果が期待できます。
独自ドメインでHTTPS配信
初期状態のS3公開URLはやや長く、HTTP接続のみでHTTPS化されていません。独自ドメインとHTTPSに対応させるには、Route 53、AWS Certificate Manager(ACM)、CloudFrontの3サービスを組み合わせます。全体の流れは以下の4ステップです。
- Route 53でドメインを取得するか、既存ドメインのホストゾーンを作成する
- ACMで対象ドメインのSSL証明書を無料発行する(バージニア北部リージョンで発行する点に注意)
- CloudFrontディストリビューションを作成し、オリジンにS3バケットを指定する
- Route 53のAレコード(エイリアス)でドメインをCloudFrontのディストリビューションに向ける
ACMでの証明書発行は、DNS検証を選ぶとRoute 53側に自動でCNAMEレコードが追加され、5分〜30分程度で発行が完了するケースが多いとされています。CloudFront経由にすることで、S3への直接アクセスを塞ぎつつHTTPS配信が可能になり、世界各地のエッジロケーションを使ったキャッシュ配信によって表示速度も向上します。独自ドメイン化にかかる追加コストは、ドメイン取得費用(.comで年間1,000円台〜)とCloudFrontの転送量課金のみで、ディストリビューション自体の作成費用はかかりません。
この構成が完了すると、閲覧者は「https://www.example.com」のようなURLで、S3の内部URLを意識せずにアクセスできるようになります。ブランドイメージの向上に加えて、HTTPS化は検索エンジンの評価項目の一つともされているため、SEOの観点でも実施しておく価値があります。
運用最適化とトラブル対処
公開後も、いくつかの設定を見直すことでパフォーマンスとセキュリティを底上げできます。まずCloudFrontのキャッシュ設定です。デフォルトTTLを24時間程度に設定しておくと、S3への直接リクエスト数が減り、転送コストの削減とレスポンス速度の両方にプラスに働きます。画像やCSSなど更新頻度の低いファイルは長め、HTMLは短めのTTLに分けるのが実務上の目安です。
次にCORS(クロスオリジンリソース共有)設定です。フォントファイルや別ドメインから読み込むJavaScriptがある場合、CORSを許可しないとブラウザ側でブロックされます。バケットの「アクセス許可」タブからCORS設定を編集し、許可するオリジンを必要なドメインのみに限定しておくと、意図しない外部サイトからの読み込みを防げます。
3つ目はバージョニングです。バケットのプロパティから有効化しておくと、ファイルを誤って上書き・削除した場合でも過去バージョンに復元できます。ストレージ容量は増える分、料金はわずかに上がりますが、更新頻度が高いサイトでは保険として有効化しておく価値があります。
運用中によく発生するエラーは以下の通りです。
| 症状 | 主な原因 | 対処法 |
|---|---|---|
| 403 Forbidden | バケットポリシー未設定・パブリックアクセスブロックが有効のまま | ポリシーとブロック設定を再確認する |
| 404 Not Found | index.htmlがルート直下にない | ファイル配置とファイル名の大文字小文字を確認する |
| 証明書エラー | ACMをバージニア北部以外で発行している | us-east-1リージョンで再発行する |
| 更新が反映されない | CloudFrontのキャッシュが残っている | キャッシュ無効化(インバリデーション)を実行する |
これらの症状はいずれも設定漏れが原因であるケースが大半で、チェックリストに沿って上から順に確認していくと、平均10分〜15分程度で原因を特定できることが多いです。
よくある質問
Q1. S3の静的サイト公開は完全無料で運用できますか?
A. アカウント作成から12ヶ月間は無料利用枠内(5GB、月2万リクエスト程度)であれば実質無料に近い費用で運用できますが、それを超えると従量課金が発生します。小規模サイトなら月額50円前後に収まるケースが多いです。
Q2. index.htmlをアップロードしたのに403エラーが出ます。原因は?
A. バケットポリシーが未設定か、パブリックアクセスブロックの設定が解除されていないことが主な原因です。「許可」タブでポリシーの内容とブロック設定の4項目をあわせて確認してください。
Q3. 独自ドメインを設定するのにどのくらい費用がかかりますか?
A. ドメイン取得費用は年間1,000円台〜3,000円程度が目安で、SSL証明書はACMを使えば無料です。CloudFrontの転送量課金(数十円〜数百円/月)を合わせても、月額500円以内で収まるケースが多いとされています。
Q4. アップロードしたファイルを更新したのに古い内容が表示されます。
A. CloudFrontを経由している場合、エッジ側にキャッシュされたままになっている可能性があります。CloudFrontのコンソールから「インバリデーションの作成」を実行し、対象パスに「/*」を指定するとキャッシュが即時に更新されます。
Q5. S3バケットに動的な機能(お問い合わせフォームなど)を追加できますか?
A. S3自体はファイル配信のみでサーバー処理は行えません。フォーム送信のような動的処理を追加する場合は、AWS LambdaとAPI Gatewayを組み合わせるか、外部のフォームサービスをJavaScriptから呼び出す構成が一般的です。
この記事を読んでいる方へのおすすめ:
この記事で学んだスキルをさらに深めたい方へ
AWS・クラウド技術をさらに深く学びたい方に。試験対策から実践まで網羅した参考書を活用しましょう。
Amazonアソシエイトプログラムを利用しています。
編集ポリシー:この記事は、Infra Academy の編集チームが最新情報を元に執筆・監修しています。情報の正確性を保つために定期的な見直しを行っています。
編集ポリシーはこちら



