47

我已经在 AWS 的弹性豆茎上建立了一个 RoR 环境。我可以 ssh 进入我的 EC2 实例。我的主目录是 / home/ec2-user,实际上是空的。如果我向上移动一个目录,还有一个我无权访问的/home/webapp目录。

有没有办法在我的弹性 beanstalk 实例上运行rake命令或rails 控制台?

如果我输入rails console我会得到Usage: rails new APP_PATH [options] 如果我输入RAILS_ENV=production bundle exec rails console会得到 " Could not locate Gemfile"

4

13 回答 13

60

对于导轨,/var/app/current如@juanpastas 所说,跳转到然后运行RAILS_ENV=production bundle exec rails c

于 2013-10-28T15:25:08.650 回答
45

不知道为什么,但由于 EBS 以 root 身份运行所有内容,这对我有用:

sudo su
bundle exec rails c production
于 2015-06-03T11:39:11.913 回答
14

这里提到的这些解决方案都不适合我,所以我编写了一个小脚本,放在 script/aws-console 中。

您可以从 /var/app/current 目录以 root 身份运行它:

eb ssh
cd /var/app/current
sudo script/aws-console

我的脚本可以作为Gist 在这里找到。

于 2015-04-16T10:37:11.530 回答
9

其他答案都没有对我有用,所以我去寻找 - 现在这对我来说在弹性 beanstalk 64bit amazon linux 2016.03 V2.1.2 ruby​​ 2.2 (puma) 堆栈上工作

cd /var/app/current
sudo su
rake rails:update:bin
bundle exec rails console

这将返回我预期的控制台

Loading production environment (Rails 4.2.6)
irb(main):001:0>
于 2016-06-10T18:24:49.090 回答
6

对于 Ruby 2.7:

如果您不需要环境变量:

BUNDLE_PATH=/var/app/current/vendor/bundle/ bundle exec rails c

看起来环境变量不再自动加载,这可能会阻止 rails 控制台启动。我通过创建这个 .ebextensions 文件解决了这个问题:

# Simply call `sudo /var/app/scripts/rails_c`

commands:
  create_script_dir:
    command: "mkdir -p /var/app/scripts"
    ignoreErrors: true
files:
  "/var/app/scripts/export_envvars":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/opt/elasticbeanstalk/.rbenv/shims/ruby

      if __FILE__ == $0
          require 'json'
          env_file = '/var/app/scripts/envvars'
          env_vars = env_vars = JSON.parse(`/opt/elasticbeanstalk/bin/get-config environment`)

          str = ''
          env_vars.each do |key, value|
              new_key = key.gsub(/\s/, '_')
              str << "export #{new_key}=\"#{value}\"\n"
          end

          File.open(env_file, 'w') { |f| f.write(str) }
      end
  "/var/app/scripts/rails_c":
    mode: "000755"
    owner: root
    group: root
    content: |
      . ~/.bashrc
      /var/app/scripts/export_envvars
      . /var/app/scripts/envvars
      cd /var/app/current
      /opt/elasticbeanstalk/.rbenv/shims/bundle exec rails c
于 2020-08-20T08:06:49.597 回答
2

我喜欢eb_console在我的 rails 应用程序的根目录下创建一个文件,然后创建chmod u+x它。它包含以下内容:

ssh -t ec2-user@YOUR_EC2_STATION.compute.amazonaws.com  'cd /var/app/current && bin/rails c'

这样,我只需要运行:

./eb_console

就像我会跑一样heroku run bundle exec rails c

于 2014-12-20T20:13:28.147 回答
2

对于 Ruby 2.7:

正如有人所说,如果您不需要环境变量,请运行以下命令

BUNDLE_PATH=/var/app/current/vendor/bundle/ bundle exec rails c

但是,如果您需要 ENV,我建议按照 AWS 文档执行此操作: https ://aws.amazon.com/premiumsupport/knowledge-center/elastic-beanstalk-env-variables-linux2/

tl;博士

在 Amazon Linux 2 上,所有环境属性都集中到一个名为/opt/elasticbeanstalk/deployment/env. 没有用户可以在应用程序之外访问这些内容。因此,他们建议在部署后添加一些钩子脚本以基本上创建副本。

#!/bin/bash

#Create a copy of the environment variable file.
cp /opt/elasticbeanstalk/deployment/env /opt/elasticbeanstalk/deployment/custom_env_var

