在弹性Beanstalk上安装MongoDB的推荐方式

33

我已经看过日期为2014年的如何在弹性Beanstalk中安装mongodb?,但该方法已不再适用。我还查阅了https://docs.mongodb.org/ecosystem/platforms/amazon-ec2/#manually-deploy-mongodb-on-ec2

我已经设置了一个新的弹性 Beanstalk 环境,运行 Node.js,使用 1 个 Amazon Linux 2016.03 v2.1.0 64 位微型 EC2 实例。

我已经尝试使用 SSH 连接到我的实例,并使用 yum 命令安装 mongodb 包,但失败了:

$ sudo yum install -y mongodb-org-server mongodb-org-shell mongodb-org-tools

然后收到了回电:

Loaded plugins: priorities, update-motd, upgrade-helper
No package mongodb-org-server available.
No package mongodb-org-shell available.
No package mongodb-org-tools available.
Error: Nothing to do

当我首次通过ssh连接到我的实例时,我收到了以下错误警告:

This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH 
WILL BE LOST if the instance is replaced by auto-scaling. For more information 
on customizing your Elastic Beanstalk environment, see our documentation here: 
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html

目前我的环境设置为单个实例环境以节省成本。然而,将来我会升级到自动扩展环境。

因此,我想问的是,在 ec2 中是否建议通过 ssh 进行任何更改,还是应该只使用 EB CLI?

我在本地安装了 EC2 和 EB CLI,但从未使用过 EB CLI。如果我应该使用 EB,是否有推荐的安装 mongodb 的方法?


3
您不希望在Elastic Beanstalk上安装数据库。 您甚至不应该通过ssh对您的EB环境进行任何更改。 您是否没有意识到EB会自动向您的环境添加和删除服务器?它添加的新服务器将没有您的更改,而具有运行数据库等内容的旧服务器将被删除,并且您将失去所有数据。请阅读我针对此问题的答案以了解正确使用MongoDB与Elastic Beanstalk的方法:https://dev59.com/yZHea4cB1Zd3GeqPnU_p - Mark B
1
是的,我意识到了。这就是为什么我解释说我目前正在运行单服务器应用程序,但是当我升级到自动扩展时,我想知道可推荐的安装方式。感谢提供链接。 - amyloula
2个回答

52

如果有人正在寻找答案,这里是我从AWS商务支持收到的建议:

所有部署到Elastic Beanstalk的代码都需要是“无状态”的,即永远不要直接使用SSH或FTP更改运行中的beanstalk实例...因为这会导致不一致和/或数据丢失! - Elastic Beanstalk并不适用于不是无状态的应用程序。该环境旨在根据您的网络/CPU负载进行扩展,并从基本AMI构建新实例。如果实例遇到问题或底层硬件出现问题,Elastic Beanstalk将终止这些运行中的实例并替换为新实例。因此,不能对现有实例直接应用或进行“直接”代码修改,因为新实例将不知道这些直接更改。所有更改/代码都需要上传到Elastic Beanstalk控制台或CLI工具,并推送到所有运行中的实例。 Elastic Beanstalk设计概念的更多信息可在以下链接中阅读 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/concepts.concepts.design.html

建议解决方案: 考虑到上述情况,如果使用MongoDB存储应用程序数据,我们建议将MongoDB环境与Node.js应用程序分离。 例如,在Elastic Beanstalk之外创建MongoDB服务器,例如直接在EC2实例上启动MongoDB,并使用应用程序中的连接设置将Elastic Beanstalk Node.js应用程序连接到MongoDB服务器。

-创建MongoDB 以下是一些可能对您的场景有用的示例链接,供您创建MongoDB服务器。 在EC2上部署MongoDB, https://docs.mongodb.org/ecosystem/platforms/amazon-ec2/ MongoDB节点客户端 https://docs.mongodb.org/getting-started/node/client/ AWS云快速入门指南上的MongoDBhttp://docs.aws.amazon.com/quickstart/latest/mongodb/architecture.html

在Elastic Beanstalk上添加环境变量以引用您的MongoDB服务器。 创建MongoDB服务器后,可以使用环境变量将所需的连接设置传递给Elastic Beanstalk环境。 以下是使用 .ebextensions .config 的示例,您可以添加Mongo URL / 端口 / 用户等信息。

option_settings: - option_name: MONGO_DB_URL value: "Your MongoDB EC2 internal IP address"

有关如何使用环境属性并从应用程序中读取它们的信息可以在下面的链接中查看。 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs.container.html#create_deploy_nodejs_custom_container-envprop 使用 .ebextensions .config 的信息可以在以下链接中找到 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/ebextensions.html

或者,您还可以使用CLI或通过AWS控制台设置环境变量 可以按照以下链接阅读eb cli设置环境变量。 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb3-setenv.html 使用AWS控制台 要设置系统属性(AWS管理控制台)   打开Elastic Beanstalk控制台。   导航到您的环境管理控制台。   选择配置。   在软件配置部分中,选择编辑。   在环境属性下,创建名称/值...

访问环境配置设置 在运行于AWS Elastic Beanstalk中的Node.js环境中,可以使用process.env.ENV_VARIABLE访问环境变量,类似于以下示例。 process.env.MONGO_DB_URL process.env.PARAM2

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_nodejs.container.html#create_deploy_nodejs_custom_container-envprop

概要: 总的来说,我建议采取以下步骤将MongoDB与Elastic Beanstalk环境集成。 步骤1)在Elastic Beanstalk之外创建一个MongoDB服务器 步骤2)在Elastic Beanstalk中创建连接到MongoDB服务器的Node.js应用程序。


5
很遗憾,亚马逊的业务支持错过了一个非常重要的原因,即为什么您希望在与应用服务器相同的服务器上安装mongo;为了利用mongoDB集群,建议每个应用服务器都运行一个mongos(不是复数,而是字面意思上的“mongo s”)实例作为代理。OP的最初问题仍然有效,值得知道官方支持如何处理这个问题。 - don_vito
这个答案提供了使用配置文件进行操作的详细信息。(这允许自动服务重启/安装)- 您需要根据您的实例适当修改MongoDB版本。 - hitwill

0

3个选项:

1)通过SSH登录到eb实例并手动安装mongo CLI:

sudo yum-config-manager --add-repo https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/4.0/x86_64/
sudo yum install --nogpgcheck -y mongodb-org-shell

缺点是,如果EB缩小其实例数量并且您当前使用的实例被终止,则会被踢出SSH会话:

The system is going down for halt NOW!
Connection to 1.2.3.4 closed by remote host.
Connection to 1.2.3.4 closed.
ERROR: CommandError - An error occurred while running: ssh.

你需要重新开始:连接实例,安装Mongo CLI...
2)通过使用.config文件在实例上预安装Mongo CLI:
container_commands:
  01-mongocli:
    command: "sudo yum-config-manager --add-repo https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/4.0/x86_64/;sudo yum install --nogpgcheck -y mongodb-org-shell"
    ignoreErrors: true //use this the ensure instance deployment even if mongo CLI installation fails

如果实例被自动扩展器终止,您需要重新连接,但不必手动安装mongo CLI。

3)创建一个单独的实例来托管您的mongo CLI,如@amyloula的答案所述。如果您的mongodb在VPC中,则还需要在VPC中创建该单独的实例。然后,您需要创建一个网关以公开访问该实例,因为您无法直接连接到VPC中的实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接