Node.js 18.xでコードを書いて、AWS Lambdaで稼働させたい。
AWS-SDKはランタイム搭載のAWS-SDK v3をそのまま使いたいし、コードはAWS CloudFormationのファイル内にベタ書きしてデプロイしたい(手抜き)。
CloudFormationが生成するもの
例えばCloudFormationのYAMLにベタ書きする。
# ...略...
Resources:
  LambdaFunc:
    Type: AWS::Lambda::Function
    Properties:
      Runtime: nodejs18.x
      Handler: index.handler
      Code:
        ZipFile: |
          // ベタ書きするぞおおお
          // おおおお
          // おおおお
# ...略...
すると、生成されるのはこれまで通りindex.jsである。
Node.jsコード側を合わせる
ということで、普段通りindex.mjsを期待してコードを書く(ES Modules)と動かない。
// 動かない
import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3';
export const handler = async (event) => {
    ...;
};
奥ゆかしくindex.jsを期待してコードを書く(CommonJS)ことになる。
// 動く
const { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3');
exports.handler = async (event) => {
    ...;
};
AWSマネージメントコンソールの挙動
AWSマネージメントコンソール上でLambda(nodejs18.x利用)を手動でポチポチ作成開始した場合はindex.mjsが用意されるため、「動く/動かない」の判断において混乱し易い。