这是我第一次使用 Amazon S3。我已阅读问题和答案。它们看起来都与这个问题相似,但没有一个答案为我解决了这个问题。
我可以成功上传图片,但我可以让它们显示它们(403禁止状态)。
这是存储桶的策略:
{
"Version": "2012-10-17",
"Id": "Policy1475848347662",
"Statement": [
{
"Sid": "Stmt1475848335256",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::235314345576:user/userx"
},
"Action": [
"s3:*"
],
"Resource": "arn:aws:s3:::bucketdev/*"
}
]}
这是 CORS 配置:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
这是用户的政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:ListBucket",
"s3:ListBucketVersions",
"s3:GetObject",
"s3:ListBucketMultipartUploads"
],
"Resource": [
"arn:aws:s3:::*"
]
}
]}
使用此组件:https://www.npmjs.com/package/react-dropzone-s3-uploader .
有人可以帮忙吗?
谢谢。
最佳答案
有两点需要注意:
- 在哪里分配访问 Amazon S3 的权限
- 要分配哪些权限
在哪里分配访问 Amazon S3 的权限
Amazon S3 中的对象默认情况下是私有(private)的。可以通过三种方式分配访问对象的权限:
- 对象 ACL(访问控制列表):这些是对象本身的权限
- 存储桶策略:这是一组应用于整个存储桶的规则,但它也可以指定与存储桶的子集相关的权限(例如存储桶内的特定路径)里>
- 应用于 IAM 用户、组或角色的 IAM 策略:这些权限专门应用于这些实体
如果您的目的是保持 S3 存储桶内容的私密性,但允许特定用户访问,那么您应该向 IAM 用户 分配权限(正如您所做的那样)。这也意味着您不需要存储桶策略,因为通过上述任何一种方法授予访问权限就足够了。
参见文档:Guidelines for Using the Available Access Policy Options
此外,仅当从一个域提供的 HTML 页面引用来自另一域的内容时,才需要 CORS 策略。您很可能不需要 CORS 策略 - 进行一些测试以确认情况是否如此。
分配哪些权限
这总是令人困惑...有些权限与存储桶关联,而有些权限与存储桶的内容关联。
您的策略中的以下权限应位于存储桶级别 ( arn:aws:s3:::MyBucket
):
- s3:创建桶
- s3:删除桶
- s3:删除桶策略
- s3:GetBucketPolicy
- s3:GetLifecycleConfiguration
- s3:ListBucket
- s3:ListBucketMultipartUploads
- s3:PutBucketPolicy
- s3:PutLifecycleConfiguration
其他 API 调用(例如 GetObject
)应在对象级别(例如 arn:aws:s3:::MyBucket/*
)。
参见:Specifying Permissions in a Policy
因此,与您的 IAM 用户关联的策略应如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:ListBucket",
"s3:ListBucketVersions",
"s3:ListMultipartUploadParts"
],
"Resource": [
"arn:aws:s3:::MY-BUCKET"
]
},
{
"Sid": "Stmt2",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::MY-BUCKET/*"
]
}
]
}
这授予 GetObject
对存储桶内的对象(而不是存储桶本身)的权限。
关于node.js - Amazon S3 - 无法加载资源 : the server responded with a status of 403 (Forbidden),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39922179/