2016-07-14 7 views
0

Wie benutzt man put_bucket_policy()? Es wirft ein MalformedPolicy Fehler, auch wenn ich in einer bestehenden gültigen Politik zu passieren versuchen:python aws put_bucket_policy() MalformedPolicy

import boto3 
client = boto3.client('s3') 
dict_policy = client.get_bucket_policy(Bucket = 'my_bucket') 
str_policy = str(dict_policy) 
response = client.put_bucket_policy(Bucket = 'my_bucket', Policy = str_policy) 

* Fehlermeldung: *

botocore.exceptions.ClientError: An error occurred (MalformedPolicy) when calling the PutBucketPolicy operation: This policy contains invalid Json 

Antwort

0

das, weil ist str zu einem dict ihre Anwendung lässt sich nicht einschalten in einen gültigen json verwenden json.dumps statt:

import boto3 
import json 
client = boto3.client('s3') 
dict_policy = client.get_bucket_policy(Bucket = 'my_bucket') 
str_policy = json.dumps(dict_policy) 
response = client.put_bucket_policy(Bucket = 'my_bucket', Policy = str_policy) 
+0

danke - erhielt den folgenden Fehler: botocore.exceptions.ClientError: Beim Aufruf der Operation PutBucketPolicy ist ein Fehler aufgetreten (MalformedPolicy): Unbekanntes Feld Richtlinie " –

+0

Wie ist dieser Fehler möglich, da ich die Richtlinie aus einem gültigen Bucket abgerufen habe ? –

0

Aktuelle boto3 API hat keine Funktion APP BEENDEN Sie die Bucket-Richtlinie, indem Sie weitere Elemente/Elemente/Attribute hinzufügen. Sie müssen den JSON selbst laden und manipulieren. Z.B. Skript schreiben Laden Sie die Richtlinie in ein dict, hängen Sie die Elementliste "Statement" an und verwenden Sie policy.put, um die gesamte Richtlinie zu ersetzen. Ohne die ursprüngliche Anweisungs-ID wird die Benutzerrichtlinie angehängt. Es gibt jedoch keine Möglichkeit zu sagen, ob die spätere Benutzerrichtlinie die Regeln des vorherigen außer Kraft setzt.

Zum Beispiel

import boto3 
s3_conn = boto3.resource('s3') 
bucket_policy = s3_conn.BucketPolicy('bucket_name') 
policy = s3_conn.get_bucket_policy(Bucket='bucket_name') 
user_policy = { "Effect": "Allow",... } 
new_policy = policy['Statement'].append(user_policy) 
bucket_policy.put(Policy=new_policy) 

Der Benutzer brauchen nicht auf die alte Politik im Prozess kennen.

Verwandte Themen