OR我可以使用相同的一对吗,比如说3个bucket(dev、production、staging)。
请告知!
您当然可以使用一组AWS凭据来管理多个S3存储桶。
或者,您可以将其设置为每个bucket需要不同的AWS凭据。
或者,您可以配置访问权限,以便使用EC2实例中的IAM实例角色—我们的实例,而无需创建和管理单个密钥。
或者,您可以授予其他AWS帐户中的用户访问权限,以承担管理帐户中S3存储桶的角色。
或者,您可以使用Amazon Cognito,这样个人用户就可以在亚马逊、脸书、谷歌或任何与OpenID Connect兼容的身份提供商上使用自己的个人帐户登录,然后在S3存储桶中创建和管理自己的对象,而无需相互踩脚。
或者。。。
[请将每个"如何"作为一个单独的新问题提交。]
您可以执行任一操作。这取决于您如何设置与用户(或组)关联的策略。我建议每个环境使用一组不同的密钥,以防一个环境受到损害,并防止意外重写。
这里有一个将用户名与bucket名称匹配的策略:
{
"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用户。给它们取与水桶相同的名字。每个人都会得到一个不同的密钥+秘密。当您的应用程序尝试访问bucket时,它将确认密钥和机密对于特定于环境的bucket是正确的。
虽然这个问题很老,但您现在可能已经解决了问题。我为未来的读者写下这个答案。
您可以对所有环境使用相同的bucket。但是你应该使用不同的桶。原因:资产被上传到同一个bucket上,所有环境之间可能存在ID冲突。你迟早会面临这个问题。所以最好是防故障。
在Heroku中,您可以为多个环境设置单独的配置。在您的案例中,dev
、production
和staging
(我假设您已经用以上名称设置了这些引用,或者如果您还没有,并试图将暂存环境添加到现有应用程序中,您可以参考这个,或者如果从头开始,可以参考这个)。
你可能有你的配置类似于(它有与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
希望这个答案能帮助到某人:-)