1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWSハンズオン実践】AWS Hands-on for Beginners AWS 上で静的な Web サイトを公開しよう!

Last updated at Posted at 2025-08-19

1. ハンズオン内容

image.png

  • ACM / Route 53 / S3 /CloudFront
  • ハンズオンでは各リソースを段階的に作成していきます

※Cloud9はVSCodeとPowerShellで代用
※画像はAWS公式ページより引用

前提条件&注意事項

  • このブログだけでは進められません。AWS公式ハンズオン動画をまず見てください。
  • これらの導入が必要になると思われます。
  • ドメインは購入済みであること。handson-lab.clickは自身のドメインに読み替えてください
  • 一部課金が発生します(数十円程度)。終了後は必ず削除しましょう。
  • 親ページ見てない人は見てね
  • ドメイン名は固有なため、本ブログの記載のまま実施しても動かないと思います。

2. 第1形態

image.png

上記構成は、S3の静的ホスティング機能を有効化し、手動でコンテンツ(例:index.html)をデプロイする方式です。
※画像はハンズオンより引用

2.1 S3

2.1.1 バケット作成

  • Amazon S3 > バケット > バケットを作成をクリック
大項目 中項目 選択肢 備考
一般的な設定 AWS リージョン ap-northeast-1
バケットタイプ ✅ 汎用
⬜ ディレクトリ
🔴バケット名 handson-lab.click 自分の保有ドメインを使うこと。直接S3ウェブサイトエンドポイントを使う場合は、ドメイン名とバケット名をする必要がある
オブジェクト所有者 - ✅ ACL 無効 (推奨)
⬜ ACL 有効
デフォルト
オブジェクト所有者 ✅ 希望するバケット所有者
⬜ オブジェクトライター
このバケットのブロックパブリックアクセス設定 🔴パブリックアクセス ⬜ パブリックアクセスをすべて ブロック 静的ホスティング時はバケットをpublic公開するのでオフが必要
ブロックパブリックアクセスをオフにしても、バケットポリシーを足さない限り公開にはなりません
✅ 現在の設定により、このバケットとバケット内のオブジェクトが公開される可能性があることを承認します。
🔴タグ - オプション - Name=handson-lab.click, Environment=dev, Project=aws-handson 設定はしますが使いません
デフォルトの暗号化 暗号化タイプ ✅ Amazon S3 マネージドキーを使用したサーバー側の暗号化 (SSE-S3)
⬜ AWS Key Management Service キーを使用したサーバー側の暗号化 (SSE-KMS)
⬜ AWS Key Management Service キーを使用したデュアルレイヤーサーバー側の暗号化 (DSSE-KMS)
KMSを選択すると設定項目が増えますがここでは割愛
バケットキー ✅ 無効にする
⬜ 有効にする
暗号化タイプがSSE-KMSのときは有効にすることが可能
詳細設定 オブジェクトロック ✅ 無効にする
⬜ 有効にする
🟡論理ID - - HandsonLabClickS3Bucket

この時点では静的ウェブサイトホスティングは行っていません。S3のファイルにアクセスするにはオブジェクトURLにアクセスする必要があります。この時点ではS3に直接アクセスしています。
例)https://s3.ap-northeast-1.amazonaws.com/handson-lab.click/index.html

2.1.2 パケットの設定変更

  • Amazon S3 > バケット > handson-lab.click

🔴が変更箇所です

オブジェクト(タブ)

設定変更というかファイルのアップロード作業となります

大項目 中項目 選択肢 備考
🔴ファイルとフォルダ
(アップロードファイル)
index.html アップロードファイルはこちら
favicon.ico
css/ フォルダ
img/ フォルダ
送信先
アクセス許可
プロパティ ストレージクラス ✅ スタンダード
⬜ Intelligent-Tiering
⬜ 標準 - IA
⬜ 1 ゾーン -IA
⬜ Glacier Instant Retrieval
⬜ Glacier Flexible Retrieval (旧 Glacier)
⬜ Glacier Deep Archive
サーバー側の暗号化 ✅ 暗号化キーを指定しない
⬜ 暗号化キーを指定する
しない場合は実質SSE-S3らしい
チェックサム
タグ
メタデータ - オプション データを検索するときに活用

image.png

プロパティ(タブ)

設定変更です。

