概要
サポート終了の関係で既存のNode.js 14のLambda@Edge関数をNode.js 18にあげるにあたってランタイムを変えるだけでは上手くいかない場合があったので備忘します。
AWS SDKが読み込めない
const aws = require("aws-sdk");
としていた部分がCannot find module 'aws-sdk'
というエラーになってしまう。
原因はAWS SDK v2がNode.js 18のランタイムには同梱されなくなり、v3をインポートする記述への変更が必要になったため。
この関数ではSSMを使っていたので、
import { SSMClient, GetParameterCommand } from "@aws-sdk/client-ssm";
のように変更
ES modules構文に変更
上記のためES modules構文を有効にするため、拡張子もindex.js
からindex.mjs
に変更。
ハンドラーの書き方も変更する
SDKの使い方を変更
SDKのバージョンが変わったので使い方を変える必要があった。
こちらの記事を参考にさせていただきました。
ES modulesでrequire構文を使う
AWS SDK以外のライブラリをrequire構文で読み込んでいたためそのままではエラーになってしまう。
このライブラリでのimport構文の書き方が見つからなかったためこちらを参考にrequireで読み込むよう回避。
余談
後から気づいたがこちらの記事のようにCommonJSの構文を維持すればよかっただけかも…。