1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

Lambda(Node.js)からDynamoDBに接続したときに502(getaddrinfo EBUSY dynamodb.ap-northeast-1.amazonaws.com)が出たときの対処法

Posted at

事象

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 });

以上

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?