【新機能】Amazon API Gatewayがコンテンツ圧縮をサポートしました! #serverless #adventcalendar

Amazon API Gatewayがコンテンツ圧縮をサポート

本日、Amazon API Gateway(以下 API Gateway)がコンテンツ圧縮をサポートしました。APIに設定するだけで、gzip形式に圧縮されたレスポンスを返すことができるようになります。レスポンスのデータサイズを圧縮できるため、クライアントに大きいファイルをダウンロードさせる際はもちろん、転送時間を短縮できます。

2017年12月20日(日本時間)時点で、米国東部(米国バージニア州)、米国東部(オハイオ州)、米国西部(オレゴン州)、EU(アイルランド)、EU(フランクフルト)、EU(ロンドン)、アジア太平洋(シンガポール)、アジア太平洋(東京)、アジア太平洋(シドニー)、アジア太平洋(ソウル)、アジア太平洋(ムンバイ)、AWS GovCloud(米国)、中国(北京)のリージョンでいますぐ利用できます。

設定方法

API GatewayのマネジメントコンソールのAPI設定画面で、簡単に設定できます。

「Minimum body size required for compression」は、コンテンツの圧縮を実施する最低サイズです。バイト単位で設定します。ここで設定したサイズ以上のレスポンスの場合のみ圧縮が行われます。

今回は、API Gateway + LambdaのシンプルなGET APIを作成しました。Lambda Functionは次のようなコードです。

exports.handler = (event, context, callback) => {
    console.log('Received event:', JSON.stringify(event, null, 2));
    callback(null, {
        statusCode: '200',
        body: JSON.stringify({ "message": "success" }),
        headers: {
            'Content-Type': 'application/json',
        },
    });
};

「Minimum body size required for compression」の設定後は一度デプロイを行っておきます。

リクエストしてみる

まず通常のリクエストをcurlで行ってみます。普通通りです。

$ curl --verbose https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod
*   Trying xx.xx.xx.xxx...
* TCP_NODELAY set
* Connected to xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com (xx.xx.xx.xxx) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: *.execute-api.ap-northeast-1.amazonaws.com
* Server certificate: Symantec Class 3 Secure Server CA - G4
* Server certificate: VeriSign Class 3 Public Primary Certification Authority - G5
> GET /prod HTTP/1.1
> Host: xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Content-Length: 21
< Connection: keep-alive
< Date: Wed, 20 Dec 2017 01:16:34 GMT
< x-amzn-RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
< X-Amzn-Trace-Id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
< X-Cache: Miss from cloudfront
< Via: 1.1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.cloudfront.net (CloudFront)
< X-Amz-Cf-Id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
<
* Connection #0 to host xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com left intact
{"message":"success"}

次に Accept-Encoding: gzip をヘッダーに付けてリクエストします。

$ curl --verbose -H "Accept-Encoding: gzip" "https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod"
*   Trying 13.33.28.233...
* TCP_NODELAY set
* Connected to xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com (13.33.28.233) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: *.execute-api.ap-northeast-1.amazonaws.com
* Server certificate: Symantec Class 3 Secure Server CA - G4
* Server certificate: VeriSign Class 3 Public Primary Certification Authority - G5
> GET /prod HTTP/1.1
> Host: xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com
> User-Agent: curl/7.54.0
> Accept: */*
> Accept-Encoding: gzip
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Content-Length: 39
< Connection: keep-alive
< Date: Wed, 20 Dec 2017 01:19:38 GMT
< x-amzn-RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
< Content-Encoding: gzip
< X-Amzn-Trace-Id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
< X-Cache: Miss from cloudfront
< Via: 1.1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.cloudfront.net (CloudFront)
< X-Amz-Cf-Id: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
<
* Connection #0 to host xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com left intact
�V�M-.NLOU�R*.MNr�j�U&�

圧縮されました!

まとめ

コンテンツ圧縮を実施する最低サイズを決めれるところは、カスタマイズ性があって良いですね。ぜひ活用していきましょう!