Closed5

Serverless Framework v9/v10/v11でホットリロードが効かなくなった時のための対処法

海都海都

最初にaws-nodejs-typescriptテンプレートを導入したときのserverless.tsが以下。

serverless.ts
import type { AWS } from "@serverless/typescript";

import hello from "@functions/hello";

const serverlessConfiguration: AWS = {
  service: "sls-handson",
  frameworkVersion: "3",
  plugins: ["serverless-esbuild", "serverless-offline"],
  provider: {
    name: "aws",
    runtime: "nodejs14.x",
    apiGateway: {
      minimumCompressionSize: 1024,
      shouldStartNameWithService: true,
    },
    environment: {
      AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1",
      NODE_OPTIONS: "--enable-source-maps --stack-trace-limit=1000",
    },
  },
  // import the function via paths
  functions: { hello },
  package: { individually: true },
  custom: {
    esbuild: {
      bundle: true,
      minify: false,
      sourcemap: true,
      exclude: ["aws-sdk"],
      target: "node14",
      define: { "require.resolve": undefined },
      platform: "node",
      concurrency: 10,
    },
  },
};

module.exports = serverlessConfiguration;
海都海都

この状態だと、handler.ts等のソースコードを編集しても、ホットリロードが効かず、編集前と同じレスポンスが返ってきてしまう。
これは、Lambdaの「一度起動したLambdaインスタンスを再利用する」挙動を再現しているものと思われ、この挙動自体はある意味正しい。

海都海都

「アイドル状態になってから何秒でシャットダウンするか」については、serverless-offlineterminateIdleLambdaTimeという設定でいじることが可能なようである。(デフォルト:60秒)
実際、この設定を0に変更したところ、ホットリロードができているように思われる。

海都海都

https://github.com/dherault/serverless-offline/issues/1584
このIssueで同様の問題を訴えていた人がおり、返答に「--reloadHandlerフラグ付けた?」と書いてあったので調べたところ、リクエストごとにHandlerを再読み込みするフラグのようで、これをtrueにして本質的な解決に至る。

このスクラップは2022/09/28にクローズされました