大項目 中項目 選択肢 備考
バケットのバージョニング
タグ
デフォルトの暗号化
Intelligent-Tiering Archive 設定
サーバーアクセスのログ記録
AWS CloudTrail データイベント
イベント通知
Transfer Acceleration
オブジェクトロック
リクエスタ支払い
静的ウェブサイトホスティング 🔴静的ウェブサイトホスティング ⬜ 無効にする
✅ 有効にする
ホスティングタイプ ✅ 静的ウェブサイトをホストする
⬜ オブジェクトのリクエストをリダイレクトする
🔴インデックスドキュメント index.html
エラードキュメント - オプション
リダイレクトルール – オプション

アクセス許可(タブ)

設定変更です。

大項目 中項目 選択肢 備考
アクセス許可(タブ) ブロックパブリックアクセス (バケット設定)
🔴バケットポリシー ここ参照 バケット名は修正すること
オブジェクト所有者
アクセスコントロールリスト (ACL)
Cross-Origin Resource Sharing (CORS)

管理(タブ)

大項目 中項目 選択肢 備考
ライフサイクル設定
レプリケーションルール
インベントリ設定

アクセスポイント(タブ)

大項目 中項目 選択肢 備考
アクセスポイント

動作確認
この時点で静的ウェブサイトホスティングが行われています。この時点でもS3に直接アクセスしていますがURLは変わってます。.s3-website-ap-northeast-1.amazonaws.comのが付くのが特徴
例)http://handson-lab.click.s3-website-ap-northeast-1.amazonaws.com

2.1.2 S3にアップロードするAWSCLI

AWSコンソールからアップロードできますが、コマンドでもアップロード可能です。

# 単一のファイルをアップロード
aws s3 cp index.html s3://handson-lab.click

# 複数のファイルをアップロード
aws s3 cp . s3://handson-lab.click --recursive     

3. 第2形態

image.png

上記構成は、CloudFrontを経由してS3の静的コンテンツを配信し、キャッシュが正しく機能しているかを確認する構成です。
※画像はハンズオンより引用

3.1 CloudFront

3.1.1 ディストリビューションの作成

  • CloudFront > ディストリビューション > ディストリビューションを作成をクリック

※2025/8/14現在、CloudFrontは新UIが試験導入されている。ここでは旧UIを使うことにする。またハンズオンの動画のUIは古すぎるので、要注意→10/16旧UIが使えなくなって困った。

UI変更後の追記
オリジンにS3webhostingのURLを使えば、OACは使えないはず。
オリジンにS3のバケットエンドポイント+public+普通のバケットポリシーで動く
オリジンにS3webhostingのURL+普通のpublic+バケットポリシーで動く
オリジンにS3のバケットエンドポイント+OAI+OAI用のバケットポリシーで動く

バケットエンドポイントはXXXX.s3.ap-northeast-1.amazonaws.comこういうもので、最近はプロパティ画面で見れないようだ。オリジンの選択時には見れるよ

