如何在亚马逊 Elastic Beanstalk 中安装和启用服务?

Posted

技术标签:

【中文标题】如何在亚马逊 Elastic Beanstalk 中安装和启用服务?【英文标题】:How to install and enable a service in amazon Elastic Beanstalk? 【发布时间】:2014-03-08 02:14:27 【问题描述】:

我正用头撞墙,试图在弹性 beantalk 中安装并启用服务。我想做的是:

    /etc/init.d 中安装一个指向我在/opt/python/current/app/ 中的python 应用程序的服务

    让 Elastic Beanstalk 启动并保持服务,如 .ebextensions/myapp.config 文件中指定的那样。

(参考:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-services)

这是我的.ebextensions/myapp.config 文件:

container_commands:
  01_copy_service:
    command: "cp /opt/python/ondeck/app/my_service /etc/init.d/"
  02_chmod_service:
    command: "chmod +x /etc/init.d/my_service"

services:
  sysvinit:
    my_service:
      enabled: true
      ensureRunning: true
      files : [/etc/init.d/my_service]

这会失败,因为服务在 container_commands 之前运行。如果我注释掉服务,部署,然后取消注释服务,然后再次部署,它将起作用。但我想进行单步部署,因为这将是一个自动缩放节点。

有解决办法吗?谢谢!

【问题讨论】:

【参考方案1】:

我自己没有做过,但我想给你一些应该可行的想法。这只是方便和工作流程的问题。

由于它不是真正的应用程序文件,而是 EC2 文件,并且不太可能经常更改,因此您可以执行以下操作之一:

使用files content 创建服务初始化脚本。您甚至可以为该脚本创建一个特定的配置文件。 在 S3 上存储服务初始化脚本并使用命令复制内容。 创建虚拟服务脚本,将内容替换为从部署到容器命令和对服务的依赖上述命令的内容。 (这个很重)创建自定义 AMI 并在 Autoscaling 配置中指定。

希望对你有帮助。

【讨论】:

谢谢!我尝试了这些想法中的前三个。所有人都存在服务尝试在代码实际部署到其最终位置之前启动的问题。因此,虽然,是的,您可以运行一个脚本,但该脚本实际上不能引用您的应用程序,所以它不是那么有用。我开始认为服务不是要走的路,而在其暂存位置执行应用程序代码的container_command 可能会工作...... @Nate:嗯,使用 S3,不依赖于已部署的代码。对于文件,命令在服务之前执行。所以我看不出它是如何工作的,因为服务是在命令之后运行的。你有详细资料吗? @Nate:嗯,但是 .config 在您的项目存储库中,虽然它不是应用程序的一部分,但它是部署的一部分。我正在使用files 创建 cronjobs 配置文件,然后针对该文件调用 crontab。它工作得很好。您应该查看enabled: true,它会在 EC2 实例启动时启动服务,尽管如果您的服务之前没有部署,则没有什么可以运行...命令执行的错误日志是什么?【参考方案2】:

您可以使用services: 键下的commands: 键在命令运行后重新启动服务。 services: 键的文档在这里:

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-services

【讨论】:

是的,但在 container_commands: 运行之前仍然发生这种情况,这意味着我还没有任何访问权限... Jim 的意思是,一旦您拥有可用于服务的代码,您可以通过在服务声明中提及command 来触发服务重启。类似于我的答案中的#3。【参考方案3】:

Nate,我的情况和你一模一样,我是这样解决的:

删除“服务”部分并添加“重启”命令。

container_commands:
  ...
  03_restart_service:
    command: /sbin/service my_service restart

【讨论】:

以上是关于如何在亚马逊 Elastic Beanstalk 中安装和启用服务?的主要内容,如果未能解决你的问题,请参考以下文章