あめがえるのITブログ

頑張りすぎない。ほどほどに頑張るブログ。

Amazon CloudFront Functionsを使ってみた

CloudFrontにFunctionsなる機能を見つけたのでチュートリアルを行って挙動を見てみた。

CloudFront Functionとは

JavaScriptで軽量な関数を記述し、レイテンシーの影響を受けやすいCDNのカスタマイズを大規模に実行できる。関数を使用して、CloudFrontを通過するリクエストとレスポンスを操作、基本認証と認証の実行、エッジでのHTTPレスポンスの生成などを行うことができる。runtime環境は起動時間が1ミリ秒未満、毎秒数百万のリクエストを処理するようにすぐスケールでき、高い安全性を誇る。CloudFront内でコードを完全に構築、テスト、デプロイできる。

docs.aws.amazon.com

チュートリアル

下記チュートリアルを参考に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に一任できるので便利かも。(´ω`)