首页 > 解决方案 > 调用 PutBucketAcl 操作时发生错误 (InvalidArgument):未知

问题描述

调用 boto3.client 的 put_bucket_acl(**kwargs) 方法设置存储桶 acl 时出现此异常。(PS:它是一桶ceph对象而不是aws)


我的代码:

import boto3
import copy

s3_client = boto3.client('s3', 
        aws_access_key_id=s3_conf['ak'], 
        aws_secret_access_key=s3_conf['sk'], 
        endpoint_url=s3_conf["host"])
bucket_acl = s3.BucketAcl(test_bucket)
bucket_acl.grants.append(new_grants)
bucket_acl.put(ACL='private', AccessControlPolicy={'Grants': bucket_acl.grants, 'Owner': bucket_acl.owner})

我也尝试 Session.client:

session = Session(s3_conf["ak"], s3_conf["sk"])
s3 = session.resource("s3", endpoint_url=s3_conf["host"])
s3_client = session.client("s3", endpoint_url=s3_conf["host"])

rsp = s3_client.get_bucket_acl(Bucket=test_bucket)
old_access_control_policy = { 'Grants': copy.deepcopy(rsp['Grants']), 'Owner': copy.deepcopy(rsp['Owner']) }
new_access_control_policy = copy.deepcopy(old_access_control_policy)
new_access_control_policy['Grants'].append(new_grants)
s3_client.put_bucket_acl(Bucket=test_bucket, ACL='private', AccessControlPolicy=old_access_control_policy)

如果我删除参数 AccessControlPolicy,它运行成功

s3_client.put_bucket_acl(Bucket=test_bucket, ACL='private')

我是否以错误的方式调用此方法?但是该指南也以相同的方式调用此方法:https : //boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.put_bucket_acl 认为有任何帮助。

标签: amazon-s3boto3botocore

解决方案


可以像这样设置存储桶 acl:

s3_client.put_bucket_acl(Bucket=test_bucket, AccessControlPolicy={...})

ACL 和 AccessControlPolicy 是 AccessControlList,参数 AccessControlList 只能是以下之一:ACL、AccessControlPolicy、Bucket、ContentMD5、GrantFullControl、GrantRead、GrantReadACP、GrantWrite、GrantWriteACP。后来我需要阅读botocore的代码,找出ceph s3和amazon s3的区别。为阅读而思考。


推荐阅读