Django 静态文件到 AWS S3 return 403 禁止
Django static files to AWS S3 return 403 forbidden
我正在开发部署在 Heroku 上的 Django(3) 项目。我正在尝试使用 Django 存储连接 AWS S3 以将静态文件和媒体文件上传到 S3 存储桶。
Note: I have googled a lot and tried every solution I found, but nothing solved my issue, so don't mark this as duplicate, please!
我创建了一个启用了 Public 访问权限的 S3 存储桶,并添加了以下 CORS 配置:
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
"PUT",
"POST"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": []
}
]
此外,创建了一个具有编程访问权限的 IAM 用户,并授予 S3FullAccess
权限
这就是我在 **settings.py**
中的内容
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')
AWS_QUERYSTRING_AUTH = False
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
AWS_S3_REGION_NAME = 'us-east-1'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3StaticStorage'
如果我直接从存储桶中打开文件,我可以在浏览器中看到该文件,但是当我加载我的站点 (pythonist.org) 时,这些文件 return 和 403 forbidden
这是浏览器的“网络”选项卡对文件的响应:
Summary
URL: https://s3.amazonaws.com/pythonist.org/css/normalize.css
Status: 403 Forbidden
Source: Network
Initiator:
pythonist.org:18
不知道这里出了什么问题,
提前致谢!
您的存储桶似乎 public 无法访问。您的 public 存储桶应该有一个像这样的存储桶策略(一些已删除属性的示例):
{
"Id": "Policy1640778083903",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1640778050694",
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::pythonist.org",
"arn:aws:s3:::pythonist.org/*"
],
"Principal": {
"AWS": [
"YOUR_IAM_USER"
]
}
},
{
"Sid": "Stmt1640778082281",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::pythonist.org/*",
"Principal": "*"
}
]
}
你的IAM用户有任何权限,而public只能获取对象(这里不是从根目录,根据你的需要更改)。使用 AWS Policy Generator
创建您的政策
我正在开发部署在 Heroku 上的 Django(3) 项目。我正在尝试使用 Django 存储连接 AWS S3 以将静态文件和媒体文件上传到 S3 存储桶。
Note: I have googled a lot and tried every solution I found, but nothing solved my issue, so don't mark this as duplicate, please!
我创建了一个启用了 Public 访问权限的 S3 存储桶,并添加了以下 CORS 配置:
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
"PUT",
"POST"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": []
}
]
此外,创建了一个具有编程访问权限的 IAM 用户,并授予 S3FullAccess
这就是我在 **settings.py**
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME')
AWS_QUERYSTRING_AUTH = False
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
AWS_S3_REGION_NAME = 'us-east-1'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3StaticStorage'
如果我直接从存储桶中打开文件,我可以在浏览器中看到该文件,但是当我加载我的站点 (pythonist.org) 时,这些文件 return 和 403 forbidden
这是浏览器的“网络”选项卡对文件的响应:
Summary
URL: https://s3.amazonaws.com/pythonist.org/css/normalize.css
Status: 403 Forbidden
Source: Network
Initiator:
pythonist.org:18
不知道这里出了什么问题, 提前致谢!
您的存储桶似乎 public 无法访问。您的 public 存储桶应该有一个像这样的存储桶策略(一些已删除属性的示例):
{
"Id": "Policy1640778083903",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1640778050694",
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:ListBucket",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::pythonist.org",
"arn:aws:s3:::pythonist.org/*"
],
"Principal": {
"AWS": [
"YOUR_IAM_USER"
]
}
},
{
"Sid": "Stmt1640778082281",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::pythonist.org/*",
"Principal": "*"
}
]
}
你的IAM用户有任何权限,而public只能获取对象(这里不是从根目录,根据你的需要更改)。使用 AWS Policy Generator
创建您的政策