从 Amplify 服务向 EC2 机器发送 GET 请求
Send GET request from Amplify service to EC2 machine
<我是一个真正的新手,所以如果我使用的术语不正确,我很抱歉。 >
大家好!
我正在尝试部署我的网站,我将前端文件放在为我提供 HTTPS url 的 Amplify 应用程序中。
我的目标是将我的后端代码加载到 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();
}
当我通过我的计算机使用本地主机 url 和 运行 服务器时 (npm start server..) 我确实得到了我在放大服务上寻找的数据。
但是 当我使用 EC2 机器的弹性 IP 地址时,我得到一个错误:" was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint, This request has been blocked "
有什么办法可以允许这类请求吗?
我是否使用了 EC2 机器的正确 IP?
在我看来,如果 EC2 为我提供了一个 HTTPS 地址,它就可以正常工作,我是对的还是与它无关?
提前致谢。
它可以在您的本地计算机上运行,因为您在本地主机上没有 SSL 证书,所以您的前端不会通过安全连接加载。当您 运行 来自 Amplify 的前端时,您正在通过 SSL 连接到 Amplify 域名(我预计 URL 类似于 https://master.randomalphanumericstring.amplifyapp.com
)。因此,当该页面试图与您的 EC2 实例建立不安全的连接时,您的浏览器会抱怨。
您可以通过更改浏览器设置以允许混合内容来解决此问题。在Chrome中,是设置->站点设置->不安全内容->添加站点。但这只是开发的一种解决方法,显然不适用于生产。
您不能向 IP 地址发出 HTTPS 请求。 SSL 证书必须与域名相关联。让您的后端依赖于特定的 IP 地址也不是一个非常可靠的解决方案。您有几个选项可以解决这个问题:
生成 SSL 证书并将其安装在您的 EC2 实例上。您不能将 AWS Certificate Manager 与 EC2 一起使用,因此您需要从 letsencrypt 或其他来源获取证书。自签名行不通,它必须被浏览器信任。当然,您需要一个注册域名。
添加带有安全侦听器的应用程序负载均衡器和通过 ACM 颁发的证书,将请求定向到您的 EC2 实例。同样,您需要有一个可以与证书一起使用的注册域。
通过 Amplify 部署您的后端。这将为 API 端点提供 awsamazon.com 域中的安全连接。
还有许多其他方法可以创建具有安全连接的应用程序后端,但这些应该可以帮助您入门。
<我是一个真正的新手,所以如果我使用的术语不正确,我很抱歉。 >
大家好!
我正在尝试部署我的网站,我将前端文件放在为我提供 HTTPS url 的 Amplify 应用程序中。 我的目标是将我的后端代码加载到 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();
}
当我通过我的计算机使用本地主机 url 和 运行 服务器时 (npm start server..) 我确实得到了我在放大服务上寻找的数据。 但是 当我使用 EC2 机器的弹性 IP 地址时,我得到一个错误:" was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint, This request has been blocked "
有什么办法可以允许这类请求吗? 我是否使用了 EC2 机器的正确 IP? 在我看来,如果 EC2 为我提供了一个 HTTPS 地址,它就可以正常工作,我是对的还是与它无关? 提前致谢。
它可以在您的本地计算机上运行,因为您在本地主机上没有 SSL 证书,所以您的前端不会通过安全连接加载。当您 运行 来自 Amplify 的前端时,您正在通过 SSL 连接到 Amplify 域名(我预计 URL 类似于 https://master.randomalphanumericstring.amplifyapp.com
)。因此,当该页面试图与您的 EC2 实例建立不安全的连接时,您的浏览器会抱怨。
您可以通过更改浏览器设置以允许混合内容来解决此问题。在Chrome中,是设置->站点设置->不安全内容->添加站点。但这只是开发的一种解决方法,显然不适用于生产。
您不能向 IP 地址发出 HTTPS 请求。 SSL 证书必须与域名相关联。让您的后端依赖于特定的 IP 地址也不是一个非常可靠的解决方案。您有几个选项可以解决这个问题:
生成 SSL 证书并将其安装在您的 EC2 实例上。您不能将 AWS Certificate Manager 与 EC2 一起使用,因此您需要从 letsencrypt 或其他来源获取证书。自签名行不通,它必须被浏览器信任。当然,您需要一个注册域名。
添加带有安全侦听器的应用程序负载均衡器和通过 ACM 颁发的证书,将请求定向到您的 EC2 实例。同样,您需要有一个可以与证书一起使用的注册域。
通过 Amplify 部署您的后端。这将为 API 端点提供 awsamazon.com 域中的安全连接。
还有许多其他方法可以创建具有安全连接的应用程序后端,但这些应该可以帮助您入门。