2016-01-20 4 views
0

Я ищу модификацию правил ведра S3 с помощью boto/boto3. Я нашел два режима в boto3, через которые мы можем выполнять операцию по политике ведра.Amazon S3 изменить политику ведра с помощью boto/boto3

# i can get bucket policy object as follows 
import boto3 
s3_conn = boto3.resource('s3') 
bucket_policy = s3_conn.BucketPolicy('bucket_name') 
# i can make put(), load(), policy on bucket_policy object. 

#similar in other way i can use following code 
policy = s3_conn.get_bucket_policy(Bucket='bucket_name') 
# similar to this there are two other calls put_bucket_policy and delete_bucket_policy. 

Я ищу политику обновления bucket, в которой я могу добавить больше атрибутов.

например. Я хочу добавить еще одну запись под ключом Statement из следующей политики.

{ 
    "Version": "2012-10-17", 
    "Id": "Policy14564645656", 
    "Statement": [{ 
     "Sid": "Stmt1445654645618", 
     "Effect": "Allow", 
     "Principal": { 
      "AWS": "arn:aws:iam::6164563645030:root" 
     }, 
     "Action": "s3:Get*", 
     "Resource": "arn:aws:s3:::bucket_name/abc/*" 
    }] 
} 

Есть ли прямой способ сделать это. Один очень странный способ - добавить запись в JSON, а затем PUT это как новую политику, но я ищу вызов, который позволяет пользователю обновлять политику, не зная выхода из политики.

ответ

1

IAM не предоставляет способ обновления политики без предоставления целой, действующей политики в качестве замены. Вам нужно выполнить PUT, передав исходное имя политики.

0

В настоящее время API boto3 не имеет функции ПРИЛОЖИТЬ политику ведра, добавляйте ли другие элементы/элементы/атрибуты. Вам нужно загрузить и управлять самим JSON. Например. write script загружает политику в dict, добавляет список элементов «Statement», а затем используйте policy.put для замены всей политики. Без исходного идентификатора оператора будет добавлена ​​политика пользователя. ОДНАКО, нет способа определить, переопределит ли более поздняя политика пользователя правила предыдущих.

Например

import boto3 
s3_re = boto3.resource('s3') 
bucket_policy = s3_res.BucketPolicy('bucket_name') 

# Or use client to get Bucket policy 
s3_client = boto3.client('s3') 
policy = s3_client.get_bucket_policy(Bucket='bucket_name') 

# assign policy using s3 resource 
user_policy = { "Effect": "Allow",... } 
new_policy = policy['Statement'].append(user_policy) 
bucket_policy.put(Policy=new_policy) 

Пользователь не нужно знать старую политику в этом процессе.

+0

Для вызова get_bucket_policy необходим клиент(). – user615501