AWS CloudFormationでAmazon CloudFrontとALBの環境構築をしてみた

はじめに

こんにちは。Webサービス開発グループの2019年度新入社員の渡邊です。

現在、弊社ではWebサービスのインフラを以前まで利用していたニフクラからAWSへの移行を行っています。

なぜ、AWS移行をするかについての詳細はこちらのページを参考にしてください。

一部サービスはAWS移行が既に完了しており、最適化を行っていく段階にあります。その一環としてAmazon CloudFrontの導入業務を担いました。

行ったこと

結論からいいますと現在のAWS環境はユーザーがALBを経由してEC2にアクセスする仕組みになっています。

この構造にユーザーとALBの間にCloudFrontを挟んで接続を行うようにしました。

Amazon CloudFrontとは

CloudFront は、ユーザーへの静的および動的ウェブコンテンツ (.html、.css、.js、イメージファイルなど) の配信を高速化するウェブサービスであり、 CloudFront ではエッジロケーションと呼ばれるデータセンターの世界規模のネットワークを通じてコンテンツが配信されます。

CloudFront を使用して提供されているコンテンツをユーザーがリクエストすると、そのユーザーはエッジロケーションにルーティングされます。エッジロケーションでは最も低いレイテンシー (遅延時間) が提供されるので、コンテンツは可能な最高のパフォーマンスで配信されます。

-引用-Amazon CloudFront とは

簡単に言うとAWSが提供するCDN(コンテンツデリバリーネットワーク)サービスです。

ユーザーに提供するコンテンツをサーバーから直接配信せず、CDNを介して配信します。

メリット

  • 通信の安定・高速化
    • 世界187 の接続ポイント (176 のエッジロケーションと 11 のリージョン別エッジキャッシュ) を使用して、ユーザーからのリクエストが一番近いエッジサーバーで処理されます。そこからの通信はすべてAWSのネットワーク内の通信になるため高速化されます。詳しくはこちら
    • 独自SSL証明書にも対応しているので、暗号化されたコンテンツの高速配信を可能にします。
  • コスト削減
    • CloudFrontには12ヶ月間以上利用することをAmazon Web Services社に対し、約束をすると割引が実施されます。
    • 弊社は複数のサービスを開発・運用しているのでこのサービスの恩恵を受けるには、AWS移行が完了したサービスは随時対応していく必要があります。
    • 詳しくはこちらを参照してください。

AWS CloudFormationとは

EC2やALBといったAWSリソースの環境構築を設定ファイル(テンプレート)を元に自動化できるサービスです。

メリット

  • テンプレートなので同じインフラ構成をすぐに再現できます。
  • インフラ構成をバージョン管理、可視化できます。

詳しくは公式ドキュメントを参照してください。

作成したCloudFormationの説明

このテンプレートでは、Amazon CloudFrontのログを集計するためのS3とALB連携したCloudFrontを作成します。

Parametersの詳細は以下になります。

  • S3BucketName
    • CloudFrontのログを集計するためのバケット名
  • AlbDnsName
    • CloudFrontのオリジンを作成する時に必要なALBのドメイン名
  • MinimumProtocolVersion
    • TLSのバージョン
  • DefaultTTL
    • キャッシュが削除される時間のデフォルト値
  • MaxTTL
    • キャッシュが削除される時間の最大値
  • MinTTL
    • キャッシュが削除される時間の最小値
  • ErrorCacheTTL
    • エラー画面のキャッシュが削除される時間

実際の入力画面はこのようになります。パラメータは最小、最大値なども設定することが可能です。詳しくはこちら

実行手順

1.事前準備

ALBのドメイン名を調べる

CloudFront作成時にALBのドメイン名が必要になるので事前に調べます。

※今回は既存のAWS環境にCloudFrontを導入するのでALBは作成済みです。

EC2→ロードバランサーと選択していき、対象のALBを選択します。DNS名横にボタンがあるので押して、コピーします。

2.CloudFomationの実行

AWSのCloudFomationを選択してスタックの作成を選択します。

この画面では作成したテンプレートファイルをアップロードしたり、デザイナー画面でリソースを可視化しながらコードを書くことができます。詳しくはこちら

次へを押し、パラメータの値を入力したら、この後の設定は特にはないので次へを押していき、リソースの作成を選択します。

リソースの作成が始まり、20分程度で完成します。

CloudFrontとS3が作成されているのを確認できたら導入は完了です。

接続の確認方法

① ブラウザでデベロッパーツールのNetworkタブを確認する。

② X-Cacheの値を確認する。

③ CloudFrontからレスポンスが返ってくるとX-Cacheの値が、以下のうちのどれかになる。

  • Hit from cloudfront
  • RefreshHit from cloudfront
  • Miss from cloudfront

下記の画像ではX-Cacheの値がMiss from cloudfrontなのでCloudFrontからレスポンスが返却されていることがわかります。

この後、CloudFrontでヘッダーや証明書などの細かい設定はありますが、ここでは割愛します。

大変だった点

今回、CloudFormationを使って環境構築に挑戦してみましたが、CloudFormationは一部の設定が対応していない問題があるので、100%自動化するということは現状不可能でした。ですから、今回は再現できない部分は手入力してもらう形を取りました。

さらに、テンプレートのデザイナー画面ではエラーが出ていなくても実行時にエラーが発生することが多いです。AWS側が書き方のルールを定めているので公式ドキュメントをしっかりと読み込んでおかないとなかなかエラーから抜け出すことができませんでした。

最後に

CloudFrontは設定項目が多く、かつログ集計用のS3を作る必要もあります。

これをすべてのサービスに導入するには工数がかかってしまいます。加えてAWSの知識がない状態ですと手作業でのリソース作成は、ミスが発生しやすく余計に時間がかかります。

そこで、このような問題を解決し、業務の効率化を図るためにCloudFormationで環境構築の自動化をしました。

今回の業務を通して、各AWSリソースの結びつきと汎用性の高さを知ることができるようになり、ますますAWSへの関心が高まりました。

手作業している時間を別の時間に回せるので、効率化を図りたい方はぜひCloudFormationを試してみてください。

おまけ

CloudFrontのオリジンにはALBだけでなく、S3にも設定することができます。

テンプレートはこちら