Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用AmazonWeb服务及其弹性beanstalk将机密文件推送到EC2RubyonRails应用程序?_Ruby On Rails_Ruby_Amazon Web Services_Amazon S3_Amazon Ec2 - Fatal编程技术网

Ruby on rails 如何使用AmazonWeb服务及其弹性beanstalk将机密文件推送到EC2RubyonRails应用程序?

Ruby on rails 如何使用AmazonWeb服务及其弹性beanstalk将机密文件推送到EC2RubyonRails应用程序?,ruby-on-rails,ruby,amazon-web-services,amazon-s3,amazon-ec2,Ruby On Rails,Ruby,Amazon Web Services,Amazon S3,Amazon Ec2,如何使用AmazonWeb服务及其弹性beanstalk将机密文件推送到EC2RubyonRails应用程序 我将这些文件添加到git存储库中,然后推送到github,但我想将我的机密文件保留在git存储库之外。我正在使用以下方式部署到aws: git aws.push 以下文件位于.gitignore中: /config/database.yml /config/initializers/omniauth.rb /config/initializers/secret_token.rb 通过

如何使用AmazonWeb服务及其弹性beanstalk将机密文件推送到EC2RubyonRails应用程序

我将这些文件添加到git存储库中,然后推送到github,但我想将我的机密文件保留在git存储库之外。我正在使用以下方式部署到aws:

git aws.push
以下文件位于.gitignore中:

/config/database.yml
/config/initializers/omniauth.rb
/config/initializers/secret_token.rb
通过此链接,我尝试将S3文件添加到部署中:

引用该链接:

示例代码段 以下示例从Amazon S3存储桶下载一个zip文件,并将其解压缩到/etc/myapp中:

sources:  
    /etc/myapp: http://s3.amazonaws.com/mybucket/myobject 
按照这些说明,我将一个文件上载到S3 bucket,并将以下内容添加到.ebextensions目录中的private.config文件中:

sources:
  /var/app/current/: https://s3.amazonaws.com/mybucket/config.tar.gz
该config.tar.gz文件将解压缩到:

/config/database.yml
/config/initializers/omniauth.rb
/config/initializers/secret_token.rb
但是,部署应用程序时,S3主机上的config.tar.gz文件永远不会被复制或提取。我仍然收到无法找到database.yml的错误,并且EC2日志没有配置文件的记录,下面是错误消息:

Error message:
  No such file or directory - /var/app/current/config/database.yml
Exception class:
  Errno::ENOENT
Application root:
  /var/app/current

从那里,安全文档AmazonEC2支持文件加密的TrueCrypt和传输数据的SSL。看看这些文件

您可以上载带有加密磁盘的服务器实例,也可以使用私有repo(我认为这对github来说很昂贵,但还有其他选择)

我认为您想要做的事情的“正确”方法是使用IAM角色。你可以在这里看到一篇关于它的博客文章:


基本上,它允许您启动EC2实例,而无需在任何配置文件上放置任何个人凭据。启动实例时,将为其分配给定的角色(使用AWS资源的一组权限),并使用Amazon IAM自动在机器上放置一个轮换凭证。

使用环境变量是一种很好的方法。在环境中引用密码,因此在yaml文件中:

password: <%= ENV['DATABASE_PASSWORD'] %>
密码:
然后直接使用eb或控制台在实例上设置它们


您可能担心在环境中随时可以获得此类敏感信息。如果某个进程破坏了您的系统,它可能会获得密码,无论它位于何处。许多PaaS提供商(如Heroku)都使用这种方法。