大項目 中項目 選択肢 備考
ディストリビューションを作成 ✅ Single website or app
⬜ Multi-tenant architecture - New
オリジン 🔴Origin domain handson-lab.click.s3.ap-northeast-1.amazonaws.com OACを使う場合は.S3-website...のURLはCloudFrontでは使えないかも。(両方使えると思う)
Origin path - optional
🔴名前 handson-lab.clicks3.ap-northeast-1.amazonaws.com 自動で入力されるかも
🔴オリジンアクセス ✅ Public
⬜ Origin access control settings (recommended)
⬜ Legacy access identities
通常はOACだが今回はまだ使わない
カスタムヘッダーを追加 - オプション
Enable Origin Shield ✅ いいえ
⬜ はい
Connection attempts 3 追加設定(▼)をクリックして開くと、この項目が表示されます。
Connection timeout 10 追加設定(▼)をクリックして開くと、この項目が表示されます。
Response timeout 30 追加設定(▼)をクリックして開くと、この項目が表示されます。
Response completion timeout ⬜ Enable 追加設定(▼)をクリックして開くと、この項目が表示されます。
デフォルトのキャッシュビヘイビア パスパターン デフォルト (*) Default (*)
オブジェクトを自動的に圧縮 ⬜ No
✅ Yes
ビューワープロトコルポリシー ⬜ HTTP and HTTPS
✅ Redirect HTTP to HTTPS
⬜ HTTPS only
許可された HTTP メソッド ✅ GET, HEAD
⬜ GET, HEAD, OPTIONS
⬜ GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE
ビューワーのアクセスを制限する ✅ No
⬜ Yes
レスポンスヘッダーポリシー - オプション ✅ Cache policy and origin request policy (recommended)
⬜ Legacy cache settings
Cache policyは、CloudFrontがオリジンから取得したレスポンスをどの条件(ヘッダー・クエリ文字列・Cookie)で別キャッシュとして保存し、どのくらいの期間(TTL)保持するかを決める設定であり、Origin request policyはCloudFrontがオリジンにリクエストを送る際にどのリクエスト情報(ヘッダー・クエリ文字列・Cookie)を渡すかを決める設定です。
キャッシュポリシー ✅ CachingOptimized
⬜ CachingDisabled
⬜ CachingOptimizedForUncompressedObjects
⬜ Elemental-MediaPackage
⬜ Amplify-DefaultNoCookies
⬜ Amplify-Default
⬜ Amplify-StaticContent
⬜ Amplify-ImageOptimization
⬜ UseOriginCacheControlHeaders
⬜ UseOriginCacheControlHeaders-QueryStrings
CachingOptimizedは、静的コンテンツ配信向けにキャッシュキーを最小限(Accept-Encodingのみ)とし、長めのTTLでキャッシュ効率を高めるCloudFrontのマネージドCache policyです。
オリジンリクエストポリシー - オプション ✅ None
⬜ UserAgentRefererHeaders
⬜ AllViewer
⬜ CORS-S3Origin
⬜ CORS-CustomOrigin
⬜ Elemental-MediaTailor-PersonalizedManifests
⬜ AllViewerAndCloudFrontHeaders-2022-06
⬜ AllViewerExceptHostHeader
レスポンスヘッダーポリシー - オプション ✅ None
⬜ SimpleCORS
⬜ CORS-With-Preflight
⬜ CORS-with-preflight-and-SecurityHeadersPolicy
⬜ CORS-and-SecurityHeadersPolicy
⬜ SecurityHeadersPolicy
スムーズストリーミング ✅ No
⬜ Yes
追加設定(▼)をクリックして開くと、この項目が表示されます。
フィールドレベル暗号化 - 追加設定(▼)をクリックして開くと、この項目が表示されます。
リアルタイムログを有効にする ✅ No
⬜ Yes
追加設定(▼)をクリックして開くと、この項目が表示されます。
関数の関連付け - オプション ビューワーレスポンス 関数タイプ ✅ 関連付けなし
⬜ Lambda@Edge
⬜ CloudFront function
関数 ARN/名前 -
本文を含める -
ビューワーレスポンス 関数タイプ ✅ 関連付けなし
⬜ Lambda@Edge
⬜ CloudFront function
関数 ARN/名前 -
本文を含める -
オリジンリクエスト 関数タイプ ✅ 関連付けなし
⬜ Lambda@Edge
関数 ARN/名前 -
本文を含める -
オリジンレスポンス 関数タイプ ✅ 関連付けなし
⬜ Lambda@Edge
関数 ARN/名前 -
本文を含める -
🔴ウェブアプリケーションファイアウォール (WAF) ⬜ セキュリティ保護を有効にする
✅ セキュリティ保護を有効にしないでください
仕事では有効にすると思う
設定 Anycast static IP list - 作ってないので選択不可です
料金クラス ✅ すべてのエッジロケーションを使用する (最高のパフォーマンス)
⬜ 北米と欧州のみを使用
⬜ 北米、欧州、アジア、中東、アフリカを使用
代替ドメイン名 (CNAME) - オプション 今回はまだ使わない
Custom SSL certificate - optional 今回はまだ使わない
🔴デフォルトルートオブジェクト - オプション index.html 指定しないと動かないと思う。/にアクセスしたら自動でindex.htmlを読み込む機能はない。新UIでは作成時に設定できないかも
IPv6 ⬜ オフ
✅ オン
オンでもオフでも問題ないと思う
🔴説明 - オプション handson Distribution Description 設定はしますが使いません
Standard logging ログ配信 ✅ オフ
⬜ オン

3.1.2 ディストリビューションの修正 

