EC2再起動用lambdaをNode.js 14 からNode.js 20 に変更してハマった点

December 16, 2023
tag icon
Node.js
tag icon
lambda
tag icon
ec2

最近 Node.js 14 ランタイムのlambdaを Node.js 20 に移行する機会があったのですが、lambdaで使われるAWS SDKがv2からv3に変わっていてそのままでは動きませんでした。EC2再起動などのキーワードでググってみるとAWS公式なども古い記法のサイトがヒットするので、参考にコードを紹介します。

コード例

import { EC2Client, RebootInstancesCommand } from "@aws-sdk/client-ec2";

export const handler = async () => {
	const client = new EC2Client({});
	const command = new RebootInstancesCommand({
		InstanceIds: [
			"i-1234567890abcdef5"
		],
	});
	try {
		await client.send(command);
		console.log("Instance rebooted successfully.");
	} catch (err) {
		console.error(err);
    }
};

ポイント

requireの代わりにimportを使う

AWS SDK for JavaScriptは何ですか。にも書かれてますが、AWS SDK for JavaScript がv2からv3に変わるのに伴ってCommonJS import記法からES Modules import記法に変更が必要です。またaws-sdk全体での指定はできないので、その中のモジュールまで記載が必要です(その分読み込まれるモジュールの量が減り、効率的になります)。

//CommonJS import (old style)
var AWS = require("aws-sdk");

// ES Modules import (new style)
import { EC2Client, RebootInstancesCommand } from "@aws-sdk/client-ec2"; 

EC2clientインスタンスはimportじゃなくてnewで生成する

JavaScript (v3) 用 SDK を使用したAmazon EC2 の例 の「インスタンスの再起動」記載例は相対パスのJSからEC2clientインスタンスをとりに行くようになっており、lambdaでの動作について考慮されてません。 リファレンスのRebootInstancesCommandに記載例があるのですが、EC2clientインスタンスはnewで生成が可能です。リファレンス記載例は引数 config が書かれてますが、このときEC2clientの引数は空で大丈夫です。

// not work on lambda
import { client } from "../libs/client.js";

// work on lambda
const client = new EC2Client({});

参考文献

  1. AWS SDK for JavaScriptは何ですか。
  2. JavaScript (v3) 用 SDK を使用したAmazon EC2 の例 の「インスタンスの再起動」
  3. RebootInstancesCommand

Profile picture

i氏 システムのデザインが好きな自称システムアーキテクト。データサイエンティスト見習い。Jamstackのアーキテクチャーに感動して、Gatsbyでブログを始めました。