Webエンジニアの備忘録

およそ自己の作業メモとして残しております。

フロントエンドエンジニアがCloudFrontを構築してみた

SPAを自分でホスティングしたい

AWSはまだ初学レベルですが、Amplifyによるホスティングを通してSPAを簡単に公開できることに味をしめていました。

次のステップとして、もう少しコストを抑えた一般的な構成を学びたいと思っていましたが、ちょうど業務でS3・CloudFrontを用いての実装を試すことができたので、備忘録がてら記録しておきます。

使用したAWSサービス

  • S3
  • CloudFront

CloudFrontの疎通

S3バケットを作成する

まずはSPAをホスティングするバケットを用意します。

公開用バケットということで、ここでパブリックアクセスを触ってしまいそうになりますが、今回はCloudFrontで配信を行うため、まだ権限はいじりません。

f:id:tak_taniguchi:20220226011127j:plain
S3バケット作成

ファイルをアップしておきます。 (適当な index.html ファイルでOK)

<html>
<head>
  <meta charset="utf-8"/>
</head>  

<body>
テストページ
</body>

</html>

f:id:tak_taniguchi:20220226012920j:plain
SPAファイルのアップロード

CloudFrontの設定

次は本丸のCloudFrontの設定です。

S3を配信するための設定をおこなっていきます。

ディストリビューションの設定には大まかに以下の項目が含まれます。

オリジン

呼び元となるリソース、今回はS3となる。

  • 「オリジンドメイン」にS3を選択する。(プルダウンで選択可)
    • S3内のディレクトリ下を指定する場合は「オリジンパス」も指定する。こちらは空白可。
  • 任意の「名前」を入力。(プルダウン選択時に自動入力される)
  • S3バケットアクセスにて、OAIを使用する方を選択する。
    • こちらを選択した上で表示される、「新しいOAIを作成」ボタンを押下します。
    • また、バケットポリシーを自動で更新するようチェックを入れておきます。
      • 先ほどバケットの権限設定を飛ばしましたが、ここで自動的に設定が可能です。

f:id:tak_taniguchi:20220226020103j:plain

ビヘイビア

CloudFrontにアクセスがあった際のルーティングごとの振る舞い。 ここで指定のルートにS3を割り当てる。

  • 設定は任意ですが、HTTPへのアクセスをHTTPSに転送してくれるのが便利なので設定しました。
  • また、S3へのアクセスはGET、HEADに限定するのが安全です。

f:id:tak_taniguchi:20220226014820j:plain

キャッシュキーとオリジンリクエス

キャッシュを有効にさせる設定や、ルーティング解決時の関数設定などがおこなえる。

  • 今回はキャッシュの設定のみおこないます。
  • ChachingOptimaizedがS3では推奨されています。
    • ファイル更新時にキャッシュクリアの処理が必要になります。

f:id:tak_taniguchi:20220226014822j:plain

設定

最後に、設定という項目下を確認します。

  • 「デフォルトルートオブジェクト」にindex.htmlを設定します。
  • こちらを忘れると、ドメイン直下が疎通しません。

f:id:tak_taniguchi:20220226020742j:plain

動作確認

作成が完了すると、以下のようなメニューが表示されます。

f:id:tak_taniguchi:20220226021712j:plain

こちらが実際のURLの実行結果になります。

疎通成功です!

f:id:tak_taniguchi:20220226022103j:plain

おまけ

キャッシュ削除

S3ファイルを更新した際、「キャッシュ削除」の実施により迅速な確認がおこなえます。

  • 全部のキャッシュをクリアしたい場合は /* を入力。
    • 実行後、若干の待ち時間があります。

f:id:tak_taniguchi:20220226021714j:plain

所感

意外にも、CloudFrontを用いることでバケット設定をいじるよりもシンプルに公開ができたように思えます。

AWSへの接し方としては単独のサービスで解決しようとせず、適切な組み合わせを把握した上で実装することが重要に感じました。

独自ドメインの紐付け、NotFoundルーティングへの対応などもここでおこなえるので、そちらも追々書き留めていこうと思います。