最近 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({});