1. ハンズオン内容
- ACM / Route 53 / S3 /CloudFront
- ハンズオンでは各リソースを段階的に作成していきます
※Cloud9はVSCodeとPowerShellで代用
※画像はAWS公式ページより引用
前提条件&注意事項
- このブログだけでは進められません。AWS公式ハンズオン動画をまず見てください。
- これらの導入が必要になると思われます。
- ドメインは購入済みであること。
handson-lab.click
は自身のドメインに読み替えてください - 一部課金が発生します(数十円程度)。終了後は必ず削除しましょう。
- 親ページ見てない人は見てね
- ドメイン名は固有なため、本ブログの記載のまま実施しても動かないと思います。
2. 第1形態
上記構成は、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らしい | |
チェックサム | |||
タグ | |||
メタデータ - オプション | データを検索するときに活用 |
プロパティ(タブ)
設定変更です。
大項目 | 中項目 | 選択肢 | 備考 |
---|---|---|---|
バケットのバージョニング | |||
タグ | |||
デフォルトの暗号化 | |||
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形態
上記構成は、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の項目を見るようです。
-
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形態
上記構成は、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
- Route 53 > 登録済みドメイン > handson-lab.click > アクション > ネームサーバを編集
- 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形態
上記構成は、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 経由となります。
-
route 53にアクセスして画面が表示されることを確認。ちゃんとCloudFront経由に切り替わったのか気になりましたが、今回は設定値を信じることにします。不安な人はS3のサーバアクセスログとかを有効にすればアクセス元が切り替わったことがおそらく分かると思います
https://handson-lab.click -
httpがhttpsにリダイレクトされること
http://handson-lab.click -> https://handson-lab.click にリダイレクトされることを確認
6. 第5形態
上記構成は、第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 Access
、Grant 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 最後の動作確認
-
route53にアクセスして画面が表示されることを確認
https://handson-lab.click -
静的ウェブホスティングの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=
-
バケットのオブジェクトURLでアクセスできないことを確認
https://s3.ap-northeast-1.amazonaws.com/handson-lab.click/index.html
7. 後片付け(削除作業)
-
Cloudfront(無効→削除)
-
Route53
- ドメインは購入品なので削除しない
- ホストゾーンのレコードを削除する。デフォルトのレコード以外を削除。つまりAレコードとCNAMEレコードを削除する。このあとホストゾーンを削除してもよい(任意)
-
S3バケット(バケットを空にしてから削除)
-
ACM証明書
- 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が使うサービスロール。バケットを作るための権限ロール | |
出力ファイル名 | ✅ステージ障害時の自動ロールバックを設定 | ||
⬜ステージ障害時の自動再試行を有効にする | |||
高度 | ここからバケット作成スタックにパラメータを与えることが可能 |
さいごに
感想です
- ハンズオンの動画が古く躓くところが多い。
- 各種パラメータを文章にするのがきつかった...
- ハンズオンをやるだけだと全然身につかない
- ここまでやればかなり理解を進んだ
- CloudFormationとGitHub連携はあまりメリットを感じなかったが、間にCodePipelineを挟むやり方はデプロイが簡単になる印象を受けた