Rah*_* KP 6 amazon-s3 boto amazon-web-services boto3
我正在寻找使用 boto/boto3 修改 S3 存储桶策略。我在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.
Run Code Online (Sandbox Code Playgroud)
我正在寻找更新存储桶策略,我可以在其中添加更多属性。
例如。我想在以下策略的声明键下再添加一个条目。
{
"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/*"
}]
}
Run Code Online (Sandbox Code Playgroud)
有没有直接的方法可以做到这一点。一种非常奇怪的方法是在 JSON 中添加条目,然后将其作为新策略,但我正在寻找允许用户在不知道现有策略的情况下更新策略的调用。
小智 6
我有类似的要求,必须以编程方式修改存储桶和 KMS 策略。我想出了我自己的类,它将策略和语句视为对象。它包含在 pip 包“awspolicy”中 - https://github.com/totoleon/AwsPolicy
我希望它能有所帮助。快速示例:
import boto3
from awspolicy import BucketPolicy
s3_client = boto3.client('s3')
bucket_name = 'hailong-python'
# Load the bucket policy as an object
bucket_policy = BucketPolicy(serviceModule=s3_client, resourceIdentifer=bucket_name)
# Select the statement that will be modified
statement_to_modify = bucket_policy.select_statement('AutomatedRestrictiveAccess')
# Insert new_user_arn into the list of Principal['AWS']
new_user_arn = 'arn:aws:iam::888888888888:user/daniel'
statement_to_modify.Principal['AWS'].append(new_user_arn)
# Save change of the statement
statement_to_modify.save()
# Save change of the policy. This will update the bucket policy
statement_to_modify.source_policy.save() # Or bucket_policy.save()
Run Code Online (Sandbox Code Playgroud)
当前的 boto3 API 没有 APPEND 存储桶策略的功能,无论是否添加其他项目/元素/属性。您需要自己加载和操作 JSON。例如,编写脚本将策略加载到字典中,附加“Statement”元素列表,然后使用policy.put 替换整个策略。如果没有原始语句 ID,将附加用户策略。然而,无法判断后续的用户策略是否会覆盖早期的规则。
例如
import boto3
s3_resource = boto3.resource('s3')
bucket_policy = s3_resource.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)
Run Code Online (Sandbox Code Playgroud)
用户在此过程中不需要了解旧的策略。
| 归档时间: |
|
| 查看次数: |
12850 次 |
| 最近记录: |