タイトルの通りで、mstdn.maud.io のメディアファイルの配信に Amazon CloudFront を採用しました。
今度は何?
前回は メディアの保存先を Amazon S3 に移行した わけですが、今度はこれらのメディアが実際に皆さんの元へと配信される経路である CDN を Amazon の提供する CloudFront に移行しました。
作業内容
- AWS Certificate Manager (ACM) でドメインに対するSSL/TLS証明書の発行をリクエスト
- CloudFront に適用できる証明書は
us-east-1
(米国東部/バージニア北部)の ACM で発行されたものに限るらしいので注意 - CAA レコードを設定しておかないと発行が通らないので気をつけましょう(2敗)
- CloudFront に適用できる証明書は
- CloudFront で
Create Distribution
→Web
を選ぶOrigin Domain Name
はエンドポイント(バケット名.s3-ap-northeast-1.amazonaws.com
)でRestrict Bucket Access
は有効にしておくとバケットのオリジンURLを直で叩けなくできそうなので設定Viewer Protocol Policy
はRedirect HTTP to HTTPS
にPrice Class
は一応US, Canada, Europe, Asia, Middle East And Africa
- もしこれらに該当しない地域からご利用頂いているユーザの方はご一報ください。
All Edge Locations (Best Performance)
にするかしばらく悩みます
- もしこれらに該当しない地域からご利用頂いているユーザの方はご一報ください。
SSL Certificate
でさっき ACM から作った証明書を使うように
- CNAME レコードをさっき生やした
hogehoge.cloudfront.net
なドメインに向ける
何が嬉しい?
今までだと S3 から一旦外(インターネット)に出て Cloudflare にキャッシュされて、またインターネットを通して皆さんの元へ届けられていたところ、S3 から CloudFront 間が AWS 内で完結したことで、初めてファイルがキャッシュされるまでのタイムロスが軽減される…といいですね(目的の半分)。
見栄えの問題としては、カスタム404ページがいい感じに機能するようになりました。存在しないパスを開いても常に https://s3-mstdn.maud.io/index.html の中身が表示されます。
あとは ACM で証明書が発行されているので発行者が Amazon
になっていてかっこいいかもしれない(?)。
費用面の話
Cloudflare では通信量が月に2TB近くても無料で利用できたんですが、CloudFront では幾らかかるのか気になって夜も8時間しか眠れません。
とはいえ、旧構成では S3 → Cloudflare 間の最初にキャッシュされるまでの通信量が月に 150-200GB だったので、今回そこの通信料が無くなるのと合わせてどれくらいの負担になるかですね…
減らせるものは減らしておこうと考えた結果、一時的に連合リレーへの接続を取りやめています。余裕があれば戻すかも。
追記: S3 へのオリジンアクセスを拒否して CloudFront 経由のみに限定する
悪意のある第三者から S3 のオリジンに死ぬほどアクセスされて青天井…なんてことは絶対に起きてほしくないものです。
しかし前の構成では静的サイトホスティングを有効にしてCloudflareにキャッシュさせていたため、多くのファイルが公開状態にありました。
今回、CloudFront Origin Access Identity (OAI) と Mastodon で用いる IAM ユーザにのみアクセスを許可するバケットポリシーを書いて、それ以外のパブリックアクセスはブロックするように設定しました。
ブロックパブリックアクセスは2つ目の項目、 任意のアクセスコントロールリスト (ACL) を介して許可されたバケットとオブジェクトへのパブリックアクセスをブロックする のみ オン にしています。
ちなみにこれを知るまでの少しの間、以下のような最悪バケットポリシーを書いていました。CloudFront OAI と Mastodon で用いる IAM ユーザ (と、サーバIP)以外からの GET アクションを全てブロックする意図で書かれましたが、この書き方に行き着くまでの時間をだいぶ無駄にした気がします。