Ошибка выдачи функции AWS lambda «newPromise не определен»

#node.js #amazon-web-services #docker #amazon-s3 #aws-lambda

#node.js #amazon-веб-сервисы #docker #amazon-s3 #aws-lambda

Вопрос:

Я использую функцию AWS lambda с приведенным ниже кодом

 'use strict';
var newPromise = require('es6-promise').Promise;
const childProcess= require("child_process");
const path= require("path");

const backupDatabase = () => {
  const scriptFilePath =path.resolve(__dirname, "./backup.sh");

  return newPromise((resolve, reject) => {
childProcess.execFile(scriptFilePath, (error) => {
      if (error) {
console.error(error);
        resolve(false);
      }

      resolve(true);
    });
  });
};

module.exports.handler = async (event) => {
  const isBackupSuccessful = await backupDatabase();

  if (isBackupSuccessful) {
    return {
      status: "success",
      message: "Database backup completed successfully!"
    };
  }

  return  {
    status: "failed",
    message: "Failed to backup the database! Check out the logs for more details"
  };
};
 

Приведенный выше код, выполняемый в контейнере docker, пытается запустить приведенный ниже сценарий резервного копирования

 #!/bin/bash
#
# Author: Bruno Coimbra <bbcoimbra@gmail.com>
#
# Backups database located in DB_HOST, DB_PORT, DB_NAME
# and can be accessed using DB_USER. Password should be
# located in $HOME/.pgpass and this file should be
# chmod 0600[1].
#
# Target bucket should be set in BACKUP_BUCKET variable.
#
# AWS credentials should be available as needed by aws-cli[2].
#
# Dependencies:
#
# * pg_dump executable (can be found in postgresql-client-<version> package)
# * aws-cli (with python environment configured execute 'pip install awscli')
#
#
# References
# [1] - http://www.postgresql.org/docs/9.3/static/libpq-pgpass.html
# [2] - http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html
#
#
###############

### Variables
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
DB_HOST=
DB_PORT="5432"
DB_USER="postgres"
BACKUP_BUCKET=

###############
#
# **RISK ZONE** DON'T TOUCH below this line unless you know
#               exactly what you are doing.
#
###############

set -e

export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

### Variables
S3_BACKUP_BUCKET=${BACKUP_BUCKET:-test-db-backup-bucket}
TEMPFILE_PREFIX="db-$DB_NAME-backup"
TEMPFILE="$(mktemp -t $TEMPFILE_PREFIX-XXXXXXXX)"
DATE="$(date  %Y-%m-%d)"
TIMESTAMP="$(date  %s)"
BACKUPFILE="backup-$DB_NAME-$TIMESTAMP.sql.gz"
LOGTAG="DB $DB_NAME Backup"

### Validations
if [[ ! -r "$HOME/.pgpass" ]]; then
        logger -t "$LOGTAG" "$0: Can't find database credentials. $HOME/.pgpass file isn't readable. Aborted."
        exit 1
fi

if ! which pg_dump > /dev/null; then
        logger -t "$LOGTAG" "$0: Can't find 'pg_dump' executable. Aborted."
        exit 1
fi

if ! which aws > /dev/null; then
        logger -t "$LOGTAG" "$0: Can't find 'aws cli' executable. Aborted."
        exit 1
fi

logger -t "$LOGTAG" "$0: remove any previous dirty backup file"
rm -f /tmp/$TEMPFILE_PREFIX*

### Generate dump and compress it
logger -t "$LOGTAG"  "Dumping Database..."
pg_dump -O -x -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -w "$DB_NAME" > "$TEMPFILE"
logger -t "$LOGTAG"  "Dumped."
logger -t "$LOGTAG"  "Compressing file..."
nice gzip -9 "$TEMPFILE"
logger -t "$LOGTAG"  "Compressed."
mv "$TEMPFILE.gz" "$BACKUPFILE"

### Upload it to S3 Bucket and cleanup
logger -t "$LOGTAG"  "Uploading '$BACKUPFILE' to S3..."
aws s3 cp "$BACKUPFILE" "s3://$S3_BACKUP_BUCKET/$DATE/$BACKUPFILE"
logger -t "$LOGTAG"  "Uploaded."

logger -t "$LOGTAG"  "Clean-up..."
rm -f $TEMPFILE
rm -f $BACKUPFILE
rm -f /tmp/$TEMPFILE_PREFIX*
logger -t "$LOGTAG" "Finished."

if [ $? -eq 0 ]; then
  echo "script passed"
  exit 0
else
  echo "script failed"
  exit 1
fi
 

Я создал изображение docker с приведенным выше app.js содержание и бакуп.sh с нижеприведенным файлом docker

 ARG FUNCTION_DIR="/function"

FROM node:14-buster

RUN apt-get update amp;amp; 
    apt install -y 
    g   
    make 
    cmake 
    autoconf 
    libtool 
    wget 
    openssh-client 
    gnupg2

RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - amp;amp; 
    echo "deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list amp;amp; 
    apt-get update amp;amp; apt-get -y install postgresql-client-12


ARG FUNCTION_DIR

RUN mkdir -p ${FUNCTION_DIR} amp;amp; chmod -R 755 ${FUNCTION_DIR}

WORKDIR ${FUNCTION_DIR}

COPY package.json .
RUN npm install

COPY backup.sh .
RUN chmod  x backup.sh
COPY app.js .

ENTRYPOINT ["/usr/local/bin/npx", "aws-lambda-ric"]
CMD ["app.handler"]
 

Я запускаю контейнер docker, созданный с изображением, созданным из вышеупомянутого файла docker

 docker run -v ~/aws:/aws -it --rm -p 9000:8080 --entrypoint /aws/aws-lambda-rie backup-db:v1 /usr/local/bin/npx aws-lambda-ric app.handler
 

И пытается попасть в этот контейнер docker с помощью команды curl ниже

 curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
 

когда я запускаю команду curl, я вижу следующую ошибку

 An error I see is :"newPromise is not defined","trace":["ReferenceError: newPromise is not defined","    at backupDatabase (/function/app.js:9:3)"," 
Tried adding the variable var newPromise = require('es6-promise').Promise;, but that gave a new error "Cannot set property 'scqfkjngu7o' of undefined","trace"
 

Может ли кто-нибудь помочь мне с исправлением ошибки? Мой ожидаемый результат — это сообщение, как описано в функции, но я вижу ошибки.

Спасибо

Комментарии:

1. Ваша backupDatabase функция также должна быть объявлена асинхронной.

Ответ №1:

Узел 14 поддерживает promises изначально. Вы должны сделать:

 return new Promise((resolve, reject) => {
  childProcess.execFile(scriptFilePath, (error) => {
      if (error) {
        console.error(error);
        resolve(false);
      }

      resolve(true);
  });
 

Обратите внимание на пробел между new и Promise. Promise — это объект, и вы используете конструктор. Нет необходимости импортировать какой-либо модуль.

Комментарии:

1. абсолютно верно. Вот демонстрационный проект github.com/maslick/aws-ricky