ハンズオン内では修正してますが、作成時にすべての設定が完了しているので作業はありません。

動作確認
この時点でブラウザでCloudFrontにアクセスすれば画面が表示可能。この時点ではCloudfront経由でS3にアクセスしています。またCloudFront上でファイルがキャッシュされます。
例)https://XXXXXXXXXXXXXXX.cloudfront.net/
httpはhttpsにリダイレクトされるようです

3.1.3 CloudFrontキャッシュ確認

キャッシュしているか否かは、ブラウザ→デベロッパーツール(Ctrl + Shift + i)→ネットワークタブ→HeadersタブでX-Cacheの項目を見るようです。

image.png

  • X-Cache Miss from CloudFront → CloudFrontでキャッシュしてない
  • X-Cache Hit from CloudFront → CloudFrontでキャッシュしている

うまくいかないときはCloudFront側のキャッシュを削除する必要があります。キャッシュはブラウザにもあるが、Disable cacheのチェックを入れておけばブラウザではキャッシュしないようです。
Nameにindex.htmlが表示されてないが、AI曰く、今回の設定ではXXXX.cloudfront.netがindex.htmlに相当するらしいです。嘘かもしれない

4. 第3形態

image.png

上記構成は、Route 53で独自ドメインを設定し、Route 53経由でS3の静的コンテンツへHTTPアクセスできるようにする構成です。
画像はハンズオンより引用

4.1 Route 53

4.1.1 ドメインの取得

ドメインはすでに持っているので、今回は取得しません。ハンズオンの動画の通り購入すればOKです。.clickドメインが安いです。

4.1.2 ホストゾーンの作成

  • Route 53 > ホストゾーン > ホストゾーンの作成をクリック
大項目 中項目 選択肢 備考
ホストゾーン設定 🔴ドメイン名 handson-lab.click
🔴説明 - オプション handson host zone description
タイプ ✅ パブリックホストゾーン
⬜ プライベートホストゾーン
🔴タグ name: handson-lab.click 設定はしますが使いません

4.1.3 ネームサーバ修正

以下はハンズオン動画では触れられてないかもしれません。ドメインを新規に購入していた場合は作業不要ですが、すでに持っていたドメインを使う場合は修正が必要です。

  • Route 53 > ホストゾーン > handson-lab.click

この画面のネームサーバを手元にコピーしておきます。
image.png

  • Route 53 > 登録済みドメイン > handson-lab.click > アクション > ネームサーバを編集

設定値をコピーしたネームサーバに書き換えてください。
image.png

  • WindowsのPowerShell起動
    ネームサーバを更新後、nslookupが成功すれば設定完了です。10分程度時間がかかります。
# 失敗
PS C:\Users\user> nslookup handson-lab.click
サーバー:  UnKnown
Address:  192.168.86.1

*** UnKnown  handson-lab.click を見つけられません: Server failed

# 成功
PS C:\Users\user> nslookup handson-lab.click
サーバー:  UnKnown
Address:  192.168.86.1

権限のない回答:
名前:    handson-lab.click
Addresses:  52.219.16.136
          3.5.156.197
          52.219.162.63
...

4.1.4 レコードの作成(Aレコードができます)

  • Route 53 > ホストゾーン > handson-lab.click > レコードを作成をクリック

本設定でRoute53がS3に向きます