为了让
.ebextension/*.config
文件能够从S3下载文件,它们必须是公共的。考虑到它们包含敏感信息,这是一个坏主意

您可以启动Elastic Beanstalk实例,并授予该角色访问相关文件的权限。不幸的是,
.ebextension/*.config
文件的
文件:
源:
部分没有使用此角色的直接访问权限

您应该能够使用的类编写一个简单的脚本来下载文件,并使用
命令:
而不是
源代码:
。如果未指定凭据,SDK将自动尝试使用该角色

您必须为您的角色添加一个策略,该策略允许您下载您特别感兴趣的文件。它看起来是这样的:

{                       
  "Statement": [
    {
    "Effect": "Allow",
     "Action": "s3:GetObject",
     "Resource": "arn:aws:s3:::mybucket/*"
    }
  ]
}
然后您可以在
.config
文件中执行类似的操作

files:
  /usr/local/bin/downloadScript.rb: http://s3.amazonaws.com/mybucket/downloadScript.rb
commands:
  01-download-config:
    command: ruby /usr/local/downloadScript.rb http://s3.amazonaws.com/mybucket/config.tar.gz /tmp
  02-unzip-config:
    command: tar xvf /tmp/config.tar.gz
    cwd: /var/app/current

我认为最好的方法是不要攻击AWS(设置挂钩,上传文件)。只需使用ENV变量

使用gem'dot env'进行开发(即在'config/database.yml'中)和默认AWS控制台在Beanstalk中设置变量。

可以(并且很容易)将敏感文件存储在S3中,并自动复制到Beanstalk实例中

创建Beanstalk应用程序时,会自动创建一个S3 bucket。此bucket用于存储应用程序版本、日志、元数据等

分配给Beanstalk环境的默认
aws-elasticbeanstalk-ec2-role
具有对此存储桶的读取权限

因此,您所需要做的就是将敏感文件放在该bucket中(位于bucket的根目录或您想要的任何目录结构中),然后创建一个
.ebextension
配置文件,将它们复制到EC2实例中

以下是一个例子:

# .ebextensions/sensitive_files.config

Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Auth:
          type: "s3"
          buckets: ["elasticbeanstalk-us-east-1-XXX"] # Replace with your bucket name
          roleName: 
            "Fn::GetOptionSetting": 
              Namespace: "aws:autoscaling:launchconfiguration"
              OptionName: "IamInstanceProfile"
              DefaultValue: "aws-elasticbeanstalk-ec2-role" # This is the default role created for you when creating a new Beanstalk environment. Change it if you are using a custom role

files:
  /etc/pki/tls/certs/server.key: # This is where the file will be copied on the EC2 instances
    mode: "000400" # Apply restrictive permissions to the file
    owner: root # Or nodejs, or whatever suits your needs
    group: root # Or nodejs, or whatever suits your needs
    authentication: "S3Auth"
    source: https://s3-us-west-2.amazonaws.com/elasticbeanstalk-us-east-1-XXX/server.key # URL to the file in S3

这篇文章记录在这里:

我知道这是一篇老文章,但我在任何地方都找不到另一个答案,所以我挑灯夜战,想出了一个答案。我希望这能为你节省几个小时

我同意开发人员的意见,他们发布了多少PITA,迫使开发人员将环境变量放入他们本地的dev database.yml中。我知道dotenv gem很不错,但是你仍然需要维护ENV vars,这增加了创建站点所需的时间

我的方法是将database.yml文件存储在EB创建的bucket中的S3上,然后使用.ebextensions配置文件在服务器的预钩子目录中创建一个脚本,以便在解压到staging目录后但在资产编译之前执行该脚本——当然,编译过程中没有database.yml

.config文件是

# .ebextensions/sensitive_files.config
# Create a prehook command to copy database.yml from S3
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/03_copy_database.sh" :
    mode: "000755"
    owner: root
    group: root
    content: |
        #!/bin/bash
        set -xe
        EB_APP_STAGING_DIR=$(/opt/elasticbeanstalk/bin/get-config  container -k app_staging_dir)
        echo EB_APP_STAGING_DIR is  ${EB_APP_STAGING_DIR} >/tmp/copy.log
        ls -l ${EB_APP_STAGING_DIR} >>/tmp/copy.log
        aws s3 cp s3://elasticbeanstalk-us-east-1-XXX/database.yml ${EB_APP_STAGING_DIR}/config/database.yml >>/tmp/copy.log 2>>/tmp/copy.log
笔记
  • 当然,bucket名称中的XXX是EB创建的序列号。您必须检查S3以查看bucket的名称
  • 我创建的脚本文件的名称很重要。这些脚本是按字母顺序执行的,所以我很小心地给它命名,以便它在asset_编译脚本之前进行排序
  • 显然,将输出重定向到/tmp/copy.log是可选的
对我帮助最大的职位是


邮寄人Kenta@AWS. 谢谢你,肯塔

我认为这里最重要的事情之一是确保存在正确的权限,并且从S3请求文件的应用程序具有正确的权限,但是这两个应用程序都是在我的用户下运行的,我也有权限访问这些文件,所以我不确定如何判断这是否是问题所在。