AWS CloudFront Functionsを使用してエッジでJavaScriptを実行する方法
多くのアプリケーションはできる限り低いレイテンシーを必要としていますが、何らかのロジックを実行したいとも考えています。コンテンツ配信ネットワーク(CDN)は従来は静的でしたが、ユーザーに最も近いネットワークのエッジでコードを実行することがますます一般的になっています。
AWSにはすでにLambda@Edgeがありますよね?
CloudFront Functionsは、CDNのエッジでカスタムコードを実行するための最初の方法でも唯一の方法でもありません。AWSは以前からLambda@Edgeを提供しており、これを使用するとCDNエッジで任意のLambda関数を実行できますが、そのコストは3倍になります。
このコストは、多くの単純な変換関数をエッジで実行するのを非常に難しくします。多くの場合、単純な文字列操作や基本的なリクエスト/レスポンス以上のことを行う必要はありません。これらは、短期間だけ存在する基本的な関数によって代わりに実行できます。
したがって、CloudFront Functionsの必要性があります。これらは軽量のJavaScriptコードを実行することしかできませんが、CloudFront CDNのエッジノードすべてで実行され、Lambda@Edgeの1/6の価格で利用できます。実際、それはLambda自体よりもさらに安価です。
軽量なJSであるため、用途はかなり限られています。しかし、それでもまだいくつかの操作に適しているものがあります。例えば、以下のようなものです:
- ヘッダー操作
- URLのリダイレクトまたは書き換え
- 認証をリクエストする
- キャッシュキーの正規化
CloudFront Functionsを実行するタイミングには二つの選択肢があります:CloudFrontがCDNからレスポンスを取得する前か後のいずれかです。URLを変更したり認証トークンを検証したりする場合は、実行時期を前にすることをお勧めします。出力ヘッダーを変更するだけの場合は、時期はそれほど重要ではないかもしれません。
それができない一つのことは、キャッシュされる前にオリジンサーバーのコンテンツを操作することです。つまり、オリジンレスポンス上での操作はできません。関数はビューワーリクエストまたはビューワーレスポンスでのみ実行できます。それ以外のことについては、Lambda@Edgeを使用する必要があります。
関数は最大実行時間が1ミリ秒未満であるべきです。これにより、百万件以上のリクエストにわたってもパフォーマンスが向上します。CloudFront関数は、ファイルシステムおよびネットワークアクセスが制限された新しいプロセスベースのアイソレーションモデルを使用しており、これはLambdaの従来のVMソリューションよりもパフォーマンスの改善を図るものです。
費用の1/6と引き換えに、合計パッケージサイズは10KB、メモリは2MBを手に入れることができます。それを賢く使ってください。
CloudFront Functionsを使用して
まず最初に、もちろんCloudFront CDNを使用する必要があります。使用していない場合で、始めたいのであれば、設定方法に関するガイドを読むことができます。
CloudFrontコンソールからサイドバーの「関数」をクリックし、新しい関数を作成します。
名前を付けると、関数を構築、テスト、公開、デプロイするための画面に移動します。
もちろん、あなたが書くコードは目的によって大きく異なります。このチュートリアルでは、すべてのステータスコードを404に変更し、ウェブサイトをオフにする完全に無意味な関数を作ります。なぜなら、それがテストしやすいからです。
コードを書いた後は、「保存」をクリックすることを忘れず、次のステップであるテストに進んでください。さまざまなイベントタイプに基づいて、いくつかのサンプルテストイベントが用意されており、クライアントが送信するURLとリクエストヘッダーを選択できます。
本番環境でのようにCDNからレスポンスを取得します。これにより、ライブにする前に機能を簡単にテストできるはずです。
次に、次のページで「公開」をクリックして、関数の本番バージョンに変更を保存します。ただし、これによりCDNに自動的に適用されるわけではありません。CloudFrontディストリビューションまたは複数のディストリビューションに関連付ける必要があります。
もちろん、製品版が正しく動作していることをテストしたいでしょう。CDNに移動すると、関数が適用されているのが確認できるはずです。この場合、その関数は私の例のウェブサイトを完全に使えなくする仕事をしています。
うまくいかない場合は、追加することを検討してみてください。
console.log()
AWS CloudWatch に直接送信されるステートメントです。これは、関数が非常に軽量であるため、基本的なメトリクスを除いて利用可能な唯一のログ記録方法です。詳細については、CloudFront Functions のログ記録に関する AWS のガイドを参照できます。