大項目 中項目 選択肢 備考
レコードをクイック作成 レコード名 静的ウェブホスティングでは入力NG
レコードタイプ ✅ A – IPv4 アドレスと一部の AWS リソースにトラフィックをルーティングします。
⬜ AAAA – IPv6 アドレスと一部の AWS リソースにトラフィックをルーティングします。
⬜ CNAME – 別のドメイン名および一部の AWS リソースにトラフィックをルーティングします。
⬜ MX – メールサーバーを指定します。
⬜ TXT – メール送信者の検証とアプリケーション固有の値に使用されます。
⬜ PTR – IP アドレスをドメイン名にマッピングします。
⬜ SRV – サーバーを識別するアプリケーション固有の値です。
⬜ SPF – 非推奨
⬜ NAPTR – DDDS アプリケーションで使用されます。
⬜ CAA – ドメインの SSL/TLS 証明書を作成できる CA を制限します。
⬜ NS – ホストゾーンのネームサーバー
⬜ DS – 委任署名者。DNSSEC の信頼チェーンを確立するために使用されます。
...
🔴エイリアス ✅ 有効
🔴トラフィックのルーティング先 ⬜ API Gateway API
⬜ AppRunner サービスへ
⬜ AppSync ドメイン名
⬜ CloudFront ディストリビューションへ
⬜ Elastic Beanstalk 環境へ
⬜ Application Load Balancer と Classic Load Balancer
⬜ Network Load Balancer
⬜ Global Accelerator
⬜ Alias to LightSail container service
⬜ Alias to OpenSearch domain endpoint
✅ S3 ウェブサイトエンドポイント
🔴リージョン ap-northeast-1
🔴S3エンドポイント s3-website-ap-northeast-1.amazonaws.com
ルーティングポリシー ✅ シンプルルーティング
⬜ 加重
⬜ 位置情報
⬜ レイテンシー
⬜ フェイルオーバー
⬜ 複数値回答
⬜ IP ベース
⬜ 地理的近接性
シンプルルーティングは、単一のDNSレコードで単一のエンドポイントへ名前解決する最も基本的な方式で、重み付け・レイテンシ・フェイルオーバーなどの分岐は行いません。
ターゲットのヘルスを評価 ✅ はい 「ターゲットのヘルスを評価(Evaluate target health)」は、Route 53 のエイリアス先(例:ALBや同ゾーン内の別レコード)が“健康”かを見て、DNS 応答から不健康な先を除外する設定です(Yesにすると健康な先だけ返す/Noだと不健康でも返すことがある)。

動作確認
この時点でブラウザから Route 53 のドメインにアクセスすると画面が表示されます。
これは Route 53 → S3 に直接接続しており、CloudFront は経由していません
https では動作しないため注意してください。
例)
http://handson-lab.click/
https://handson-lab.click/

5. 第4形態

image.png

上記構成は、ACM(AWS Certificate Manager)でSSL/TLS証明書を作成し、CloudFrontに適用してHTTPS接続を実現する構成です。
Route 53で独自ドメインを設定し、CloudFront経由でS3の静的コンテンツにアクセスします。
最終的にS3への直接アクセスは禁止し、CloudFrontのみを経由させます。 (この部分は第5形態で実施)
※画像はハンズオンより引用

5.1 ACM

5.1.1 証明書作成

  • AWS Certificate Manager > 証明書 > リクエストをクリック
大項目 中項目 選択肢 備考
🔴リージョン変えよう us-east-1
証明書タイプ ✅ パブリック証明書をリクエスト
⬜ プライベート証明書をリクエスト
ドメイン名 🔴完全修飾ドメイン名 handson-lab.click
エクスポートを許可 ✅ エクスポートを無効にする
⬜ エクスポートを有効にする
検証方法 ✅ DNS 検証 - 推奨
⬜ E メール検証
キーアルゴリズム ✅ RSA 2048
⬜ ECDSA P 256
⬜ ECDSA P 384
🔴タグ name: handson acm 設定はしますが使いません

証明書発行後は、ステータスが保留中の検証となり、次のアクションが必要です。

5.1.2 レコードを作成(CNAMEレコード)

  • AWS Certificate Manager > 証明書 > c3372ea6-5f0d-42b4-84f8-57595c32eb5f(作った証明書のID)> Route 53でレコードを作成をクリック

その後、Route53のホストゾーンでCNAMEレコードが作成されます。そして10分ぐらい待つと証明書ステータスが発行済みとなります。ネームサーバの修正が漏れているとステータスは変わりません。また証明書の一覧画面ではステータスが変わってないが、詳細画面では変わっているといったことも起きます。

ややこしいのですが、ACM側の操作でRoute 53にレコードが追加されます。Route 53側にCNAMEが追加されて証明書が承認される仕様です。AWS公式マニュアルにも書いてあります。

5.2 CloudFront

5.2.1 ビヘイビア(タブ)

  • CloudFront > ディストリビューション > XXXXXXX(ディストリビューションID) > ビヘイビア(タブ) > 編集

HTTP to HTTPSのリダイレクトの設定はデフォルト設定になっているので設定不要です。ビヘイビア(タブ)の画面にあるので見ておきましょう。

