<我是一个真正的新手,所以如果我用错了术语,我很抱歉>
嘿,伙计们!
我正在尝试部署我的网站,我把我的前端文件放在Amplify应用程序中,它为我提供了HTTPS url。我的目标是将我的后端代码加载到EC2 ubuntu机器上,并通过pm2运行它。我很难理解如何做到这一点,我正在nodejs中编写后端代码,并且我正在使用express框架。当我在本地开发时,一切都运行得很完美。我的后端代码:
app.get('/db', (req,res) => {
let ddb = new AWS.DynamoDB({ apiVersion: "2012-08-10" });
const params = {
TableName: "blablabla",
};
let itemObj = [];
ddb.scan(params, function (err, data) {
if (err) {
console.log("Error", err);
} else {
console.log("Success", data);
data.Items.forEach(function (element, index, array) {
itemObj.push(data.Items);
res.status(200).json(itemObj);
});
}
})
关联前端代码:
function getData(username){
var xmlhttp = new XMLHttpRequest();
var url = "http://localhost/db";
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) { //request completed
result = JSON.parse(this.responseText);
blablabla
}
};
xmlhttp.open("GET", url, true);
xmlhttp.send();
}
当我使用localhost url并通过我的计算机运行服务器(npm启动服务器..)时,我确实会在放大服务上获得我想要的数据。但是当我使用EC2机器的弹性IP地址时,我得到一个错误:";通过HTTPS加载,但请求了一个不安全的XMLHttpRequest端点,该请求已被阻止
有没有办法允许这种请求?我是否使用了EC2机器的正确IP?在我看来,如果EC2为我提供HTTPS地址,它会很好地工作,我是对的还是与它无关?首先谢谢。
它在您的本地机器上工作,因为您在localhost上没有SSL证书,所以您的前端不会通过安全连接加载。当你从Amplify运行前端时,你是通过SSL连接到Amplify域名的(我希望URL类似于https://master.randomalphanumericstring.amplifyapp.com
)。因此,当该页面试图与您的EC2实例建立不安全的连接时,您的浏览器会抱怨。
您可以通过更改浏览器设置以允许混合内容来解决此问题。在Chrome中,它的设置->网站设置->不安全内容->添加站点。但这只是开发的一种变通方法,显然这对生产不起作用。
您不能向IP地址发出HTTPS请求。SSL证书必须与域名相关联。让后端依赖于特定的IP地址也不是一个非常健壮的解决方案。你有几个选择来解决这个问题:
-
生成SSL证书并将其安装在您的EC2实例上。您不能将AWS证书管理器与EC2一起使用,因此您需要从letsencrypt或其他来源获得证书。自签名不起作用,必须得到浏览器的信任。当然,你需要一个注册域名。
-
添加一个应用程序负载均衡器,该均衡器具有安全侦听器和通过ACM颁发的证书,该证书将请求定向到您的EC2实例。同样,您需要有一个可以与证书一起使用的注册域。
-
通过Amplify部署您的后端。这将在awsamazon.com域中为API端点提供安全连接。
有很多其他方法可以创建具有安全连接的应用程序后端,但这些方法应该让你开始。