拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 从DjangoWebApp中洗掉AWSS3物件时出错

从DjangoWebApp中洗掉AWSS3物件时出错

白鹭 - 2022-01-25 2079 0 0

当我尝试从 Python/Django Webapp 中洗掉 S3 档案时出现以下错误。

ClientError at /eq83/deletephoto
An error occurred (AccessDenied) when calling the DeleteObject operation: Access Denied

我查看或上传档案没有问题。

桶权限的一些细节

所有block public access框都未选中。

Bucket policy 是空的,说 No policy to display.

访问控制串列 (ACL) 已选中所有框bucket owner,其余未选中。

这就是跨域资源共享(CORS)

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "POST",
            "PUT",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

我的申请的一些细节

以下是我settings.py档案的摘录我已经屏蔽了密钥并省略了 TEMPLATES、MIDDLEWARE 和一些 INSTALLED_APPS


import os
import dotenv
dotenv.read_dotenv()

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXX'

DEBUG = True

ALLOWED_HOSTS = ["*"]


INSTALLED_APPS = [
'tracker.apps.TrackerConfig',
...
'storages'
]

WSGI_APPLICATION = 'tracker_django.wsgi.application'


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

STATIC_URL = '/static/'

STATICFILES_DIRS = [os.path.join(BASE_DIR,'tracker', 'static')]

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY', '')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_KEY', '')

AWS_STORAGE_BUCKET_NAME = 'tracker-django-files'

AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = "public-read"

AWS_QUERYSTRING_AUTH = False

这是我如何洗掉views.py.

def remove_eq_files(request, file_id):
    try:
        eq_file = EqFile.objects.get(pk=file_id)
        eq_id=eq_file.eq.id
    except KeyError:
        return render(request, "jobs/error.html", {"message": "No Selection"})
    except EqFile.DoesNotExist:
        return render(request, "jobs/error.html", {"message": "Invalid File Selection. Contact Admin"})
    #delete file in S3
    eq_file.eq_file.delete(save=False) 
    #delete file in django
    eq_file.delete() 
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

最后这是models.py档案中的代码片段


class Eq(models.Model):
    name = models.CharField(max_length=128, blank=False)

def eq_file_path(instance, filename):
    try:
        eq=instance.eq
        path= "eq/" eq.name  "_" str(eq.pk) "/eq_folder/" filename
        return path

class EqFile(models.Model):
    eq_file=models.FileField(max_length=500, null=True, blank = True, upload_to = eq_file_path)
    file_url=models.URLField(max_length=500, null=True, blank=True)
    file_name = models.CharField(max_length=256, null=True, blank=True)
    eq= models.ForeignKey(Eq, null=True, on_delete=models.CASCADE, blank=True, related_name="eq_file")
    def filename(self):
        return os.path.basename(self.model_file.name)

我有一个更有经验的人设定了 s3 并帮助我集成它,并且已经运行了一年多,包括洗掉物件,我想我上次测验是在 4 周前左右。我发现洗掉似乎不再起作用很奇怪,并认为亚马逊可能改变了洗掉 s3 物件的作业方式。或者也许我无意中更改了 Python 端的一些代码并将其搞砸了。

(请注意,客户尚未使用此软件,我知道这些设定可能不适合部署。)

任何帮助将大大感激!

uj5u.com热心网友回复:

我最终实施的一种解决方案是设定一个 IAM 用户,授予该 IAM 编辑存盘桶的权限,然后将 IAM 凭证添加到程序中。

设定 IAM

  1. 打开 AWS 控制台,使用搜索栏打开“IAM”
  2. 在“访问管理”下选择左侧的“用户”并创建一个新的 IAM 用户。 重要提示:将安全凭证(访问密钥和密钥)保存在某处并保存用户 ARN
  3. 单击右侧的“ 添加行内策略”并使用以下代码创建一个新策略,但替换BUCKETS!!!为您的存盘桶名称。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:ListBucketVersions",
                "s3:GetBucketLocation",
                "s3:Get*",
                "s3:Put*",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::BUCKETS!!!",
                "arn:aws:s3:::BUCKETS!!!/*"
            ]
        }
    ]
}

授予 IAM 编辑存盘桶的权限

  1. 在 AWS 打开 S3(通过搜索栏或选单)并单击左侧的存盘桶
  2. 单击要修改的存盘桶,然后单击“权限”选项卡
  3. 向下滚动到“存盘桶策略”,点击编辑,然后粘贴下面的代码,除了替换USERARN!!!为您之前在 IAM 管理控制台中保存的用户 ARN 并替换BUCKETS!!!为您的存盘桶的名称。
{
    "Version": "2012-10-17",
    "Id": "Policy1488494182833",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "USERARN!!!"
            },
            "Action": [
                "s3:ListBucket",
                "s3:ListBucketVersions",
                "s3:GetBucketLocation",
                "s3:Get*",
                "s3:Put*",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::BUCKETS!!!",
                "arn:aws:s3:::BUCKETS!!!/*"
            ]
        }
    ]
}

现在任何拥有 IAM 登录凭证的人都可以操作存盘桶。

将 IAM 凭证添加到程序中。

由于我的项目是一个 Django 项目,我使用的是 boto3 并且我settings.py通过简单地添加下面的资料来输入凭据,除了替换AK!!!为您之前保存的访问密钥和您之前保存SK!!!的秘密访问密钥。

AWS_ACCESS_KEY_ID = 'AK!!!'
AWS_SECRET_ACCESS_KEY = 'SK!!!'

如果你不使用 Django 框架,我不知道你会怎么做。

感谢 luk2302 提示您设定 IAM 用户。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *