es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La función de AWS Lambda arroja un error “constchildProcess no está definido”.

Estoy utilizando la función AWS lambda con el siguiente código:

‘uso estricto’;

const childProcess = require(“child_process”);
const path = require(“path”);

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

return new Promise((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: “¡Copia de seguridad de la base de datos completada con éxito!”
};
}

return {
status: “failed”,
message: “¡Error al hacer la copia de seguridad de la base de datos! Consulte los registros para más detalles.”
};
};

El código anterior se ejecuta dentro del contenedor de Docker e intenta ejecutar el siguiente script de copia de seguridad:

#!/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.

Target bucket should be set in BACKUP_BUCKET variable.

AWS credentials should be available as needed by aws-cli.

Dependencies:

#

* pg_dump executable (can be found in postgresql-client- 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”

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” “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

He creado una imagen de Docker con el contenido del app.js y backup.sh con el siguiente archivo Docker:

ARG FUNCTION_DIR = “/function”

FROM nodo:14-buster

RUN apt-get update && \
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 – && \
echo “deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main” | tee /etc/apt/sources.list.d/pgdg.list && \
apt-get update && apt-get -y install postgresql-client-12

ARG FUNCTION_DIR

RUN mkdir -p ${FUNCTION_DIR} && 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”]

Estoy ejecutando el contenedor Docker creado con la imagen creada a partir del archivo Docker anterior con el siguiente comando de rizo:

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

Y tratando de golpear ese contenedor Docker con el siguiente comando de rizo:

curl -XPOST “http://localhost:9000/2015-03-31/functions/function/invocations” -d ‘{}’

Cuando ejecuto el comando de rizo, veo el siguiente error:

29 Nov 2021 10:57:30,838 [INFO] (rapidez) extensionsDisabledByLayer(/opt/disable-extensions-jwigqn8j) -> stat /opt/disable-extensions-jwigqn8j: no existe el archivo o el directorio
29 Nov 2021 10:57:30,838 [ADVERTENCIA] (rapidez) No se pueden enumerar los agentes externos error=abierto /opt/extensions: no existe el archivo o el directorio
START RequestId: 053246ef-4687-438d-aade-a6794b917b79 Version: $ LATEST
2021-11-29T10:57:30.912Z no definido INFO Ejecutando ‘app.handler’ en el directorio de función ‘/ función’
2021-11-29T10:57:30.919Z no definido ERROR constchildProcess no está definido
29 Nov 2021 10:57:30,926 [ADVERTENCIA] (rapidez) Primer error fatal almacenado en appctx: Runtime.ExitError
29/bbcoimbra@gmail.com

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el módulo childProcess no está definido, el cual se importa al principio del código. Esto podría ser debido a la falta de dependencias en el contenedor de Docker.

    Para solucionar este error, puede intentar agregar el módulo child_process como una dependencia en el archivo package.json y luego reconstruir la imagen de Docker.

    Otro problema que podría causar errores es la falta de variables de entorno en el script de respaldo. Asegúrese de proporcionar credenciales adecuadas para AWS en las líneas export AWS_ACCESS_KEY_ID yexport AWS_SECRET_ACCESS_KEY.

    También puede verificar si el contenedor de Docker tiene los permisos necesarios para acceder a los recursos de AWS, como S3 y RDS.

    Después de solucionar estos problemas, puede intentar ejecutar el contenedor de Docker nuevamente e invocar la función Lambda usando el comando curl. Si todo está configurado correctamente, debería obtener la salida esperada según lo especificado en la función Lambda.

    ¡Espero que esto ayude!

Comments are closed.