【发布时间】:2019-08-17 00:45:03
【问题描述】:
此错误消息是众所周知的错误消息。 (例如,请参阅https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html。)虽然我正在使用带有 Ruby 2.6.1 和 bundler 2.0.1 的新 Elastic Beanstalk 应用程序来获得它。错误是:
/opt/rubies/ruby-2.6.1/lib/ruby/site_ruby/2.6.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
from /opt/rubies/ruby-2.6.1/lib/ruby/site_ruby/2.6.0/rubygems.rb:308:in `activate_bin_path'
from /opt/rubies/ruby-2.6.1/bin/bundle:23:in `<main>' (ElasticBeanstalk::ExternalInvocationError)
我尝试将以下文件:01_install_bundler.config 放入 .ebextensions 文件夹中:
container_commands:
01_install_bundler:
command: "gem install bundler —-version 2.0.1"
虽然这永远不会运行,因为如果我查看上述错误,我可以看到它在部署过程中的这一点发生:
.../AppDeployStage0/AppDeployPreHook/10_bundle_install.sh] : Activity failed.
(即在 AppDeployPreHook 脚本的 bundle install 命令期间)。 PlatformHooks 参考https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/custom-platform-hooks.html。
我很确定,如果我能确保使用的 bundler 版本至少是 2.0.0 版,那么就不会有问题。虽然我不知道如何轻松指定。目前我正在通过 ssh'ing 到服务器 /opt/elasticbeanstalk/hooks/appdeploy/pre/ 来编辑和修改脚本。虽然我显然需要一种自动化的、可重复的方式来做这件事。
令人沮丧的是,ruby 2.6.1 默认没有选择捆绑器版本 2.0.0。有什么想法吗?
================================
更新:
如果我编辑文件/opt/elasticbeanstalk/hooks/appdeploy/pre/10_bundle_install.sh
if [ -f Gemfile ]; then
echo "running 'bundle install' with Gemfile:"
cat Gemfile
+++ gem install bundler +++
if [ -d $EB_APP_STAGING_DIR/vendor/cache ]; then
bundle install --local
else
bundle install
fi
else
echo "no Gemfile found! Skipping bundle install stage!"
fi
并添加gem install bundler(没有加号),然后这解决了问题,因为它安装了最新的捆绑程序,即 2.0.1。对于那些想知道 hack 的人来说,命令是:
eb ssh
sudo -i
cd /opt/elasticbeanstalk/hooks/appdeploy/pre
vim 10_bundle_install.sh
这个解决方案的问题是它感觉有点像黑客,因为它不使用.ebextensions。有没有更合适的方法来解决这个问题?
【问题讨论】:
-
尝试了
10_bundle_install.sh1hack 并让 EB 抱怨我不应该尝试以 root 身份安装 Bundler。 -
@NBarnes,这可能是因为当您运行
eb deploy时,您可能正在连接您的根 AWS 账户的 aws_access_key 和 aws_secret_access_key。 AWS 建议您为此目的使用身份访问管理 (IAM)。设置起来并不难。在 IAM -> 用户下,您只需创建一个具有以下权限的用户:AWSElasticBeanstalkFullAccess和ElasticLoadBalancingFullAccess。然后为该用户创建访问密钥并使用该配置文件运行eb deploy。 -
根据您的建议,我使用 IAM 创建了一个新用户并授予他们这两个权限。但是,我仍然收到有关以 root 身份运行 Bundler 的错误。我确实在 AWS CLI 中重置了凭证;
cat ~/.aws/config显示非 root 用户的访问密钥。编辑:问题可能是在下面的扩展文件 sn-p 中您将owner设置为root? -
我不确定@NBarnes。下面
root的owner是文件所有者。虽然听起来您的错误是在谈论用户在执行该文件时是root,而不是文件本身归root所有。如果您在 Google 上搜索“以 root 身份安装 Bundler”,可能会有一些解释。也许您的 AWS 环境与我的不同?我正在运行Passenger with Ruby 2.6 running on 64bit Amazon Linux/2.9.1
标签: ruby-on-rails ruby amazon-web-services rubygems amazon-elastic-beanstalk