5.2.2 一般(タブ)

  • CloudFront > ディストリビューション > XXXXXXX(ディストリビューションID) > 一般(タブ) > 編集

ここの設定がドメインでcloudfrontにアクセスできるようになるのと、https化の設定なんだと思う。ドメイン名がバケット名と一致していることも大事だと思われる。

大項目 中項目 選択肢 備考
Settings Anycast static IP list - 作ってないので選択不可です
Price class ✅ Use all edge locations (best performance)
⬜ Use only North America and Europe
⬜ Use North America, Europe, Asia, Middle East, and Africa
🔴Alternative domain name (CNAMEs) - optional handson-lab.click
🔴Custom SSL certificate - optional handson-lab.click XXXXX
⬜ Legacy clients support - $600/month ... 高額オプションである。チェックしてはいけない
🔴Security policy TLSv1.2_2021 (推奨)
Supported HTTP versions ✅ HTTP/2
⬜ HTTP/3
Default root object - optional index.html
IPv6 ⬜ オフ
✅ オン
🔴Description - optional handson Distribution Description 設定はしますが使いません

5.3 Route 53

5.3.1 レコードを修正(Aレコード)

Route 53はS3に向いているので、CloudFrontを向くように設定する

  • Route 53 > ホストゾーン > handson-lab.click > Aレコードをチェック > レコードを編集をクリック
大項目 中項目 選択肢 備考
レコードを編集 レコード名 静的ウェブホスティングでは入力NG
レコードタイプ ✅ A – IPv4 アドレスと一部の AWS リソースにトラフィックをルーティングします。
⬜ AAAA – IPv6 アドレスと一部の AWS リソースにトラフィックをルーティングします。
⬜ CNAME – 別のドメイン名および一部の AWS リソースにトラフィックをルーティングします。
⬜ MX – メールサーバーを指定します。
⬜ TXT – メール送信者の検証とアプリケーション固有の値に使用されます。
⬜ PTR – IP アドレスをドメイン名にマッピングします。
⬜ SRV – サーバーを識別するアプリケーション固有の値です。
⬜ SPF – 非推奨
⬜ NAPTR – DDDS アプリケーションで使用されます。
⬜ CAA – ドメインの SSL/TLS 証明書を作成できる CA を制限します。
⬜ NS – ホストゾーンのネームサーバー
⬜ DS – 委任署名者。DNSSEC の信頼チェーンを確立するために使用されます。
...
Aレコードが追加される設定。
エイリアス ✅ 有効
🔴トラフィックのルーティング先 ⬜ API Gateway API
⬜ AppRunner サービスへ
⬜ AppSync ドメイン名
✅ CloudFront ディストリビューションへ
⬜ Elastic Beanstalk 環境へ
⬜ Application Load Balancer と Classic Load Balancer
⬜ Network Load Balancer
⬜ Global Accelerator
⬜ Alias to LightSail container service
⬜ Alias to OpenSearch domain endpoint
⬜ S3 ウェブサイトエンドポイント
🔴ディストリビューション handson-lab.click ( XXXX.cloudfront.net)
ルーティングポリシー ✅ シンプルルーティング
⬜ 加重
⬜ 位置情報
⬜ レイテンシー
⬜ フェイルオーバー
⬜ 複数値回答
⬜ IP ベース
⬜ 地理的近接性
シンプルルーティングは、単一のDNSレコードで単一のエンドポイントへ名前解決する最も基本的な方式で、重み付け・レイテンシ・フェイルオーバーなどの分岐は行いません。
ターゲットのヘルスを評価 ✅ はい 変更不可の状態になっていた

動作確認
この時点でブラウザから Route 53 のドメインにアクセスすると画面が表示されます。
これは Route 53 → S3 に直接接続ではなく、CloudFront 経由となります

  1. route 53にアクセスして画面が表示されることを確認。ちゃんとCloudFront経由に切り替わったのか気になりましたが、今回は設定値を信じることにします。不安な人はS3のサーバアクセスログとかを有効にすればアクセス元が切り替わったことがおそらく分かると思います
    https://handson-lab.click

  2. httpがhttpsにリダイレクトされること
    http://handson-lab.click -> https://handson-lab.click にリダイレクトされることを確認

  3. httpsが有効なことを確認
    image.png

6. 第5形態

image.png

