每个S3 Bucket是否需要一对单独的AWS密钥?

时间:2015-04-06 16:20:13

标签: ruby-on-rails amazon-web-services ruby-on-rails-4 aws-sdk

或者我可以使用相同的一对,因为我们说3个桶(开发,生产,分期)。

请指教!

3 个答案:

答案 0 :(得分:3)

您当然可以使用一组AWS凭据来管理多个S3存储桶。

或者,您可以对其进行设置,以便每个存储桶都需要不同的AWS凭据。

或者,您可以配置访问权限,以便在EC2实例的实例中使用IAM实例角色,而无需创建和管理单个密钥。

或者,您可以授予其他AWS账户中用户的访问权,以承担管理帐户中S3存储桶的角色。

或者,您可以使用Amazon Cognito,以便个人用户可以在Amazon,Facebook,Google或任何与OpenID Connect兼容的身份提供商上使用自己的个人帐户登录,然后在S3存储桶中创建和管理自己的对象没有踩到对方的脚趾。

或者......,

[请将每个“如何”作为单独的新问题提交。]

答案 1 :(得分:0)

你可以做任何一件事。这取决于您如何设置与用户(或组)关联的策略。我会为每个环境推荐一组不同的密钥,以防一个环境受到损害,并防止意外覆盖。

这是一个将用户名与存储桶名称匹配的策略:

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListAllMyBuckets"
         ],
         "Resource":"arn:aws:s3:::*"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListBucket",
            "s3:GetBucketLocation"
         ],
         "Resource":"arn:aws:s3:::${aws:username}"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:GetObject",
            "s3:GetObjectAcl",
            "s3:DeleteObject",
            "s3:DeleteObjectAcl"
         ],
         "Resource":"arn:aws:s3:::${aws:username}/*"
      }
   ]
}

然后,您可以生成开发,登台和生产IAM用户。给它们与桶相同的名称。每个人都将获得一个不同的密钥+秘密。当您的应用尝试访问存储桶时,它将确认密钥和密钥对于特定于环境的存储桶是否正确。

答案 2 :(得分:0)

虽然这个问题已经过时了,但您现在可能已经解决了问题。 我正在为未来的读者写这个答案。

您可以在所有环境中使用相同的存储桶。但是你应该使用不同的桶。 原因:资产上传到同一个存储桶,所有环境都可能会在它们之间产生ID冲突。迟早你会遇到这个问题。因此,最好是安全失败。

在Heroku中,您可以为多个环境设置单独的配置。在您的情况下dev productionstaging(我假设您已使用以上名称设置这些引用,或者如果您尚未尝试将暂存环境添加到现有应用中,则可以请参考this或从this开始。

你可能正在使用你的配置(它有与Paperclip相关的配置)

has_attached_file :photo, 
  :styles => ...,
  :path => ...,
  :storage => :s3,
  :bucket => ENV['S3_BUCKET'], 
  :s3_credentials => {
    :access_key_id => ENV['S3_KEY'],
    :secret_access_key => ENV['S3_SECRET']
  }

您会看到环境变量ENV['S3_BUCKET'] ENV['S3_KEY']ENV['S3_SECRET']

您可以针对您的应用设置这些变量,如下所示

<强>开发:

$ heroku config:set S3_BUCKET=XXX --remote dev
$ heroku config:set S3_KEY=YYY --remote dev
$ heroku config:set S3_SECRET=ZZZ --remote dev

<强>生产:

$ heroku config:set S3_BUCKET=XXX --remote production
$ heroku config:set S3_KEY=YYY --remote production
$ heroku config:set S3_SECRET=ZZZ --remote production

<强>分段:

$ heroku config:set S3_BUCKET=XXX --remote staging
$ heroku config:set S3_KEY=YYY --remote staging
$ heroku config:set S3_SECRET=ZZZ --remote staging

希望这个答案有助于某人: - )