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.

Ejecutando eleventy build (a través de npm run) como función AWS Lambda.

Tengo un proyecto de Node con eleventy, que genera HTML a partir de un archivo JSON.

Actualmente, lo ejecuto localmente usando npm run (que ejecuta el CLI de eleventy).

Aquí está el flujo de trabajo que tengo en mente:
– colocar el archivo JSON en un bucket de S3
– en cada cambio de archivo, ejecutar la generación del HTML
– enviar la salida a un bucket de S3 diferente, que sirve la página web

Conceptualmente, siento que este sería un caso de uso estándar de FaaS.

Prácticamente, me encuentro con el hecho de que el tiempo de ejecución de Node.js-Lambda siempre espera que se invoque una función manejadora explícita. Parece que Eleventy no proporciona una forma estándar de ser invocado desde el código (o aún no he descubierto eso).

Descubrí que podría construir mi paquete en un contenedor Docker y ejecutar npm run como punto de entrada. Esto seguramente funcionaría, pero parece innecesario, ya que los tiempos de ejecución de Node.js proporcionados por Lambda deberían ser capaces de ejecutar mi comando de construcción de npm si coloco mis paquetes en el artefacto de implementación.

¿Tengo un nudo en mi cerebro? ¿Algo que estoy pasando por alto?
Agradecería cualquier aporte.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para ejecutar un proyecto de Eleventy Node en AWS Lambda

    Como experto en tecnología de la información especializado en node.js, amazon-web-services, npm, aws-lambda y eleventy, aquí está mi solución para ejecutar un proyecto de Eleventy Node en AWS Lambda.

    Flujo de trabajo

    El siguiente es el flujo de trabajo para implementar un proyecto de Eleventy en AWS Lambda:

    1. Coloca el archivo JSON en un bucket de S3 (por ejemplo, my-bucket-name).
    2. Asegúrate de que tus archivos de proyecto estén en un archivo ZIP.
    3. Sube el archivo ZIP a otro bucket de S3 (por ejemplo, my-deployment-bucket).
    4. Utiliza AWS Lambda para descomprimir el archivo y ejecutar el comando npm run.
    5. Envía la salida a otro bucket de S3 (por ejemplo, my-web-bucket), el cual sirve la página web.

    Detalles de implementación

    Para implementar el flujo de trabajo anterior, sigue estos pasos:

    1. Crea una nueva función de AWS Lambda utilizando la ejecución de Node.js.
    2. En “Código de la función”, selecciona “Cargar un archivo .zip” y carga el archivo ZIP en my-deployment-bucket.
    3. Configura las siguientes Variables de entorno en la configuración de Lambda:
      • BUCKET_NAME: my-bucket-name
      • BUILD_COMMAND: npm run
      • DEPLOY_BUCKET_NAME: my-web-bucket
    4. En “Configuración básica”, establece el tiempo de espera en 5 minutos (o más, dependiendo del tamaño de tu compilación).
    5. Al comienzo del código de tu función de Lambda, incluye lo siguiente para habilitar el SDK de AWS:
      const AWS = require('aws-sdk');
      const s3 = new AWS.S3();
      
    6. Utiliza el siguiente código JavaScript para descomprimir el archivo ZIP, descargar el archivo JSON y ejecutar el comando npm run:
      const AWS = require('aws-sdk');
      const s3 = new AWS.S3();
      const exec = require('child_process').exec;
      
      exports.handler = async (event, context) => {
        try {
           const params = { Bucket: process.env.DEPLOY_BUCKET_NAME, Key: 'my-zip-package.zip' };
           const data = await s3.getObject(params).promise();
           exec(`unzip -o -q -d /tmp ${params.Key}`, (error, stdout, stderr) => {
              if (error) {
                 console.error(`error de ejecución: ${error}`);
                 return context.fail(`Error al descomprimir el paquete: ${error}`);
              }
              console.log(`stdout: ${stdout}`);
              console.error(`stderr: ${stderr}`);
              const jsonData = s3.getObject({ Bucket: process.env.BUCKET_NAME, Key: 'my-json-data.json' });
              jsonData.promise()
                 .then(data => {
                    const dataString = data.Body.toString('utf-8');
                    // Ahora puedes usar los datos JSON para generar archivos HTML
                    exec(process.env.BUILD_COMMAND, { cwd: '/tmp' }, (error, stdout, stderr) => {
                       if (error) {
                          console.error(`error de ejecución: ${error}`);
                          return context.fail(`Error al construir el proyecto: ${error}`);
                       }
                       console.log(`stdout: ${stdout}`);
                       console.error(`stderr: ${stderr}`);
                       const deployParams = {
                          Bucket: process.env.DEPLOY_BUCKET_NAME,
                          Key: `${process.env.BUILD_PATH}/index.html`,
                          Body: fs.createReadStream(`/tmp/_site/index.html`),
                          ContentType: 'text/html',
                       };
                       // Carga el archivo HTML en el bucket web
                       s3.upload(deployParams, (err, data) => {
                          if (err) {
                             console.error(`Error al cargar: ${err}`);
                             context.fail(`Error al cargar: ${err}`);
                          } else {
                             console.log(`Carga exitosa: ${data}`);
                             context.succeed(`Éxito`);
                          }
                       });
                    });
                 });
           });
        } catch (err) {
           console.error(`Error: ${err}`);
           context.fail(`Error: ${err}`);
        }
      };
      
    7. Guarda y prueba tu función de Lambda.

    Con los pasos anteriores, puedes implementar fácilmente proyectos de Eleventy en AWS Lambda y actualizar tus páginas web de manera dinámica utilizando los datos JSON en tu bucket de S3.

Comments are closed.