上記構成は、第4形態の続きで❌の部分を実装します。S3への直接アクセスは禁止し、CloudFrontのみを経由させます。CloudFrontのOACを使います。
※画像はハンズオンより引用

6.1 CloudFront

6.1.1 OACの設定

OACはOAIの後継の機能です。ハンズオンではOAIの方を使ってますが、今回はOACを使います
OACを作成し、OAC経由でS3にアクセスする設定を行います

オリジン(タブ)

  • CloudFront > ディストリビューション > XXXXXXX(ディストリビューションID) > オリジン(タブ) > 対象オリジン選択 > 編集
大項目 中項目 選択肢 備考
設定 Origin domain handson-lab.click.s3.ap-northeast-1.amazonaws.com
Origin path - optional
名前 -
🔴オリジンアクセス ⬜ Public
✅ Origin access control settings (recommended)
⬜ Legacy access identities
ハンズオン動画ではOAIの設定があるがOACが新しいものだからこちらを使う
🔴Origin access control Create new OACをクリック。S3バケット等を非公開のまま「CloudFrontからのリクエストだけ許可」するための仕組み(OAIの後継)です
カスタムヘッダーを追加 - オプション
Enable Origin Shield いいえ
Connection attempts 3 追加設定(▼)をクリックして開くと、この項目が表示されます。
Connection timeout 10 追加設定(▼)をクリックして開くと、この項目が表示されます。
Response timeout 30 追加設定(▼)をクリックして開くと、この項目が表示されます。
Response completion timeout ⬜ Enable 追加設定(▼)をクリックして開くと、この項目が表示されます。
  • ハンズオン動画ではRetrict Bucket AccessGrant XXXX項目の設定があるが、見たらないので無視します。
  • OACの設定は以下の通り
大項目 中項目 選択肢 備考
Create new OAC 名前 handson-lab.click.s3.ap-northeast-1.amazonaws.com 名前をどうすべきかわからなかった
🔴説明 - オプション handson oac Original Access Control
署名動作 署名リクエスト (推奨)
⬜ 認証ヘッダーを上書きしない
オリジンタイプ S3

6.2 S3

6.2.1 バケットポリシー編集

  • Amazon S3 > バケット > handson-lab.click > アクセス許可 > バケットポリシー > 編集

S3へのアクセスをCloudFront(OAC)からに限定するために、バケットポリシーをアップデートします。先の手順でコピーしたポリシーを貼り付けます。

