Amazon Web Services ブログ
AWS LambdaのWebアプリケーションをAmazon CloudFrontで高速化する
このブログでは AWS Lambda の Function URL 機能を使って、Amazon CloudFront のオリジンとして Lambda 関数を設定する方法について説明します。Lambda Function URL 機能は、AWS リージョンにデプロイされた Lambda 関数に対して専用の HTTPS エンドポイントを提供します。
Function URL はリクエストの検証、スロットリング、カスタムオーソライザーなどの高度な機能を必要としない、パブリックエンドポイントを持つ単一機能のマイクロサービスを実装する必要があるユースケース、例えば Webhook ハンドラ、フォームデータの検証、モバイルの決済処理、広告の出稿、機械学習の推論などに最適です。
Lambda 関数の URL エンドポイントの前に CloudFront を導入することで、グローバルに分散したコンテンツ配信ネットワークを活用し、よりビューアーに近い場所でコンテンツをキャッシュすることができます。カスタムドメインを定義し、TLS による HTTPS 配信をすることができます。さらに、AWS Web Application Firewall (WAF) と AWS Shield Advanced を有効にして、悪意のあるボットからのアプリケーションの保護、一般的なアプリケーションの悪用防止、および DDoS 攻撃から保護することが可能です。
コンテンツ配信ネットワーク(CDN)サービスである Amazon CloudFront は、コンテンツ配信を高速化し、ミッションクリティカルなアプリケーションの全体的なセキュリティを向上させることができます。CloudFront は世界中のエッジロケーションのネットワークを通じて、お客様のコンテンツを配信します。ユーザーが CloudFront を通じてコンテンツをリクエストすると、リクエストは最も低いレイテンシーを提供するエッジロケーションにルーティングされ、最適なパフォーマンスで配信されます。
サーバーレスやイベント駆動型アーキテクチャを採用する Web アプリケーションが増える中、お客様は AWS Lambda をコンピューティングサービスとして利用し、イベントに応じてコードを実行し、必要なコンピューティングリソースを自動的に管理しています。一般的なユースケースとしては、オンザフライでの画像処理やマイクロサービス向けの API などがあります。これまで Lambda 関数で HTTP API を作成するには、Amazon API Gateway をフロントに導入するか、Application Load Balancer を使用する必要がありました。Lambda Function URL の提供開始により、Lambda 関数の HTTP API を素早く作成することができます。
アーキテクチャ
図1:アーキテクチャ – LambdaをオリジンとするCloudFront
CloudFront が Lambda Function URL をオリジンとして接続するという、シンプルでわかりやすいアーキテクチャになっています。Lambda Function URL を作成すると、以下のような形式で一意の URL エンドポイントが割り当てられます。
この定義を CloudFront のオリジンとして使用して、適切な CloudFront のキャッシュビヘイビアにオリジンをマッピングします。
セットアップのウォークスルー
まず、Lambda 関数 固有の URL エンドポイントを取得します
1. 関数をデプロイしたいリージョンで AWS Lambda コンソールにアクセスします
2. Node.js ベースの Lambda 関数を作成します
3. Function name を指定し、カレントの Node.js ランタイムを選択します
図2:Lambda関数の作成
4. 「Advanced settings」の下の「Enable Function URL」をチェックします。Lambda 関数はパブリックにアクセスする必要があるため、Auth type は「NONE」を選択します。すると、関数へのパブリックアクセスを許可するために、必要なリソースベースポリシーが作成されます
図3:Function URL の有効化
5. 「Create function」をクリックして関数を作成します
このウォークスルーでは、起動時に Hello from Lambda! と表示されるデフォルトのコードテンプレートを使用します
6. Function URL を取得するには、次のスクリーンショットに示すように「Configuration」タブに移動して、「Function URL – new」を選択します
図4:Function URLの取得
長方形のボックスでハイライトしている Function URL のエンドポイントをメモしてください。リンクをクリックして、デフォルトの出力である「Hello from Lambda!」を確認します
注:既存の Lambda 関数の場合、次のスクリーンショットにハイライトされているように「Configuration」タブに移動して「Function URL」を選択し、「Create function URL」をクリックすると Function URL エンドポイントを有効にすることができます
図5:既存のLambda 関数でFunction URLを有効化する
Function URL 機能の詳細についてはこちらを参照してください
次に、Amazon CloudFront の設定を作成します
この例では Lambda 関数をオリジンとするシンプルな CloudFront の設定を行うために、CloudFormation テンプレートをデプロイします。
1. バージニア北部(us-east-1)リージョンで CloudFormation スタックを起動します
2.「Parameters」セクションの「Lambda Function Endpoint」に、以下のスクリーンショットのように、先ほど取得した Function URL を入力します
図6:CloudFormation テンプレートを使用して Lambda オリジンの CloudFront をセットアップ
入力する際に Function URL から https:// と最後のスラッシュを削除します
3. テンプレートがデプロイされたら、CloudFormation スタックの「Outputs」タブに移動して、作成されたデフォルトの CloudFront ドメイン名にアクセスします。「Hello from Lambda!」というレスポンスが表示されるはずです
図7:CloudFormation の Outputs – CloudFront リソースの作成
このテンプレートでは、Lambda 関数をオリジンとする CloudFront ディストリビューションを作成します。オリジンは Lambda の Function URL エンドポイントを指し、全てのリクエストがデフォルトのキャッシュビヘイビアと関連付けられています。CloudFront の動作は Managed-CachingOptimized キャッシュポリシーを使用し、オリジンからの応答は CloudFront でキャッシュされます。
CloudFront で新しいキャッシュポリシーを定義してビヘイビアに関連付けることで、クエリ文字列、ヘッダー、Cookie を元にキャッシュしたり、Lambda 関数にそれらを渡すこともできます。
オリジン設定の一部として CloudFront がオリジンへのリクエストを行う前に、カスタムヘッダーを挿入することができます。これにより Lambda 関数でヘッダーと値の存在を検証し、CloudFront を介してリクエストがルーティングされていることを確認することができます。オリジンのカスタムヘッダーの設定についての詳細はこちらを参照してください。
これらの変更が完了した後、作成した CloudFront ドメインにアクセスしてテストすると、Lambda 関数から送信されたレスポンスが表示されるはずです。
まとめ
このブログでは Lambda Function URL エンドポイントを設定する方法を学び、それを Amazon CloudFront のオリジンとして使用することができました。この AWS Lambda の機能と Amazon CloudFront を組み合わせて、ビューアーに近い場所にコンテンツをキャッシュすることで Web アプリケーションを高速化し、ターゲットとするビューアーに安全にコンテンツを配信することができます。詳細については CloudFront Developer Guide を参照してください。
Jaiganesh Girinathan
Jaiganesh Girinathan はコンテンツデリバリーネットワークとエッジコンピューティング機能を専門とする、シニアエッジスペシャリスト・ソリューションアーキテクトです。彼は過去 20 年にわたり、世界中のメディア企業の組織のモダナイズ、プラットフォームの拡張を支援してきました。彼は顧客の主要なニーズに対応するソリューションの構築に情熱を注いでいます。仕事以外では星空を眺めていることが多いです。
Samrat Karak
Samrat Karak は Amazon CloudFront チームのシニアプロダクトマネージャーで、エッジコンピュートを担当しています。彼はシアトルに拠点を置き Lambda@Edge と CloudFront Functions を使ったエッジコンピュートでお客様のユースケースを理解、課題を解決することに情熱を傾けています。彼はエンタープライズソリューションと AWS の構築・管理で 15 年以上の経験を持ちます。
翻訳は SA 森が担当しました。原文はこちらをご覧ください。