CloudFront+APIGateway+Lambda構成のレスポンスタイム改善

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

CloudFront+APIGateway+Lambda構成のサーバレスアーキテクチャで
Lambdaの非同期呼び出しを行いレスポンスタイム改善を実施しました。

目次

実行環境

上記のような環境で、レスポンスを即時返却するためのLambdaからメイン処理のLambdaを非同期呼び出し
利用言語はPythonとなります。

改善

Lambdaの非同期呼び出し

負荷試験を実施し同時リクエスト数を増やして行くと平均レスポンスがどんどんと遅くなっていく事が
分かったため、非同期呼び出しに変更する事でレスポンスをある程度一定に抑える事ができるようになりました。

APIGateway + Lambdaの組み合わせで非同期化の記事も多く参考になりましたが、
現在のBoto3 マニュアルを読むと、invoke_async は非推奨となっておりその変わりに
InvocationType にEventを指定しろとの事でした。

http://boto3.readthedocs.io/en/latest/reference/services/lambda.html#Lambda.Client.invoke

You can optionally request asynchronous execution by specifying Event as the InvocationType.

def lambda_handler(event, context):
    validate処理等々
    ...
    lambda_client = boto3.client("lambda")
    lambda_client.invoke(
        FunctionName="async_lambda",
        InvocationType="Event",
        Payload=payload
    )

メモリ割り当て値変更

Lambdaはメモリ割り当て値で、CPUパワーも変わって来るのですが
上記程度の処理ではそこまで変わらないのでは無いかと考えておりましたが
100rpsでベンチマークを実施しました所、かなりパフォーマンスが異なる事を確認しました。

Lambdaメモリ 平均時間 99パーセンタイル値
128MB 812ms 6801ms
256MB 395ms 3434ms
1536MB 252ms 1331ms

128MB→256MBでほぼ半分のレスポンスタイムを得ることが出来ました。
但し確実にこの秒数内で帰ってくる保証はありませんのであしからず。

まとめ

最近のSaaS等では簡単にAPI連携等が行えるようになってきておりますが
サーバで処理させようとすると、新規で立てるにしても、間借りするにしても管理工数が掛かってしまうので
サーバレス構成で受けよう!というご検討が増えてくると考えております。

弊社ではそのような構成のご提案、PoCフェイズからの導入支援を行っておりますので
是非ご相談下さい。
https://www.skyarch.net/service/aws/introduction.html

参考Webサイト

https://qiita.com/suetake/items/3fc945a380af65ecf82d
ありがとうございます!

投稿者プロフィール

takashi
Japan AWS Ambassadors 2023, 2024
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております

機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.

ABOUTこの記事をかいた人

Japan AWS Ambassadors 2023, 2024 開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て 2010年よりスカイアーチネットワークスに在籍しております 機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。