使用AWS-Lamda RDS将React / Nodejs / Mysql项目从本地部署到AWS

时间:2020-08-17 20:32:51

标签: amazon-web-services amazon-s3 deployment aws-lambda

我正在努力使用Lamda函数配置后端,目前我有完整的堆栈应用程序,并且在本地运行良好。 我还设法部署了mysql服务器(aws rds)和前端页面(S3存储桶),当我尝试部署后端(Lamda函数)时,我对此感到有些困惑。

如果有人可以为我的以下问题提供建议或指导,请多加感谢。

Q1-我已经四处挖掘,可以看到我可以使用export.handler,但是在这里我有two API调用,我是否需要做两个saperate函数,如果可以的话那我需要上传两个文件中所有其他依赖项的zip文件吗?

Q2-是从Lamda函数连接到rds DB的正确方法,如下所示,我仍然能够执行相同的connect.query commads ....以使用mysql(它是如果我从本地访问aws-rds,当前工作正常)


     let connection = mysql.createConnection({
          host: "root.cjfdyreioui1.eu-west-2.rds.amazonaws.com", // here i connect to rds aws
          user: "root",
          password: "abc1234",
       
          database: "join_us",
          insecureAuth: true,
        });

-我压缩了大约30mb的Backend-code server.js的片段(我是否需要保留index.js文件名)


    const express = require("express");
    const mysql = require("mysql");
    const jwt = require("jsonwebtoken");
    const auth = require("./verifyTokenExisting");
    const authNew = require("./verifyTokenNew");
     const cors = require("cors");
    const cookieParser = require("cookie-parser");
    const pdf = require("html-pdf");
    const pdfTemplate = require("./documents/pdfTemplate");
    const fs = require("fs");
    
    const app = express();
    app.use(express.json());
    app.use(cookieParser());
    
    
    app.use(
      cors({
        credentials: true, // for cookies
        origin: "http://localhost:3000",
        optionsSuccessStatus: 200,
      })
    );
    let connection = mysql.createConnection({
      host: "root.cjfdyreioui1.eu-west-2.rds.amazonaws.com", // here i connect to rds aws
      user: "root",
      password: "abc1234",
   
      database: "join_us",
      insecureAuth: true,
    });
    
    
    
    //!  when clicked on signin page to verify after signin/
    
    app.post("/api/verifyifloginalready", (req, res) => {
      let token = req.cookies.yogaoutlet_access_token;
      //
    
      if (!token) {
        return res.status(401).end();
      }
    
      let decodepayload;
    
      try {
        decodepayload = jwt.verify(token, "lllfasdgfdadsfasdfdasfcadsf");
    
      } catch (error) {
        if (error instanceof jwt.JsonWebTokenError) {
       
          // if invalid token
          res.status(401).end();
        } else {
          res.status(400).end();
        }
      }
      connection.query("SELECT * FROM  users WHERE email=?;", [decodepayload.email], function (err, results) {
        res.json(results);
      });
    });
    
    ////!  LOGIN & LOGOUT
    
    app.post("/api/newuser", (req, res) => {
      let x1 = req.body;
      
      if (req.body.logout === false) {
        connection.query("SELECT * FROM  users WHERE email=?;", [x1.email], function (err, results) {
        
          if (err) console.log("13333", err);
          else {
            if (results[0].email && results[0].password) {
         
    
              if ((results[0].password == x1.password && results[0].userloginStatus == true) || (results[0].password == x1.password && results[0].userloginStatus == null)) {
                const payload = { email: results[0].email };
                 const token = jwt.sign(payload, "lllfasdgfdadsfasdfdasfcadsf");
                 res.cookie("yogaoutlet_access_token", token, {
                  maxAge: 25 * 24 * 60 * 60 * 1000,
                  httpOnly: true, // it will enable on frotend-javascript to not have access to cokkies
                  
                });
    
                res.status(200).end();
    
                  connection.query(
                  "UPDATE  users SET userloginStatus=? WHERE email=?",
                   
                  ["1", results[0].email],
                  function (err, results) {
                    if (err) throw err;
                    console.log(results);
                  }
                );
              } else {
                res.json({
                  data: "invalid  password",
                });
              }
            } else res.redirect("http://localhost:3000/about");
          }
        });
      } else {
        
        const payload = { email: req.body.email };
        console.log("339x", payload);
        const token = jwt.sign(payload, "lllfasdgfdadsfasdfdasfcadsf");
    
        res.clearCookie("yogaoutlet_access_token");
    
        res
          .json({
            data: "User Logged out",
          })
          .end();
      }
    });

1 个答案:

答案 0 :(得分:1)

第一季度: 是的,您使用export.handler是因为Lambda需要一个入口点。请参阅此处的AWS Lambda开发人员指南:https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html

但是Lambda无法运行服务器,因此必须修改server.js文件。您还需要其他东西来处理来自客户端的连接。也许API Gateway符合要求。

在部署时,您上传一个ZIP存档:https://docs.aws.amazon.com/lambda/latest/dg/nodejs-package.html

第二季度: 运行使用RDS的Node函数的AWS Lambda并不是我的强项。但是,如果您的服务器连接,执行事务然后迅速断开连接,那应该不是问题。无论如何,如果遇到问题,AWS CloudWatch都会为您提供帮助。