CloudFrontにFunctionsなる機能を見つけたのでチュートリアルを行って挙動を見てみた。
CloudFront Functionとは
JavaScriptで軽量な関数を記述し、レイテンシーの影響を受けやすいCDNのカスタマイズを大規模に実行できる。関数を使用して、CloudFrontを通過するリクエストとレスポンスを操作、基本認証と認証の実行、エッジでのHTTPレスポンスの生成などを行うことができる。runtime環境は起動時間が1ミリ秒未満、毎秒数百万のリクエストを処理するようにすぐスケールでき、高い安全性を誇る。CloudFront内でコードを完全に構築、テスト、デプロイできる。
チュートリアル
下記チュートリアルを参考にCloudFront Functionsを設定していきます。
docs.aws.amazon.com
やること
・CloudFront Functions作成
・ブラウザとcurlコマンドで動作検証
・後始末
前提条件
CloudFrontディストリビューションが事前に作成されていること。
※今回は下記を参考に作成する。
amegaeru.hatenablog.jp
実践!
1.CloudFront Function作成
1-1.CloudFront-[関数]-[関数を作成]
1-2.下記を入力
・関数名:SampleFunction
1-3.[関数を作成]
1-4.作成した関数を選択-[構築]タブ
1-5.下記関数を入力
※ステータスコード302を返し、CloudFrontのページへリダイレクトする関数のようですね。
function handler(event) { // NOTE: This example function is for a viewer request event trigger. // Choose viewer request for event trigger when you associate this function with a distribution. var response = { statusCode: 302, statusDescription: 'Found', headers: { 'cloudfront-functions': { value: 'generated-by-CloudFront-Functions' }, 'location': { value: 'https://aws.amazon.com/cloudfront/' } } }; return response; }
1-6.[変更を保存]
1-7.[発行]タブ
1-8.[関数を発行]
1-9.[関連付けを追加]
1-10.下記を入力
・ディストリビューション:関連付けるディストリビューションを選択
・イベントタイプ:Viewer Request
・キャッシュビヘイビア:Default
1-11.「関連付けを追加]
2.関数の検証
2-1.ブラウザからディストリビューションにアクセスし、CloudFrontのページにリダイレクトされることを確認
https://ディストリビューションドメイン 例)https://d2knkl55lrrpbp.cloudfront.net/
2-2.curlを実行し、GETを実行後302が返って、CloudFrontのページにリダイレクトされることを確認
# curl -v https://d2knkl55lrrpbp.cloudfront.net/
$ curl -v https://d2knkl55lrrpbp.cloudfront.net/ * Trying 143.204.73.24:443... * Connected to d2knkl55lrrpbp.cloudfront.net (143.204.73.24) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * CAfile: /etc/ssl/certs/ca-certificates.crt * CApath: /etc/ssl/certs * TLSv1.0 (OUT), TLS header, Certificate Status (22): * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS header, Certificate Status (22): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS header, Finished (20): * TLSv1.2 (IN), TLS header, Supplemental data (23): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.2 (IN), TLS header, Supplemental data (23): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.2 (IN), TLS header, Supplemental data (23): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.2 (IN), TLS header, Supplemental data (23): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.2 (OUT), TLS header, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.2 (OUT), TLS header, Supplemental data (23): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256 * ALPN, server accepted to use h2 * Server certificate: * subject: CN=*.cloudfront.net * start date: Dec 8 00:00:00 2022 GMT * expire date: Dec 7 23:59:59 2023 GMT * subjectAltName: host "d2knkl55lrrpbp.cloudfront.net" matched cert's "*.cloudfront.net" * issuer: C=US; O=Amazon; CN=Amazon RSA 2048 M01 * SSL certificate verify ok. * Using HTTP2, server supports multiplexing * Connection state changed (HTTP/2 confirmed) * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0 * TLSv1.2 (OUT), TLS header, Supplemental data (23): * TLSv1.2 (OUT), TLS header, Supplemental data (23): * TLSv1.2 (OUT), TLS header, Supplemental data (23): * Using Stream ID: 1 (easy handle 0x55d0c01e3560) * TLSv1.2 (OUT), TLS header, Supplemental data (23): > GET / HTTP/2 > Host: d2knkl55lrrpbp.cloudfront.net > user-agent: curl/7.81.0 > accept: */* > * TLSv1.2 (IN), TLS header, Supplemental data (23): * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * TLSv1.2 (IN), TLS header, Supplemental data (23): * Connection state changed (MAX_CONCURRENT_STREAMS == 128)! * TLSv1.2 (OUT), TLS header, Supplemental data (23): * TLSv1.2 (IN), TLS header, Supplemental data (23): * TLSv1.2 (IN), TLS header, Supplemental data (23): < HTTP/2 302 < server: CloudFront < date: Sat, 05 Aug 2023 10:59:20 GMT < content-length: 0 < cloudfront-functions: generated-by-CloudFront-Functions < location: https://aws.amazon.com/cloudfront/ < x-cache: FunctionGeneratedResponse from cloudfront < via: 1.1 726e0015aca168ac32be9337e2a06ddc.cloudfront.net (CloudFront) < x-amz-cf-pop: NRT12-C2 < x-amz-cf-id: ZQ9mYWWQUfKFo-HMVsW3uqfClIByBcp5Y9pjWkOFM53eMPZi3kN2vg== < * Connection #0 to host d2knkl55lrrpbp.cloudfront.net left intact
3.後始末
2-1.CloudFront 関数の関連付けを削除
2-2.CloudFront 関数を削除
2-3.前提で作成したCloudFront ディストリビューションなどを削除
感想
複数のリージョンを跨ぐWebサイトの処理をCloudFrontに一任できるので便利かも。(´ω`)