如何将 node.js 应用程序部署到 AWS Elastic Beanstalk

Posted

技术标签:

【中文标题】如何将 node.js 应用程序部署到 AWS Elastic Beanstalk【英文标题】:How to deploy a node.js app into AWS Elastic Beanstalk 【发布时间】:2015-07-17 15:35:01 【问题描述】:

我正在尝试通过 AWS 控制台在 AWS Elastic Beanstalk 中部署示例 Nodejs 应用程序。我的 Nodejs 应用程序仅包含 HelloWorld 消息。 我的问题是单击 Elastic Beanstalk URL 时没有收到 Hello world 消息。我还检查了日志,但 Nodejs.logs 和 Error.logs 中没有错误消息。 当我检查 Elastic Beanstalk URL 时收到 "Connection Refused-due to Internal Server Error" 。我正在使用 JSON 模板通过控制台创建堆栈,我的模板包含应用程序、应用程序版本、环境和 ConfigurationTemplate 资源类型。我的 ConfigurationTemplate 资源类型 包含以下选项设置,如下所示-

"OptionSettings": [

                    
                        "Namespace": "aws:autoscaling:asg",
                        "OptionName": "MinSize",
                        "Value": "1"
                    ,
                    
                        "Namespace": "aws:autoscaling:asg",
                        "OptionName": "MaxSize",
                        "Value": "2"
                    ,
                    
                        "Namespace": "aws:autoscaling:launchconfiguration",
                        "OptionName": "EC2KeyName",
                        "Value":  "Fn::FindInMap": [ "Environments","Ref": "EnvironUsed","InstanceKeyName" ]  
                    ,
                    
                            "Namespace": "aws:autoscaling:launchconfiguration",
                            "OptionName": "IamInstanceProfile",
                            "Value": "Fn::FindInMap": ["Environments","Ref": "EnvironUsed","IamRoleProfile"]
                    ,
                    
                        "Namespace": "aws:autoscaling:launchconfiguration",
                        "OptionName": "InstanceType",
                        "Value": "t2.micro"
                    ,
                    
                        "Namespace": "aws:autoscaling:launchconfiguration",
                        "OptionName": "SecurityGroups",
                        "Value":  "Fn::FindInMap": [ "Environments","Ref": "EnvironUsed","BeanstalkSecurityGroup" ] 
                    ,
                    
                        "Namespace": "aws:ec2:vpc",
                        "OptionName": "VPCId",
                        "Value":  "Fn::FindInMap": ["Environments", "Ref": "EnvironUsed","VPC" ]
                    ,
                    
                        "Namespace": "aws:ec2:vpc",
                        "OptionName": "Subnets",
                        "Value":  "Fn::FindInMap": [ "Environments","Ref": "EnvironUsed","PrivateSubnet"]
                     ,
                    
                        "Namespace": "aws:ec2:vpc",
                        "OptionName": "ELBSubnets",
                        "Value":  "Fn::FindInMap": [ "Environments", "Ref": "EnvironUsed", "PrivateSubnet" ]
                    ,
                    
                        "Namespace": "aws:ec2:vpc",
                        "OptionName": "ELBScheme",
                        "Value": "internal"
                    ,
                    
                        "Namespace": "aws:elasticbeanstalk:environment",
                        "OptionName": "EnvironmentType",
                        "Value": "LoadBalanced"
                    ,
                    
                        "Namespace": "aws:autoscaling:trigger",
                        "OptionName": "MeasureName",
                        "Value": "CPUUtilization"
                    ,
                    
                        "Namespace": "aws:autoscaling:trigger",
                        "OptionName": "Unit",
                        "Value": "Percent"
                    ,
                    
                        "Namespace": "aws:autoscaling:trigger",
                        "OptionName": "UpperThreshold",
                        "Value": "50"
                    ,
                    
                        "Namespace": "aws:autoscaling:trigger",
                        "OptionName": "LowerThreshold",
                        "Value": "49"
                    
                ],

以下是我的示例 Nodejs 应用程序 -

var express = require('express');
var http=require('http');

var app = express();


app.set('port', process.env.PORT || 8081);


app.get('/',function(req,res)

 res.send('Hello World');

);


http.createServer(app).listen(app.get('port'), function () 
    console.log('Express server listening on port ' + app.get('port'));
);

由于我对这个 AWS 服务比较陌生,请指导我如何解决这个错误,因为我按照 AWS 文档中给出的所有说明来创建这个 Elastic Beanstalk 来部署应用程序。

【问题讨论】:

请回答这个问题。 我也有这个问题,有解决办法吗? 【参考方案1】:

我会检查安全组允许的端口 8081(或其他)上的连接

【讨论】:

对不起,我没明白你的意思。请你解释清楚为什么 Elastic beanstalk URL 不起作用。 安全组(在你的例子中是 BeanstalkSecurityGroup)代表了管理网络流量的规则,就像防火墙一样。默认情况下,它们非常严格,您可能必须允许端口上的连接。 但是我使用的是默认安全组,它允许所有流量和所有端口。这里的问题是当我点击弹性 beanstalk URL 时 servcie 没有命中,因为我没有在日志中收到任何错误。不是了解为什么服务没有点击这里并且 EB URL 需要很长时间才能显示消息,例如 - “内部服务器错误 - 连接终止”。请帮我解决这个问题。 对不起,如果不是安全组,我不知道会是什么。

以上是关于如何将 node.js 应用程序部署到 AWS Elastic Beanstalk的主要内容,如果未能解决你的问题,请参考以下文章

在aws中部署node js的方法都有哪些?

我可以使用哪些 aws 服务来部署 node.js 应用程序?

将 Node.js 页面部署到 AWS Elastic Beanstalk 后出现“hell.php”错误和“502 Bad Gateway”错误

Node.js AWS 部署错误:找不到模块

将 Node.js 应用程序部署到弹性 beanstalk

如何从部署在 AWS Elastic beanstalk 上的 node.js express 应用程序获取客户端 IP?