我正在使用下面的boto3代码将新标签添加到S3存储桶中,而不会删除现有标签。
s3 = boto3.resource('s3')
bucket_tagging = s3.BucketTagging('bucket_name')
tags = bucket_tagging.tag_set
tags.append({'Key':'Owner', 'Value': owner})
Set_Tag = bucket_tagging.put(Tagging={'TagSet':tags})
这将获取现有标签,添加一个新标签,然后将它们全部放回。
但是,如果我的存储桶包含“ aws:”作为前缀,则会出现以下错误: '调用CreateTags操作时发生错误(InvalidParameterValue):参数密钥的值(aws:cloudformation:stack-name)无效。以'aws:'开头的标记键仅供内部使用。'
在这种情况下,如何使用boto3添加新标签而不删除现有标签?
答案 0 :(得分:0)
我发现,虽然不能使用以“ aws:”开头的键添加新标签,但可以将现有标签以及新标签放回原处,没有例外。 这是我使用的测试代码;替换存储桶名称,并根据需要添加区域:
#!/usr/bin/env python3
import boto3
tag_data = [{'Key':'Owner', 'Value': "my owner tag here"}]
bucket_name = "mybucket"
print (f"Updating tags in bucket: {bucket_name}")
s3 = boto3.resource('s3')
try:
bucket_tagging = s3.BucketTagging( bucket_name)
tags = bucket_tagging.tag_set
for tag in tags:
# Avoid error by not adding duplicate keys from current tag list.
key_test = tag.get("Key")
Found=False
for new_tag in tag_data:
if new_tag.get("Key") == key_test:
found=True
if not found:
tag_data.append(tag)
except Exception as error:
print ("Error getting tags: ", error)
print ("Setting new tag set to: ", tag_data)
response = bucket_tagging.put(
Tagging={
'TagSet': tag_data
}
)
if response is not None and response['ResponseMetadata']['HTTPStatusCode'] == 204:
print ("success")
else:
print (f"Warning, unable to update tags for bucket: {bucket_name}")