5
votes

[Django] [AWS S3] botocore.exceptions.clienterror une erreur s'est produite (accessdenied) lors de l'appel de l'opération PutObject

J'essaie de connecter le projet Django à AWS S3.

settings.py contient ci-dessous:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Allow All",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::<bucket name>/*"
        }
    ]
}

L'utilisateur IAM est créé avec AmazonS3FullAccess. Mais lorsque j'entre:

python manage.py collectstatic

une erreur se produit:

Vous avez demandé à collecter des fichiers statiques à la destination lieu tel que spécifié dans vos paramètres.

Cela écrasera les fichiers existants! Êtes-vous sûr de vouloir faire cela?

Tapez «oui» pour continuer ou «non» pour annuler: oui Traceback (dernier appel le plus récent): Fichier "manage.py", ligne 22, dans execute_from_command_line (sys.argv) Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/django/core/management/ init .py", ligne 381, dans execute_from_command_line Utility.execute () Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/django/core/management/ init .py", ligne 375, en cours d'exécution self.fetch_command (sous-commande) .run_from_argv (self.argv) Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/django/core/management/base.py", ligne 316, dans run_from_argv self.execute (* args, ** cmd_options) Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/django/core/management/base.py", ligne 353, en cours d'exécution output = self.handle (* args, ** options) Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", ligne 188, dans la poignée collecté = self.collect () Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", ligne 114, en collecte handler (chemin, prefixed_path, stockage) Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", ligne 353, dans copy_file self.storage.save (prefixed_path, source_file) Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/django/core/files/storage.py", ligne 49, en sauvegarde return self._save (nom, contenu) Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/storages/backends/s3boto3.py", ligne 506, dans _save self._save_content (obj, contenu, paramètres = paramètres) Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/storages/backends/s3boto3.py", ligne 521, dans _save_content obj.upload_fileobj (contenu, ExtraArgs = put_parameters) Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/boto3/s3/inject.py", ligne 621, dans object_upload_fileobj ExtraArgs = ExtraArgs, Callback = Callback, Config = Config) Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/boto3/s3/inject.py", ligne 539, dans upload_fileobj retourne future.result () Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/futures.py", ligne 106, par conséquent retourne self._coordinator.result () Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/futures.py", ligne 265, par conséquent élever self._exception Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/tasks.py", ligne 126, en appel retourne self._execute_main (kwargs) Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/tasks.py", ligne 150, dans _execute_main return_value = self._main (** kwargs) Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/s3transfer/upload.py", ligne 692, dans _main client.put_object (Bucket = bucket, Key = key, Body = body, ** extra_args) Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/botocore/client.py", ligne 357, dans _api_call retourne self._make_api_call (operation_name, kwargs) Fichier "/home/seokchan/server/mdocker/lib/python3.5/site-packages/botocore/client.py", ligne 661, dans _make_api_call lever error_class (parsed_response, operation_name) botocore.exceptions.ClientError: Une erreur s'est produite (AccessDenied) lors de l'appel de l'opération PutObject: Accès refusé

J'ai donc modifié la politique du bucket:

AWS_ACCESS_KEY_ID = #ID
AWS_SECRET_ACCESS_KEY = #Key
AWS_STORAGE_BUCKET_NAME = #Bucket
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'static'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'backend/static'),
]
STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

mais l'erreur s'est toujours produite. Comment puis-je résoudre cette erreur?

Un didacticiel que je suis ne montre aucune erreur à cette étape. ( https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup- amazon-s3-dans-un-projet-django.html )


0 commentaires

4 Réponses :


7
votes

C'était un problème d'accès à AWS S3.

Dans la console du compartiment S3, j'ai modifié l'accès public du compartiment en tant que public.


3 commentaires

Pouvez-vous s'il vous plaît élaborer ... Je suis confronté à un problème similaire.


Quels sont les problèmes de sécurité potentiels liés à cette opération?


@virus sur l'onglet Autorisations -> cliquez sur Bloquer l'accès public -> Modifier -> décochez Bloquer tout accès public - > Enregistrer



2
votes

Le paramètre AWS_DEFAULT_ACL = None a fonctionné pour moi. Cela ressemble à boto demande une ACL public-read par défaut, donc à moins que vous n'ayez rendu votre bucket public, cela ne fonctionnera pas.


0 commentaires

0
votes

Par défaut, lorsque vous créez un nouveau bucket, tous les accès publics des objets s3 sont bloqués (il est coché par défaut). c'est-à-dire que vous ne pouvez pas accéder aux objets (lecture, écriture) via les API ou applications publiques (comme les applications django). Ainsi, si vous souhaitez accéder aux objets s3 dans le compartiment particulier, vous devez définir l'autorisation pour qu'elle soit accessible publiquement (voir la section d'autorisation du compartiment). Pour un contrôle supplémentaire, vous pouvez ajouter des utilisateurs ACL (liste de contrôle d'accès) à partir de la section ACL.

vous pouvez vous référer à ce lien


0 commentaires

1
votes

Cela a fonctionné pour moi:

Dans mon compartiment S3 -> Onglet Autorisations -> cliquez sur Bloquer l'accès public -> Modifier -> décochez Bloquer tout accès public -> Enregistrer

ET

Dans mes paramètres AWS IAM -> Onglet Utilisateurs (sous Gestion de l'accès) -> -> Ajouter des autorisations -> ajouter AmazonS3FullAccess

Cela a accordé à l'utilisateur (identifié par l'identifiant AWS et le secret AWS) l'accès pour contrôler mes buckets s3


0 commentaires