#Set permissions to the custom_env_var file so this file can be accessed by any user on the instance. You can restrict permissions as per your requirements.
chmod 644 /opt/elasticbeanstalk/deployment/custom_env_var

#Remove duplicate files upon deployment.
rm -f /opt/elasticbeanstalk/deployment/*.bak

如果由于某种原因您不想以 root 身份运行,请执行以下操作以将 env vars 从 root 传递到新的用户环境:

sudo -u <user> -E env "PATH=$PATH" bash -c 'cd /var/app/current/ && <wtv you want to run>'
于 2021-02-16T16:35:09.570 回答
1
#!/bin/sh

shell_join () {
  ruby -r shellwords -e 'puts Shellwords.join(ARGV)' "$@"
}


command_str () {
  printf 'set -e; . /etc/profile.d/eb_envvars.sh; . /etc/profile.d/use-app-ruby.sh; set -x; exec %s\n' "$(shell_join "$@")"
}

exec sudo su webapp -c "$(command_str "$@")"

将上述文件放在源代码中的某个位置,部署eb ssh到 eb 实例中cd /var/app/current,然后执行path/to/above/script bin/rails whatever argumeents you usually use.

我写上面脚本的原因是:

  1. 使用时sudo,它会删除一些您的 rails 应用程序可能实际需要的环境变量;因此手动加载 Elastic Beanstalk 平台提供的配置文件。
  2. 当前的 Beanstalk ruby​​ 平台假定您在 user 上运行 rails 应用程序webapp,这是一个不可登录的用户,因此在此用户中运行您的命令是明智的。
于 2020-03-08T07:44:24.373 回答
1

对于最新的 ruby​​ 版本,请使用以下命令:

BUNDLE_PATH=/opt/rubies/ruby-2.6.3/lib/ruby/gems/2.6.0/ bundle exec rails c production

不需要使用 sudo 运行它。

于 2020-05-31T21:39:44.887 回答
0

添加 eb 扩展快捷方式:

# .ebextensions/irb.config
files:
  "/home/ec2-user/irb":
    mode: "000777"
    owner: root
    group: root
    content: |
      sudo su - -c 'cd /var/app/current; bundle exec rails c'

然后:

$ eb ssh
$ ./irb
irb(main):001:0>
于 2019-10-11T21:35:41.230 回答
0

创建一个名为setvars.config的 .ebextension 文件并将这些行添加到其中

commands:
  setvars:
    command: /opt/elasticbeanstalk/bin/get-config environment | jq -r 'to_entries | .[] | "export \(.key)=\"\(.value)\""' > /etc/profile.d/sh.local
packages:
  yum:
    jq: []

然后再次部署您的代码,它应该可以工作。参考:https ://aws.amazon.com/ar/premiumsupport/knowledge-center/elastic-beanstalk-env-variables-shell/

于 2022-01-12T12:58:05.113 回答
-1

这些都不适合我,包括 aws-console 脚本。我最终在另一个 SO question 的答案script中创建了一个目录,/var/app/current然后rails在该目录中创建了一个文件作为大纲。

eb ssh myEnv
cd /var/app/current
sudo mkdir script
sudo vim script/rails

将此添加到文件并保存:

echo #!/usr/bin/env ruby
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.

APP_PATH = File.expand_path('../../config/application',  __FILE__)
require File.expand_path('../../config/boot',  __FILE__)
require 'rails/commands'

然后使其可执行并运行它:

sudo chmod +x script/rails
sudo script/rails console

它奏效了。

于 2016-07-20T21:32:46.970 回答
-2

您必须找到带有 Gemfile 的文件夹:p。

为此,我会查看您的 Web 服务器配置,应该有一个配置告诉您您的应用程序目录在哪里。

也许你知道你的应用在哪里。

但如果你不知道,我会尝试:

grep -i your_app_name /etc/apache/*
grep -i your_app_name /etc/apache/sites-enabled/*

在 Apache 配置中搜索包含 your_app_name 的文件。

或者,如果您使用的是 nginx,请将apache上面替换为nginx.

找到应用程序文件夹后, cd 进入它并运行RAILS_ENV=production bundle exec rails c.

确保您的应用程序配置为在 Apache 或 nginx 配置中在生产环境中运行。

于 2013-10-27T17:21:07.877 回答