您如何在 AWS Elastic Beanstalk 应用程序上调用 db:seed?

Posted

技术标签:

【中文标题】您如何在 AWS Elastic Beanstalk 应用程序上调用 db:seed?【英文标题】:How do you call db:seed on AWS Elastic Beanstalk apps? 【发布时间】:2012-12-31 13:14:04 【问题描述】:

我知道您可以在每次部署时运行任务,但我只想引导数据库一次。

【问题讨论】:

【参考方案1】:

Kristian 的回答很接近,但您还应该补充:

container_commands:
  seeddb:
    command: 'export HOME=/root; rake db:seed'
    leader_only: true

因此,数据库仅从 1 个 EC2 实例中播种,而不是同时从所有这些实例中播种。根据您的 EB 部署/版本,export HOME 可能需要也可能不需要。

【讨论】:

我按照规定使用了上面的容器命令,效果很好。我必须承认我使用seed_fu。 仍然对我有用。我想知道,这个命令什么时候执行? 我仍然想知道这将如何只为数据库播种一次,这些命令不应该在每次上传新的应用程序版本时运行吗? (AFAIK leader_only 是为了避免多个实例同时运行相同的命令,这是另一回事) @GustavoRubio 您可以将if 语句放在种子文件中,以便仅在数据库为空时运行种子。【参考方案2】:

我使用此地址提供的信息创建了一个脚本,该脚本将在迁移后和每次部署后运行:http://www.emind.co/how-to/how-to-run-rake-dbseed-in-amazon-elastic-beanstalk

我更喜欢这种方法,以便我可以跟踪 EC2 实例上的文件。当我最初在我的旧服务器(运行 Linux

这里的关键是 /usr/local/bin/ 让您的 rake 命令使用正确的 rake。我直接从 /opt/elasticbeanstalk/hooks/appdeploy/pre/ 的其他脚本中获取了这个:

#.ebextensions/db_seed.config
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/13_db_seed.sh":
    mode: "00755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      . /opt/elasticbeanstalk/containerfiles/envvars
      cd $EB_CONFIG_APP_ONDECK
      su -c "leader_only /usr/local/bin/rake db:seed" $EB_CONFIG_APP_USER ||
      echo "Rake task failed to run, skipping seeding."
      true

应该注意,这个脚本仍然不正确,因为我没有运行“bundle exec rake”,如果您计划运行任何 rake 命令(这是当前 AWS 上其他脚本的功能请求),强烈建议您这样做。如果您希望所有脚本在“rake”之前运行 bundle exec,请查看此处发布的 .config 文件:https://github.com/alienfast/elastic-beanstalk

如果这仍然对您不起作用,我建议您使用 SSH 连接到您正在运行您的应用程序的一个 EC2 实例,或者部署一个运行相同 Linux/Ruby 版本的新实例并导航到“/opt/elasticbeanstalk/ hooks/appdeploy/pre/" 以查看其他脚本在做什么。

我希望其他人觉得这很有用!

【讨论】:

【参考方案3】:

要在弹性 beanstalk 实例上执行命令,您可以设置自定义命令配置,这些配置将在您更新应用程序时运行。 (In fact, there is a whole docs page dedicated to the different types of container commands you can do)。

    如果您的应用程序根目录中还没有.ebextensions 目录,请创建一个。 您在此处输入的任何文件都将运行。只要它以“.config”结尾就可以随意命名——我随意命名为seed.config

    借用 hfogel 所写的内容,您可以在其中放置如下内容:

    container_commands:
      01seed:
        command: rake db:seed
    

    将此新代码添加到您的存储库中:git add . 然后git commit -m 'added seed config script' 然后git push

    然后将此新代码推送到您的 aws eb 实例:git aws.push

要验证您的命令是否实际运行,请进入您的弹性 beanstalk 控制台并展开您的环境的详细信息,然后导航到 logs 选项卡,然后刷新您的日志并查看它们。在那里,只需对“种子”执行ctrl + f,直到您看到您的种子命令已运行。如果你没有在某个地方看到它,那么它就没有运行。

【讨论】:

@JamelToms 它在 2013 年工作......也许 EB 改变了它运行命令的方式。继续查看他们的文档并找到相关内容,尝试一下,然后用新答案更新这个问题【参考方案4】:

我发现的唯一方法是通过 ssh 进入 ec2 实例并从 /var/app/current 手动运行“rake db:seed RAILS_ENV=production”。

【讨论】:

注意不要以 root 身份运行此任务。 db:seed 在 /var/app/tmp 中创建一些文件,如果它们是由 root 创建的,您的应用程序将无法读取或覆盖这些文件。如果它们是由 root 创建的,当您尝试创建新页面时,您将在日志中收到 EACCES 错误 这不起作用:rake db:seed RAILS_ENV=production /usr/bin/rake:9:in 'require': no such file to load -- rubygems (LoadError) from /usr/bin/rake:9【参考方案5】:

这个问题被问到已经有一段时间了,所以也许你已经想通了。无论如何,您可以在 .beanstalk 文件夹中添加一个名为(例如)seed.config 的文件。输入这样的内容,您的种子将运行:

container_commands:
  01seed:
    command: rake db:seed

【讨论】:

.beanstalk 文件夹是指.elasticbeanstalk 吗?另外,您是否必须eb stopeb start 才能生效?我将这些命令添加到了 seed.config 文件并执行了git aws.push,但播种并未显示在我的日志中

以上是关于您如何在 AWS Elastic Beanstalk 应用程序上调用 db:seed?的主要内容,如果未能解决你的问题,请参考以下文章

AWS 中的 Elastic Beanstalk 子域 CNAME 记录在哪里,以及如何向其中添加 SSL?

将 Ember.js 应用程序部署到 AWS Elastic Beanstalk

如何从 aws-sdk 中的 s3 存储桶创建 Elastic Beanstalk 实例?

Node JS - Elastic Beanstalk AWS - 允许写访问

我正在尝试使用 AWS EB CLI (elastic beanstalk) 部署 python 应用程序

创建应用程序源包AWS Elastic Beanstalk