AWS: 런타임 분할 오류로 인해 무작위로 API 게이트웨이 502 오류가 발생함

AWS: 런타임 분할 오류로 인해 무작위로 API 게이트웨이 502 오류가 발생함

저는 AWS를 사용하고 있으며 node.js 람다 함수를 호출하는 API 게이트웨이를 통해 호출되는 API를 가지고 있습니다.

매우 자주 그러나 무작위로 502개의 응답을 받지만 똑같은 요청으로 즉시 다시 시도하면 정상적인 응답을 얻습니다. 그래서 문제가 있는지 알아보기 위해 로그를 검색해 보기로 했습니다.

다음은 요청 중 1개에 대해 내가 찾은 내용입니다.

RequestId: xxxxx Error: Runtime exited with error: signal: segmentation fault Runtime.ExitError

게다가:

xxxx    ERROR   Uncaught Exception  
{
    "errorType": "Error",
    "errorMessage": "Quit inactivity timeout",
    "code": "PROTOCOL_SEQUENCE_TIMEOUT",
    "fatal": true,
    "timeout": 30000,
    "stack": [
        "Error: Quit inactivity timeout",
        "    at Quit.<anonymous> (/opt/nodejs/node_modules/mysql/lib/protocol/Protocol.js:160:17)",
        "    at Quit.emit (node:events:527:28)",
        "    at Quit.emit (node:domain:475:12)",
        "    at Quit._onTimeout (/opt/nodejs/node_modules/mysql/lib/protocol/sequences/Sequence.js:124:8)",
        "    at Timer._onTimeout (/opt/nodejs/node_modules/mysql/lib/protocol/Timer.js:32:23)",
        "    at listOnTimeout (node:internal/timers:559:17)",
        "    at processTimers (node:internal/timers:502:7)"
    ]
}

다음은 재사용 가능한 SQL 커넥터입니다.

const CustomSecret = require('../secrets/CustomSecret');
const mysql = require("mysql");

module.exports = class MySqlConnect {

    databaseCredObject;

    constructor() {
    }

    async queryDb(sql, args) {

        if (!this.databaseCredObject) {
            await this.fetchSecret();
        }

        let connection = null;
        const connection_settings = {
            host: this.databaseCredObject.host,
            user: this.databaseCredObject.username,
            password: this.databaseCredObject.password,
            database: 'logbook'
        };

        connection = mysql.createConnection(connection_settings);

        return new Promise((resolve, reject) => {
            connection.connect(function (err) {
                if (err) {
                    console.log('error when connecting to db:', err);
                } else {
                    console.log('Connected');
                    connection.query(sql, args, function (err, result) {
                        connection.end();
                        if (err) {
                            return reject(err);
                        }
                        return resolve(result);
                    });
                }
            });
        });
    }

    async fetchSecret() {
        const databaseCredString = await CustomSecret.getSecret('secretname', 'eu-west-2');
        this.databaseCredObject = JSON.parse(databaseCredString);
    }
}

마지막으로 이것은 내 람다 함수(단축 버전)의 예입니다.

const {compress, decompress} = require("compress-json");

const MySqlConnect = require("customPackagePath/MySqlConnect");
const CustomJwt = require("customPackagePath/CustomJwt");
const AWS = require("aws-sdk");
const warmer = require("lambda-warmer");

exports.handler = async (event) => {


    if (await warmer(event)) {
        console.log("Warming");
        return 'warmed';
    }

    let responseCode = 200;
    let response = {};

    response.headers = {
        'Content-Type': 'application/json',
        'Access-Control-Allow-Origin': '*'
    };

    const bodyContent = JSON.parse(event.body);
    const dataType = bodyContent.dataType;
    const webAuth = new CustomJwt();
    const decodedToken = webAuth.decodeToken(event.headers.Authorization);
    const userUUID = decodedToken['uuid'];
    
    
    const connection = new MySqlConnect();
    
    let sql;

    switch (dataType) {
        case 'userPreferences':
            sql = await connection.queryDb('SELECT * FROM user WHERE uuid = ?', [userUUID]);
            break;
    }


    let data = [];

    for (let index in sql) {
        data.push(JSON.parse(JSON.stringify(sql[index])));

    }


    const returnData = {
        data
    };


    let compressed = compress(returnData);

    response.statusCode = responseCode;
    response.body = JSON.stringify(compressed);


    return response;
};

이제 저는 인프라 관련 내용을 처음 접했습니다. 하지만 일단 람다 함수가 호출되면 제대로 닫히거나 끝나지 않는 것 같습니다. 또한 람다 코드에서 볼 수 있듯이 함수를 따뜻하게 유지하기 위해 람다 워머를 사용하고 있는데 이로 인해 문제가 발생하는지 확실하지 않습니다.

내가 알아낼 수없는 것 같으니 도움을 주시면 감사하겠습니다.

감사해요

답변1

더 많은 조사를 한 후 저는 이것을 Lambda 함수에 추가하기로 결정했습니다.

exports.handler = async (event, context, callback) => {

그리고 이렇게 돌아왔다

callback(null, response);

그 이후로 이 문제는 해결된 것 같습니다. 이유를 완전히 확신할 수는 없지만 지금은 좋아 보입니다. :)

공유 편집 삭제

관련 정보