serverless-plugin-typescript で layers を指定すると ENOENT: no such file or directory になる

serverless-plugin-typescript で layers を指定すると ENOENT: no such file or directory になる

こんにちは、 kenzauros です。

Serverless Framework v3 で serverless-plugin-typescript を Lambda レイヤーと併用するとエラーに見舞われました。

解決法は、バージョンを下げただけなのですが、忘れそうなので記事にしました。

環境

今回の動作環境です。

  • Ubuntu 20.04 on WSL2 on Windows 11 Pro
  • Serverless Framework
    • Framework Core: 3.22.0 (local) 3.22.0 (global)
    • Plugin: 6.2.2
    • SDK: 4.3.2
  • serverless-plugin-typescript 2.1.2

この問題は serverless-plugin-typescript のバージョン 2.1.2 で発生します。

概要

Serverless Framework に serverless-plugin-typescript を使用しているプロジェクトで、 Lambda レイヤーを設定しようとしました。

serveless.yml
plugins:
  - serverless-plugin-typescript

layers:
  myLayer:
    package:
      artifact: .artifacts/myLayer.zip

特に問題なさそうに見えますが、なぜか ENOENT: no such file or directory エラーに見舞われました。

bash
$ sls package
~中略~
Error:
[OperationalError: ENOENT: no such file or directory, open '/home/kenzauros/hogehoge/.serverless/myLayer.zip'] {
  cause: [Error: ENOENT: no such file or directory, open '/home/kenzauros/hogehoge/.serverless/myLayer.zip'] {
    errno: -2,
    code: 'ENOENT',
    syscall: 'open',
    path: '/home/kenzauros/hogehoge/.serverless/myLayer.zip'
  },
  isOperational: true,
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: '/home/kenzauros/hogehoge/.serverless/myLayer.zip'
}

デプロイ用のディレクトリー (.serverless) に zip ファイルがないと言われています。もともと配置しているパス (.artifacts/myLayer.zip) ではないのが不可解です。

このプロジェクトではほかに serverless-layers プラグインも使っていたので、原因を突き止めるのに苦労しました。いろいろ削ぎ落としていき、最終的に serverless-plugin-typescript と layers に絞っても発生したため、やっと原因がわかりました。

serverless-plugin-typescript のリポジトリにも Issue で報告されていました。

やはり 2.1.2 のリリースで変更された部分が災いしているようです。

※2.1.2 は 2022/4/4 リリースで、 2022/10/4 時点でまだ修正版はでていません。

2.1.1 にダウングレードして解決

ということで、とりあえず問題ないバージョンだという 2.1.1 にダウングレードしました。

bash
npm install -D serverless-plugin-typescript@2.1.1

これでようやくデプロイが完了するようになりました🚀

バグの発生している 2.1.2 のリリースを見ると、この問題の直接の原因である部分のみの修正でした。この修正で SERVERLESS_FOLDER (.serverless) の直下のパスを見るようになっていました。

ということは、ひとまず 2.1.1 で問題なさそうです。

このプラグイン、TypeScript を使う上ではとても便利だと思うのですが、いまいち使われてないのでしょうか😅

kenzauros