AWS Elastic Beanstalk Python Django S3 Access Denied 无法上传/读取文件

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk Python Django S3 Access Denied 无法上传/读取文件【英文标题】:AWS Elastic Beanstalk Python Django S3 Access Denied cannot upload / read file 【发布时间】:2021-05-09 04:43:06 【问题描述】:

我已经在 AWS Elastic Beanstalk 上部署了 Python Django 服务器。 这就是我的settings.py 文件的样子:

# aws settings
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME')
AWS_DEFAULT_ACL = None
AWS_S3_CUSTOM_DOMAIN = f'AWS_STORAGE_BUCKET_NAME.s3.amazonaws.com'
AWS_S3_OBJECT_PARAMETERS = 'CacheControl': 'max-age=86400'
# s3 static settings
STATIC_URL = '/staticfiles/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
# s3 public media settings
PUBLIC_MEDIA_LOCATION = 'media'
MEDIA_URL = f'https://AWS_S3_CUSTOM_DOMAIN/PUBLIC_MEDIA_LOCATION/'
DEFAULT_FILE_STORAGE = 'hello_django.storage_backends.PublicMediaStorage'
# s3 private media settings
PRIVATE_MEDIA_LOCATION = 'private'
PRIVATE_FILE_STORAGE = 'hello_django.storage_backends.PrivateMediaStorage'

在 AWS 中,我创建了具有 AmazonS3FullAccess 权限的 IAM 用户,并在设置中使用了他的 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY。

问题是,当我尝试从文件链接读取媒体文件时,我总是收到“Access denied”错误,即使我指定 PublicMediaStorage 并授予 S3 存储桶上的所有公共访问权限。 p>

另外,当我上传文件时,存储桶中的文件夹(例如“媒体”)不会被创建。

你知道可能是什么问题吗?

【问题讨论】:

【参考方案1】:

如何将 IAM 角色分配给 Elastic BeanStalk 的 IAM 实例配置文件?使用 IAM 角色比在代码中提交 AWS_KEYS 更安全。

见-

How can I access an Amazon S3 bucket from an application running on an Elastic Beanstalk instance? How can I grant users the minimum set of Amazon S3 permissions required to access an Elastic Beanstalk environment?

第一个链接的内容-

验证您的实例配置文件的权限

    打开 Elastic Beanstalk 控制台。 选择您的环境。 从导航菜单中,选择配置。 在“配置概览”部分的“类别”列中,为“安全性”选择“修改”。 在 IAM 实例配置文件菜单中,记下您的实例配置文件的名称。 打开 IAM 控制台。 在导航窗格中,选择角色。 在搜索框中,输入步骤 5 中的实例配置文件的名称。 验证步骤 8 中的角色是否具有您要访问的存储桶所需的 Amazon S3 权限。

验证 S3 存储桶的权限

    打开 Amazon S3 控制台。 从存储桶列表中,选择具有您要更改的存储桶策略的存储桶。 选择“权限”选项卡。 选择存储桶策略。 搜索“效果”:“拒绝”语句。 在您的存储桶策略中,编辑或删除任何拒绝 IAM 实例配置文件访问您的角色的“Effect”:“Deny”语句。

【讨论】:

我有同样的问题,即使是具有管理员访问权限的 IAM 实例角色。如果我不关闭“阻止公共访问”,则没有任何效果。有什么想法吗? 您可以尝试“公开”您想要提供访问权限的目录吗? 我不确定你的意思。你能解释一下怎么做吗? @OmarDulaimi 尝试使用django-storages,它非常适合 S3 和 Django 应用程序

以上是关于AWS Elastic Beanstalk Python Django S3 Access Denied 无法上传/读取文件的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk CLI 安装错误

text AWS Elastic Beanstalk

HTTPS Elastic Beanstalk (AWS) 到 Android

AWS Elastic Beanstalk 无法担任角色

AWS Elastic Beanstalk

AWS Elastic Beanstalk chown PythonPath 错误