このサイトのSSRはLambda@Edgeに任せているのですが、あまりにも遅いので暫定対応をしました。

Lambdaといえばコールドスリープ問題もあるのですが、それにしても20秒はかかり過ぎです。5秒以上ロードに時間がかかってしまったら、急いで調べ物しているエンジニアさんからは避けられてしまうのも必然です。

まずは、ログを見てみましょう。

調査

Screen Shot 2022-09-12 at 3.22.30

確かに20秒程度かかっているようです。ただ、開始時刻を確認するとほぼCPU実行時間の問題のようですね。Lambdaは2GB程度まではメモリ量とスペックが比例するため、初手はスペックで殴るのが一番です。このブログのアクセス数が増えてきたら根本解決を考えるということにしましょう。

ということで、メモリを4倍、512MBにしてみます。

対応

const edgeFunction = new aws_cloudfront.experimental.EdgeFunction(
  this,
  'EdgeFunction',
  {
    runtime: aws_lambda.Runtime.NODEJS_16_X,
    handler: 'server.handler',
    code: aws_lambda.Code.fromAsset('../dist/server'),
    timeout: Duration.seconds(20),
    memorySize: 512
  }
);

結果、約4-5秒程度になりました。元の速度の 1/4〜1/5 になったため、前評判通り、メモリ量とスペックは比例するようです。

正直これでも遅く、もっとメモリを積んだり、そもそもECSなどで実行すればもう少し良くなりそうですが、記事自体は動的生成でContentfulへの通信処理もありますので、この辺りが引き際、低カロリー運営がモットーなので一旦これぐらいで収めておこうかなと思います。