事象
Lambda(Node.js) → DynamoDB に接続するがブラウザテストではうまくいく。
しかしJMeterでスレッド1~10で数分間負荷をかけると、最初のほうが良いが、しばらくすると 502エラー(getaddrinfo EBUSY dynamodb.ap-northeast-1.amazonaws.com)が断続的に発生する。
対策(AWSからの回答)
handler内でAWS SDKのサービスクライアントを生成すると発生するとのこと。
↓エラーになるコード
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
export const handler = async (event) => {
const client = new DynamoDBClient({}); <==== handler関数の中で new DynamoDBCLientしているのがダメっぽい
// 処理
};
↓対策済コード
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
const client = new DynamoDBClient({}); <==== handler関数の外側で new DynamoDBCLientするとイケる
export const handler = async (event) => {
// 処理
};
自分の場合には、Modelクラスを作って各Modelの中で それぞれ new DynamoDBClient していたのがダメらしいです。
なので、handlerがあるファイル index.js の中で グローバル変数として new DynamoDBClient({}); してあげて、各Modelでは、グローバル変数を使用するように変更しました。
※あんまりグローバル変数つかいたくは無いんですが、仕方なし。
↓具体的にはコレ(serverlessExpress使ってます)
global.dynamodbClient = new DynamoDBClient({ <=== これを各Modelで使いまわす
region: process.env.AWS_REGION,
});
export const handler = serverlessExpress({ app });
以上