12

アマゾンウェブサービスとエラスティックビーンズトークを使用して、シークレットファイルをEC2 Ruby on Railsアプリケーションにプッシュするにはどうすればよいですか?

ファイルをgitリポジトリに追加し、githubにプッシュしますが、秘密のファイルをgitリポジトリに入れないようにします。私は以下を使用してAWSにデプロイしています:

git aws.push

次のファイルが.gitignoreにあります。

/config/database.yml
/config/initializers/omniauth.rb
/config/initializers/secret_token.rb

このリンクをたどって、S3ファイルをデプロイに追加しようとしました:http: //docs.amazonwebservices.com/elasticbeanstalk/latest/dg/customize-containers.html

そのリンクからの引用:

スニペットの例

次の例では、Amazon S3バケットからzipファイルをダウンロードし、/ etc/myappに解凍します。

sources:  
    /etc/myapp: http://s3.amazonaws.com/mybucket/myobject 

これらの指示に従って、ファイルをS3バケットにアップロードし、.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
4

7 に答える 7

2

あなたがやりたいと思うことを行う「正しい」方法は、IAMロールを使用することです。ここでそれについてのブログ投稿を見ることができます:http://aws.typepad.com/aws/aws-iam/

基本的に、設定ファイルに個人のクレデンシャルをまったく設定せずにEC2インスタンスを起動できます。インスタンスを起動すると、指定されたロール(AWSリソースを使用するための一連のアクセス許可)が割り当てられ、AmazonIAMを使用してローテーションクレデンシャルがマシンに自動的に配置されます。

于 2012-12-21T15:51:53.937 に答える
2

.ebextension/*.configファイルがS3からファイルをダウンロードできるようにするには、ファイルをパブリックにする必要があります。機密情報が含まれていることを考えると、これは悪い考えです。

インスタンスロールを使用してElasticBeanstalkインスタンスを起動し、そのロールに問題のファイルにアクセスする権限を与えることができます。残念ながら、ファイルのセクションfile:sources:セクションには、.ebextension/*.configこの役割を使用するための直接アクセス権がありません。

AWS SDKforRubyのAWS::S3 :: S3Objectクラスを使用してファイルをダウンロードし、の代わりにを使用して、簡単なスクリプトを記述できるはずです。クレデンシャルを指定しない場合、SDKは自動的にロールの使用を試みます。command:sources:

特に関心のあるファイルをダウンロードできるようにするポリシーをロールに追加する必要があります。次のようになります。

{                       
  "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
于 2013-05-31T22:29:57.377 に答える
1

環境変数を使用することは良いアプローチです。環境内のパスワードを参照するため、yamlファイルでは次のようになります。

password: <%= ENV['DATABASE_PASSWORD'] %>

次に、ebまたはコンソールを使用してインスタンスに直接設定します。

このような機密情報を環境ですぐに利用できるようになることを心配するかもしれません。プロセスがシステムを危険にさらす場合、どこにいてもパスワードを取得できる可能性があります。このアプローチは、Herokuなどの多くのPaaSプロバイダーで使用されています。

于 2013-05-31T13:16:32.233 に答える
1

機密ファイルをS3に保存し、それらをBeanstalkインスタンスに自動的にコピーすることは可能です(そして簡単です)。

Beanstalkアプリケーションを作成すると、S3バケットが自動的に作成されます。このバケットは、アプリのバージョン、ログ、メタデータなどを保存するために使用されます。

aws-elasticbeanstalk-ec2-roleBeanstalk環境に割り当てられているデフォルトには、このバケットへの読み取りアクセス権があります。

したがって、必要なのは、機密ファイルをそのバケット(バケットのルートまたは任意のディレクトリ構造)に配置し、構成.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

これはここに文書化されています:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/https-storingprivatekeys.html

于 2016-09-29T14:22:57.640 に答える
0

そこからセキュリティドキュメントAmazonEC2は、ファイル暗号化用のTrueCryptと転送中のデータ用のSSLをサポートしています。これらのドキュメントをチェックしてください

暗号化されたディスクを使用してサーバーインスタンスをアップロードするか、プライベートリポジトリを使用できます(これはgithubにかかると思いますが、別の方法があります)

于 2012-12-20T21:53:59.730 に答える
0

AWSをハッキングしない(フックを設定する、ファイルをアップロードする)のが最善の方法だと思います。ENV変数を使用するだけです。

開発にはgem'dot-env'を使用し(つまり、'config / database.yml'の<%= ENV ['LOCAL_DB_USERNAME']%>)、デフォルトのAWSコンソールを使用してBeanstalkに変数を設定します。

于 2015-04-26T16:12:50.930 に答える
0

これは古い投稿だと知っていますが、どこにも別の答えが見つからなかったので、真夜中の油を燃やして見つけました。数時間節約できることを願っています。

私は、開発者にENV変数をローカルの開発データベース.ymlに配置するように強制するPITAの量を投稿した開発者に同意しました。dotenv gemが素晴らしいことは知っていますが、それでもENV変数を維持する必要があります。これにより、ステーションの起動にかかる時間が長くなります。

私のアプローチは、データベース.ymlファイルをEBによって作成されたバケットのS3に保存し、.ebextensions構成ファイルを使用してサーバーのプリフックディレクトリにスクリプトを作成し、ステージングディレクトリへの解凍後、その前に実行されるようにすることです。アセットのコンパイル-もちろん、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

ノート

  • もちろん、バケット名のXXXは、EBによって作成されたシーケンス番号です。バケットの名前を確認するには、S3を確認する必要があります。
  • 私が作成するスクリプトファイルの名前は重要です。これらのスクリプトはアルファベット順に実行されるため、asset_compilationスクリプトの前にソートされるように注意深く名前を付けました。
  • 明らかに、出力を/tmp/copy.logにリダイレクトすることはオプションです

私を最も助けた投稿は、ElasticBeanstalkデプロイメントフックのカスタマイズでした

Kenta@AWSによって投稿されました。ケンタありがとう!

于 2017-06-20T07:29:23.017 に答える