ポリシー例
{
        "Version": "2008-10-17",
        "Id": "PolicyForCloudFrontPrivateContent",
        "Statement": [
            {
                "Sid": "AllowCloudFrontServicePrincipal",
                "Effect": "Allow",
                "Principal": {
                    "Service": "cloudfront.amazonaws.com"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::handson-lab.click/*",
                "Condition": {
                    "StringEquals": {
                      "AWS:SourceArn": "arn:aws:cloudfront::XXXXXXXXX:distribution/E1QOHG293CS4B5"
                    }
                }
            }
        ]
      }
  • E1QOHG293CS4B5はディストリビューションID

6.2.2 静的ウェブホスティングを無効化

  • Amazon S3 > バケット > handson-lab.click > プロパティ > 静的ウェブサイトホスティングを編集 > 無効にする

無効化して動くのか疑問だったが、CloudFrontにホスティング機能があるので、S3側では不要になるようです。

6.2.3 バケットのパブリックアクセスのオン

  • Amazon S3 > バケット > handson-lab.click > アクセス許可 > ブロックパブリックアクセス (バケット設定) > 編集

ハンズオンでは行ってないが、オンに戻してもよい。

6.3 最後の動作確認

  1. route53にアクセスして画面が表示されることを確認
    https://handson-lab.click

  2. 静的ウェブホスティングのURLでアクセスできないことを確認
    http://handson-lab.click.s3-website-ap-northeast-1.amazonaws.com

    アクセス不可の画面
    404 Not Found
    
    • Code: NoSuchWebsiteConfiguration
    • Message: The specified bucket does not have a website configuration
    • BucketName: handson-lab.click
    • RequestId: 1WVEFA0EBDCKWX56
    • HostId: s6uPVUn41scbz6gAej8Z3IxlApa/tlshFhXIsCfqAsXjv23+zwQS0oRZmMR6Ro9KjdSAmAKR3UE=
    
  3. バケットのオブジェクトURLでアクセスできないことを確認
    https://s3.ap-northeast-1.amazonaws.com/handson-lab.click/index.html

7. 後片付け(削除作業)

  1. Cloudfront(無効→削除)

  2. Route53

    1. ドメインは購入品なので削除しない
    2. ホストゾーンのレコードを削除する。デフォルトのレコード以外を削除。つまりAレコードとCNAMEレコードを削除する。このあとホストゾーンを削除してもよい(任意)
  3. S3バケット(バケットを空にしてから削除)

  4. ACM証明書

    1. CloudFrontの削除が終わらないと実行できません

追加作業

追加でいくつか試します。

CodePipeline導入

今はCloudFormationの画面からテンプレートを実行していますが、これをCoodePipelineから実行してみます。

Artifact用バケット作成

codepipeline-ap-northeast-artifacts-moritokey今回はこの名前で固定します。自動生成させるとランダム値が入り自動化時に苦労します。

CodePipelineを作成

  • デベロッパー用ツール > CodePipeline > パイプライン > パイプラインを作成する

※ここで自動作成するロールの主な役割はS3、GitHub、CloudFormationへのアクセスです。

大項目 中項目 選択肢 備考
🔴Category カスタムパイプラインを構築する
パイプラインの設定 🔴パイプライン名 handson-pipeline-aws-static-website-hosting-s3bucket ここはバケットを作成するパイプライン名と勘違い注意
実行モード ⬜優先済み
✅キュー
⬜並行
🔴サービスロール ✅新しいサービスロール
⬜既存のサービスロール
新規で手動で行うときは「新しいサービスロール」、自動で行うときは既存のサービスロールでいきます
🔴ロールの ARN handson-pipeline-service-role この名前のロールが生成される
高度な設定 🔴アーティファクトストア ⬜デフォルトのロケーション
✅カスタムロケーション
デフォルトのロケーションはS3です
🔴バケット codepipeline-ap-northeast-artifacts-moritokey 出力アーティファクト先を固定します
暗号化キー ✅デフォルトの AWS マネージド型キー
⬜カスタマーマネージド型キー
変数
ソース 🔴ソースプロバイダー GitHub(GitHubアプリ経由) GitHub OAuth(旧方式)は非推奨
🔴接続 github4 作った接続を選択。接続の作り方はこちら
🔴リポジトリ名 aws-static-website-hosting 目的のリポジトリを選択
🔴デフォルトブランチ main 目的のブランチを選択
出力アーティファクト形式 CodePipeline のデフォルト
✅ステージ障害時の自動再試行を有効にする
ウェブフックイベント デフォルトでOK
構築する - オプショナル ビルドステージをスキップする
構築する - オプショナル テストステージをスキップする
デプロイ デプロイプロバイダー AWS CloudFormation
リージョン アジアパシフィック(東京)
🔴アクションモード スタックを作成または更新する
🔴スタック名 handson-pipeline-aws-static-website-hosting-s3bucket ここをパイプライン作成時のスタック名と同一にしてはいけない。ここはバケットを作成するスタック
🔴アーティファクト名 SourceArtifact
🔴ファイル名 cfn/ap-northeast-1/s3/01form-handson-bucket.yaml
テンプレート設定 - オプショナル
設定ファイルを使用
⬜設定ファイルを使用
🔴機能 - オプショナル ✅CAPABILITY_IAM
✅CAPABILITY_NAMED_IAM
⬜CAPABILITY_AUTO_EXPAND
よくわからんが付けること
🔴ロール名 handson-cfn-service-role CloudFormationが使うサービスロール。バケットを作るための権限ロール
出力ファイル名 ✅ステージ障害時の自動ロールバックを設定
⬜ステージ障害時の自動再試行を有効にする
高度 ここからバケット作成スタックにパラメータを与えることが可能

さいごに

感想です

  1. ハンズオンの動画が古く躓くところが多い。
  2. 各種パラメータを文章にするのがきつかった...
  3. ハンズオンをやるだけだと全然身につかない
  4. ここまでやればかなり理解を進んだ
  5. CloudFormationとGitHub連携はあまりメリットを感じなかったが、間にCodePipelineを挟むやり方はデプロイが簡単になる印象を受けた
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?