您是否需要为每个S3桶分配一对AWS密钥?
你也可以做。这取决于您如何设置与用户(或组)相关的策略。我会为每个环境推荐一组不同的密钥,以防一个环境受到危害,并防止意外覆盖。
这里有一个用户名相匹配的水桶名政策:
{
"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用户。给他们与桶相同的名字。每个人都将获得不同的钥匙+秘密。当您的应用尝试访问存储桶时,它会确认该密钥和秘密对于环境特定存储桶是否正确。
您当然可以使用一组AWS证书来管理多个S3存储桶。
或者,您可以进行设置,以便每个存储桶需要不同的AWS凭证。
或者,您可以配置访问权限,以便您可以从我们的实例的EC2实例使用IAM实例角色,而无需创建和管理各个密钥。
或者,您可以授予其他AWS账户中用户的访问权限,以承担管理您账户中S3存储桶的角色。
或者,您可以使用Amazon Cognito,以便个人用户可以在亚马逊,Facebook,Google或任何OpenID Connect兼容身份提供商处使用自己的个人帐户登录,然后在您的S3中创建和管理自己的对象没有踩在对方的脚趾上。
或者,...
[请提交每个“如何”作为一个独立的,新的问题。]
尽管这个问题是老了,你可能现在解决您的问题。 我正在为未来的读者撰写这个答案。
您可以在所有环境中使用相同的存储桶。但是你应该使用不同的桶。 原因:资产被上传到同一个桶中,所有环境都可能会在它们之间发生ID冲突。迟早你会面临这个问题。所以它最好是安全的。
在Heroku中,您可以为多个环境设置单独的配置。在你的情况dev
production
和staging
(我假设你已经设置了这些引用上面的名字,或者如果你还没有,并试图添加分段环境到现有的应用程序,你可以参考this或从头开始this)。
你可能有你的配置是这样(它涉及到回形针配置)
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
希望此回答有助于某人:-)