2016-01-20 163 views
0

我正在尋找使用boto/boto3修改S3存儲桶策略。我在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. 

我在尋找可以添加更多屬性的更新存儲桶策略。

例如。我想在下面的策略的Statement key下添加一個條目。

{ 
    "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中添加條目,然後將其作爲新策略添加,但我正在尋找允許用戶在不知道退出策略的情況下更新策略的調用。

回答

1

IAM不提供更新策略的方法,但不提供整個有效的策略作爲替換。您需要執行PUT,傳入原始策略名稱。

0

當前boto3 API沒有追加存儲桶策略的功能,無論是添加其他項目/元素/屬性。你需要自己加載和操作JSON。例如。編寫腳本將策略加載到字典中,附加「Statement」元素列表,然後使用policy.put替換整個策略。如果沒有原始語句ID,則會附加用戶策略。但是,無法判斷後來的用戶策略是否會覆蓋較早的用戶策略。

例如

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

您需要Client()來調用get_bucket_policy。 – user615501

相關問題